我似乎对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;
}
Run Code Online (Sandbox Code Playgroud)
有什么表现?"失败!:("
如果我删除此检查,我会看到一个文件对话框.但是,它不起作用,并且文件名框预先填充了随机垃圾.
如果我改为:
if(!GetOpenFileNameA(&fm))
{
DWORD dwErr = CommDlgExtendedError();
MessageBoxA(NULL, "failed! :(", NULL, NULL);
}
Run Code Online (Sandbox Code Playgroud)
"失败!:("未显示.文件对话框显示并执行没有问题.
到底是怎么回事!?!?
OPENFILENAME fm;
char flnm[MAX_PATH]; // nobody initialized me ...
ZeroMemory(&fm, sizeof(fm));
fm.lStructSize = sizeof(OPENFILENAME);
fm.hwndOwner = NULL;
fm.lpstrFilter = "Text Files (*.txt)\0*.txt\0";
fm.lpstrFile = flnm; // ... who knows what I am?
fm.nMaxFile = MAX_PATH;
fm.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
fm.lpstrDefExt = "";
if(!GetOpenFileNameA(&fm))
{
MessageBoxA(NULL, "failed! :(", NULL, NULL);
}
Run Code Online (Sandbox Code Playgroud)
该文档的lpstrFile状态:
用于初始化文件名编辑控件的文件名.如果不需要初始化,则此缓冲区的第一个字符必须为NULL.当GetOpenFileName或GetSaveFileName函数成功返回时,此缓冲区包含驱动器指示符,路径,文件名和所选文件的扩展名.
你没有初始化flnm,其中存在问题.您可以flnm[0] = '\0'在致电前写下来解决问题GetOpenFileName.