【发布时间】:2016-11-27 10:41:42
【问题描述】:
我正在尝试创建一个从OPENFILENAME 对话框获取文件路径的函数。我的代码看起来像这样。
wstring src;
bool open()
{
const string title = "Select a File";
wchar_t filename[MAX_PATH];
OPENFILENAMEA ofn;
ZeroMemory(&filename, sizeof(filename));
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = "Music (.mp3)\0*.mp3\0All\0*.*\0";
ofn.lpstrFile = LPSTR(filename);
ofn.nMaxFile = MAX_PATH;
ofn.lpstrTitle = title.c_str();
ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST;
if (GetOpenFileNameA(&ofn))
{
src = filename; //<----------Save filepath in global variable
return true;
}
return false;
}
在注释行放置断点后,我可以检查“src”和“文件名”的值,在这一点上,对我来说,它们是无法识别的亚洲字母。为什么会这样?这是转换问题吗?
编辑:
感谢快速回复和一些 cmets,代码现在可以正常运行。感谢 Hans Passant 提供了一个非常直接的解决方案,也非常感谢 Cody Gray 重写了函数,解释了错误,并给了我如何处理它的教训。由于我仍在迈出学习 winapi 的第一步,因此这些信息将在以后的课程中为我提供很好的帮助。
【问题讨论】:
-
尝试
char filename[MAX_PATH];而不是 wchar_t -
LPSTR 演员阵容非常邪恶,它阻止了编译器告诉你你做错了。然而并没有阻止你做错事。请改用 OPENFILENAMEW 和 GetOpenFileNameW,使用 L"blabla" 生成宽字符串文字。
-
'GetOpenFileNameA' 是 'GetOpenFileName' 的 ANSI 子函数,因此您应该检查您的代码是否构建为 Unicode。并且你应该使用'GetOpenFileName'而不是'GetOpenFileNameA',好的子功能的选择会自动完成。
标签: c++ getopenfilename