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

C++中使用WinAPI的GetOpenFileName获取文件路径仅返回单个字符问题

问题原因与解决办法

你遇到的问题核心是宽字符与窄字符不匹配:

  • 你使用的是宽字符版本的WinAPI(LPWSTR即wchar_t*,对应GetOpenFileNameW),但输出时误用了针对窄字符(char*)的printf和%s格式符。宽字符串每个字符占2字节,比如路径开头的C存储为0x0043,printf读到第二个字节的0x00就会认为字符串结束,所以只输出单个字符C。

解决办法1:直接用宽字符输出

把printf替换为宽字符输出函数wprintf,格式符改用%ls:

if (GetOpenFileName(&ofn) == TRUE)
{
    wprintf(L"File name: %ls\n", ofn.lpstrFile);
}

解决办法2:转换为窄字符串输出

如果需要用窄字符格式输出,可通过WideCharToMultiByte将宽字符串转成UTF-8编码的窄字符串:

if (GetOpenFileName(&ofn) == TRUE)
{
    // 计算转换所需缓冲区大小
    int bufSize = WideCharToMultiByte(CP_UTF8, 0, ofn.lpstrFile, -1, nullptr, 0, nullptr, nullptr);
    char* narrowPath = new char[bufSize];
    WideCharToMultiByte(CP_UTF8, 0, ofn.lpstrFile, -1, narrowPath, bufSize, nullptr, nullptr);

    printf("File name: %s\n", narrowPath);
    delete[] narrowPath; // 记得释放内存
}

额外注意事项

  • 内存泄漏:你用new分配的fileBuffer,使用完后要调用delete[] fileBuffer释放。
  • 结构体大小:在UNICODE编译环境下,sizeof(OPENFILENAME)等价于sizeof(OPENFILENAMEW),你的代码这部分是正确的。

内容的提问来源于stack exchange,提问作者x_a1r_x

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:31:14