非常奇怪的GetOpenFileName问题

Very strange GetOpenFileName problem

本文关键字:GetOpenFileName 问题 非常      更新时间:2023-10-16

我似乎有一个非常奇怪的问题与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)*.txt";
    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);
}

"失败!没有显示。文件对话框显示和执行没有问题。

发生什么事了? ? ?

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)*.txt";
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的文档说明:

用于初始化"文件名"编辑控件的文件名。如果不需要初始化,这个缓冲区的第一个字符必须为NULL。当GetOpenFileName或GetSaveFileName函数成功返回时,该缓冲区包含所选文件的驱动器标识符、路径、文件名和扩展名。

您没有初始化flnm,这就是问题所在。您可以通过在调用GetOpenFileName之前写入flnm[0] = ''来解决这个问题。