【发布时间】:2011-09-12 18:23:42
【问题描述】:
GetOpenFileName 似乎有一个非常奇怪的问题。
它没有明显的原因出错,但是,如果我在错误检查中调用CommDlgExtendedError(),则错误一开始就不会发生。
这是我的代码:
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
OPENFILENAME fm;
char flnm[MAX_PATH];
ZeroMemory(&fm, sizeof(fm));
fm.lStructSize = sizeof(OPENFILENAME);
fm.hwndOwner = NULL;
fm.lpstrFilter = "Text Files (*.txt)\0*.txt\0";
fm.lpstrFile = flnm;
fm.nMaxFile = MAX_PATH;
fm.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
fm.lpstrDefExt = "";
if(!GetOpenFileNameA(&fm))
{
MessageBoxA(NULL, "failed! :(", NULL, NULL);
}
return 0;
}
显示了什么? “失败!:(”
如果我删除此检查,我会看到一个文件对话框。但是,它不起作用,并且文件名框预先填充了随机垃圾。
如果我改为:
if(!GetOpenFileNameA(&fm))
{
DWORD dwErr = CommDlgExtendedError();
MessageBoxA(NULL, "failed! :(", NULL, NULL);
}
“失败!:(”未显示。文件对话框显示并执行没有问题。
这是怎么回事!?!?
【问题讨论】:
-
我没有看过你的代码,但是当更改内存布局修复错误时,这通常意味着错误指针或溢出等错误
-
这可能是因为
fm充满了垃圾。 -
由于您似乎没有将其编辑为更好的问题,因此我将给您一个重要提示而不是答案:
fm.lpstrFile必须为空终止。