在调试模式下编译时,GetOpenFileName永远不会返回(VS2010)

时间:2011-11-10 12:34:11

标签: c visual-studio-2010 winapi getopenfilename visual-leak-detector

当我在调试模式下编译我的程序时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项目中重现相同的错误,但我不能。有用。在项目设置上有差异,并且没有任何市长差异。

3 个答案:

答案 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_PATHsizeof(szFile) / sizeof(TCHAR).

4)您在文件过滤器中缺少'*':应为* .jpg

答案 2 :(得分:2)

我终于找到了构建之间的唯一区别:

我在调试版本中使用Visual Leak Detector。删除后,它开始工作。

我会尽力找到原因,但我只想感谢每一个试图帮助我的人。我希望我可以奖励更多积分。

有更多人遇到类似问题: