C++ C++;获取OpenFileName时出现WinAPI错误

C++ C++;获取OpenFileName时出现WinAPI错误,c++,winapi,visual-studio-2012,C++,Winapi,Visual Studio 2012,你好。我制作了一个用于OpenFileDialog的类: #include <Windows.h> enum DialogResult { OK, Cancel }; class IFileDialog { public: TCHAR FileName[MAX_PATH]; LPTSTR Title; virtual DialogResult Show() = 0; }; class COpenFileDialog : public IFileDia

你好。我制作了一个用于OpenFileDialog的类:

#include <Windows.h>

enum DialogResult { OK, Cancel };

class IFileDialog
{
public: 
    TCHAR FileName[MAX_PATH];
    LPTSTR Title;
    virtual DialogResult Show() = 0;
};

class COpenFileDialog  : public IFileDialog
{
public:
    LPTSTR Filter;
    LPTSTR DefExt;
    COpenFileDialog(HWND hWnd);
    DialogResult Show();
private:
    OPENFILENAME m_ofn;
};

COpenFileDialog::COpenFileDialog(HWND hWnd)
{
    //FileName[0] = '\0';

    ZeroMemory(&m_ofn, sizeof(m_ofn));

    m_ofn.lStructSize = sizeof(m_ofn);
    m_ofn.hwndOwner = hWnd;
    m_ofn.lpstrFilter = Filter;
    m_ofn.nMaxFile = MAX_PATH;
    m_ofn.lpstrFile = FileName;
    m_ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
    m_ofn.lpstrDefExt = DefExt;
}

DialogResult COpenFileDialog::Show()
{
    return GetOpenFileName(&m_ofn) ? DialogResult::OK : DialogResult::Cancel;
}
但该程序只支持hDialog.Show(),而不是调用ScoEditor.exe中0x000007FDFC5D21A3(SHCore.dll)处的GetOpenFileName(&m_of n):未处理异常:0xC000005:访问冲突读取位置0x000000e6000000


如何修复它?

您的构造函数执行
m_of n.lpstrFilter=Filter,但过滤器
尚未初始化。稍后,您的代码将修改
过滤器
,但无法更新n.lpstrFilter的
m_中的值
。因此,您正在将未初始化的
lpstrFilter
传递给
GetOpenFileName


如果通过在调用
GetOpenFileName
时设置断点并查看要传递的
m_of n
的内容来调试代码,您就会发现这一点。

这不是问题所在,但请注意,您正在将字符串文本分配给非常量
char
指针。最好将
Filter
deext
Title
的类型更改为
LPCTSTR
,以避免意外写入它们。
COpenFileDialog hDialog = COpenFileDialog(hMainWindow);
hDialog.Filter = "M&B Scenes\0*.sco\0";
hDialog.DefExt = "sco";
hDialog.Title = "";

if(hDialog.Show() == DialogResult::OK)
{
    //TODO
}