当我在调试模式下编译我的程序时GetOpenFileName(&ofn)
永远不会返回。
在发布模式下完美运行。我能发现的唯一区别是在发布模式下很多东西都被优化了。
OPENFILENAME ofn;
TCHAR szFile[MAX_PATH];
szFile[0] = '\0';
szFile[1] = '\0';
//Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = TEXT("Images (*.jpg;*.png;*.bmp;*.tga;*.psd)\0*.jpg;*.png;*.bmp;*.tga;*.psd\0\0");
ofn.lpstrInitialDir = TEXT(".");
ofn.lpstrTitle = TEXT("Open 512x512 image");
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
...
GetOpenFileName(&ofn)
我正在使用Unicode字符集进行编译。
如果我从\0
的中间删除ofn.lpstrFilter
,它在调试模式下工作,但显然过滤器无法正常运行。
这是\0
点周围调试和释放模式下内存中字符串的样子:
...snip...
0x00364BB4 70 00 p.
0x00364BB6 73 00 s.
0x00364BB8 64 00 d.
0x00364BBA 29 00 ).
0x00364BBC 00 00 ..
0x00364BBE 2e 00 ..
0x00364BC0 6a 00 j.
0x00364BC2 70 00 p.
0x00364BC4 67 00 g.
0x00364BC6 3b 00 ;.
...snip...
我可能正在做一些愚蠢的事情(我没有太多的winapi / w Unicode体验),但我无法弄清楚是什么。有什么想法吗?
编辑:已更新为当前代码。
基本上
ofn.lpstrFilter = TEXT("Images (*.jpg;*.png;*.bmp;*.tga;*.psd)*.jpg;*.png;*.bmp;*.tga;*.psd\0");
^
有效,但
ofn.lpstrFilter = TEXT("Images (*.jpg;*.png;*.bmp;*.tga;*.psd)\0*.jpg;*.png;*.bmp;*.tga;*.psd\0");
^
不
编辑:尝试在新的Visual Studio项目中重现相同的错误,但我不能。有用。在项目设置上有差异,并且没有任何市长差异。
答案 0 :(得分:3)
1 ofn.lpstrFilter
将由两个零终止:\0\0
。
2您确定ZeroMemory()
确实将ofn
的内容归零。您可以尝试使用SecureZeroMemory()
。
参考2 note from msdn:
当你想确保你的数据被及时覆盖时,使用这个[SecureZeroMemory()]函数而不是ZeroMemory,因为一些C ++编译器可以通过完全删除它来优化对ZeroMemory的调用。
我只是使用memset()
。
答案 1 :(得分:2)
一些事情......
1)您正在初始化lpstrFile
两次。
ofn.lpstrFile = szFile;
ofn.lpstrFile = TEXT('\0');
2)你应该初始化szFile
(可能是你在#1中的意图):
TCHAR szFile[MAX_PATH];
szFile[0] = '\0';
3)nMaxFile
应该是CHARACTERS的最大数量,而不是字节。因此,您需要MAX_PATH
或sizeof(szFile) / sizeof(TCHAR).
4)您在文件过滤器中缺少'*':应为* .jpg
答案 2 :(得分:2)
我终于找到了构建之间的唯一区别:
我在调试版本中使用Visual Leak Detector。删除后,它开始工作。
我会尽力找到原因,但我只想感谢每一个试图帮助我的人。我希望我可以奖励更多积分。
有更多人遇到类似问题: