Windows对话框中如何将PWSTR类型转换为char*?
PWSTR转char*仅获取首字符的解决方法
问题原因
PWSTR是Windows定义的wchar_t*别名,属于宽字符字符串(每个字符占2字节)。直接用reinterpret_cast、static_cast或强制转换(char*)转成char*时,宽字符的第二个字节是0值,而char*以0作为字符串结束标志,因此只会读取到第一个字符。
有效解决方法
方法1:使用Windows API WideCharToMultiByte(通用方案)
这是系统提供的标准宽字符转多字节函数,支持指定编码:
#include <windows.h> // 转换PWSTR到char*(返回的内存需手动释放) char* ConvertPWSTRToChar(PWSTR pszFilePath) { // 计算所需缓冲区大小(-1表示自动处理字符串结束符) int bufSize = WideCharToMultiByte(CP_ACP, 0, pszFilePath, -1, nullptr, 0, nullptr, nullptr); if (bufSize == 0) return nullptr; char* pszCharStr = new char[bufSize]; // 执行转换 WideCharToMultiByte(CP_ACP, 0, pszFilePath, -1, pszCharStr, bufSize, nullptr, nullptr); return pszCharStr; } // 使用示例: // char* filePath = ConvertPWSTRToChar(pszFilePath); // 用完后记得释放内存:delete[] filePath;
- 若需要UTF-8编码的
char*,将CP_ACP替换为CP_UTF8即可。
方法2:使用ATL宏CW2A(简化方案,需ATL支持)
如果项目允许使用ATL库,可借助宏快速转换:
#include <atlbase.h> // 转换后得到临时char*,如需持久化需复制到自定义缓冲区 char* tempFilePath = CW2A(pszFilePath);
注意:CW2A返回的指针指向临时内存,不能长期保存,若需要持久使用,需将内容复制到自己分配的缓冲区中。
关键注意事项
- 禁止直接强制转换宽字符指针到
char*,这会导致字符串截断,属于未定义行为。 - 转换时根据需求选择编码:
CP_ACP对应系统默认ANSI编码,CP_UTF8是跨平台通用的UTF-8编码。 - 手动分配内存的转换函数,务必记得释放内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Oliver Clark
相关产品推荐
相关产品推荐

