【发布时间】:2011-11-10 12:34:10
【问题描述】:
当我在调试模式下编译我的程序时,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 字符集进行编译。
如果我从ofn.lpstrFilter 的中间删除\0,它将在调试模式下工作,但显然过滤器无法正常工作。
这是\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 项目中重现相同的错误,但我做不到。有用。对项目设置进行了比较,没有任何市长差异。
【问题讨论】:
-
当您说“GetOpenFileName 永不返回”时,您的意思是对话框出现并正常运行,但是当您单击“确定”或“取消”时会锁定。或者,对话框根本没有出现?
-
@cbranch,它根本没有出现。它似乎处于无限循环中,但由于我没有调试数据,所以我留下了反汇编的数据。没有试图弄清楚它发生了什么,因为它有点痛苦。我很确定由于某种原因它无法解析过滤器,而只是进入一个循环尝试解析它。但我不知道为什么。
-
我们是否可以假设您没有对
ofn进行其他初始化,但您在发布的代码中显示了这一点? -
如果您的过滤器有问题,它不会向我跳出来。最后你有一个额外的(冗余)空终止符,但这没关系。这是编译成 .exe 还是 .dll?您使用的是哪个版本的 Windows?
-
如果将 lpstrInitialDir 设置为 NULL 会发生什么?我不认为我曾经使用过这样的相对路径。我使用 NULL 或完整路径。
标签: c visual-studio-2010 winapi getopenfilename visual-leak-detector