【问题标题】:Very strange GetOpenFileName problem很奇怪的GetOpenFileName问题
【发布时间】: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 必须为空终止。

标签: c++ c winapi


【解决方案1】:
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);
}

lpstrFiledocumentation 声明:

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

您没有初始化flnm,这就是问题所在。你可以在打电话给GetOpenFileName之前写flnm[0] = '\0'来解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    相关资源
    最近更新 更多