You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 02:00:02