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
相关产品推荐
相关产品推荐

