我似乎对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);
}"failed!:(“未显示。文件对话框显示并执行,没有问题。
怎么回事!?!?
发布于 2011-09-13 03:45:27
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);
}lpstrFile的documentation声明:
用于初始化“文件名”编辑控件的文件名。如果不需要初始化,则此缓冲区的第一个字符必须为空。当GetOpenFileName或GetSaveFileName函数成功返回时,此缓冲区包含所选文件的驱动器指示符、路径、文件名和扩展名。
您没有初始化flnm,这就是问题所在。您可以通过在调用GetOpenFileName之前编写flnm[0] = '\0'来解决此问题。
https://stackoverflow.com/questions/7392164
复制相似问题