《C++避坑神器·十四》项目路径获取及WCHAR 和char* 的相互转换

简介: 《C++避坑神器·十四》项目路径获取及WCHAR 和char* 的相互转换

1、获取当前DLL路径

char* getCurPath()
{
    CString path;
    TCHAR curPath[MAX_PATH] = { 0 };
    GetModuleFileName(GetModuleHandle(0), curPath, MAX_PATH);
    int index = CString(curPath).ReverseFind('\\');
    if (index > 0)
    {
        path = CString(curPath).Left(index + 1);
    }
    int len = WideCharToMultiByte(CP_ACP, 0, path, -1, NULL, 0, NULL, NULL);
    char* ptxtTemp = new char[len + 1];
    WideCharToMultiByte(CP_ACP, 0, path, -1, ptxtTemp, len, NULL, NULL);
    return ptxtTemp;
}

2、获取当前工程所在目录的绝对路径

char  buf[256];
WCHAR wszClassName[256];
memset(wszClassName, 0, sizeof(wszClassName));
MultiByteToWideChar(CP_ACP, 0, buf, strlen(buf) + 1, wszClassName,
    sizeof(wszClassName) / sizeof(wszClassName[0]));
GetCurrentDirectory(1000, wszClassName);

特别注意:string在遇到GetCurrentDirectory函数时不能重新赋值,总是报一些奇怪的错误,所以不要把string和GetCurrentDirectory连用,可以用char*代替string。

3、获取解决方案.sln文件路径

#include <windows.h>
#include <direct.h>
#define GetCurrentDir _getcwd
std::string get_current_dir()
{
    char buff[FILENAME_MAX]; // create string buffer to hold path
    GetCurrentDir(buff, FILENAME_MAX);
    string current_working_dir(buff);
    return current_working_dir;
}

4、获取exe或debug路径

#include <windows.h>
std::string get_exe_dir()
{
    char szFilePath[MAX_PATH + 1] = { 0 };
    GetModuleFileNameA(NULL, szFilePath, MAX_PATH);
    (strrchr(szFilePath, '\\'))[0] = 0; 
    string str_path = szFilePath; 
    return str_path;
}

5、WCHAR 和char 的相互转换*

void wchar2strstring(std::string & szDst,WCHAR * wchart)
{
  wchar_t * wtext = wchart;
  DWORD dwNmu = WideCharToMultiByte(CP_OEMCP,NULL,wtext,-1,NULL,0, NULL,FALSE);
  char * psTest;
  psTest = new char[dwNmu];
  WideCharToMultiByte(CP_OEMCP, NULL, wtext, -1, psTest, dwNmu, NULL, FALSE);
  szDst = psTest;
  delete[]psTest;
}
wchar_t* trstring2wchar( const  char *str)
{
  int mystringsize = (int)(strlen(str) + 1);
  WCHAR* wchart = new wchar_t[mystringsize];
  MultiByteToWideChar(CP_ACP,0, str,-1,wchart,mystringsize);
  return wchart;
}


相关文章
|
7月前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
238 7
WK
|
28天前
|
机器学习/深度学习 人工智能 算法
那C++适合开发哪些项目
C++ 是一种功能强大、应用广泛的编程语言,适合开发多种类型的项目。它在游戏开发、操作系统、嵌入式系统、科学计算、金融、图形图像处理、数据库管理、网络通信、人工智能、虚拟现实、航空航天等领域都有广泛应用。C++ 以其高性能、内存管理和跨平台兼容性等优势,成为众多开发者的选择。
WK
63 1
|
2月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
344 3
|
3月前
|
C++
【C++案例】一个项目掌握C++基础-通讯录管理系统
这篇文章通过一个通讯录管理系统的C++项目案例,详细介绍了如何使用C++实现添加、显示、删除、查找、修改和清空联系人等功能。
44 3
|
4月前
|
编译器 C++
VS Code设置C++编译器路径
VS Code设置C++编译器路径
52 0
|
5月前
|
Rust 测试技术 编译器
Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
|
4月前
|
编译器 C++ 开发者
Visual Studio属性表:在新项目中加入已配置好的C++库
通过以上步骤可以确保Visual Studio中新项目成功地加入了之前已配置好的C++库。这个过程帮助开发者有效地管理多个项目中共享的库文件,提升开发效率。
112 0
|
6月前
|
算法 C++
【动态规划】零基础解决路径问题(C++)
【动态规划】零基础解决路径问题(C++)
|
5月前
|
Java C++ 开发者
如何根据项目需求选择使用C++还是Python进行内存管理?
【7月更文挑战第2天】如何根据项目需求选择使用C++还是Python进行内存管理?
48 0
|
6月前
详细解读C++char类型函数
详细解读C++char类型函数
57 0