【问题标题】:How to use CFileDialog correctly如何正确使用 CFileDialog
【发布时间】:2012-11-10 22:34:34
【问题描述】:

我正在开发一个 SDL 应用程序,使用 VS2012,面向 Windows。

我想做以下事情: - 有一个文件打开对话框 - 有一个文件另存为对话框

为此,我实现了一些这样的功能:

#include <afxdlgs.h>
/// This function gets a path to save a file to from the user
/// \return             true if function succeeds, false otherwise
/// \param  pPath       String to save path in
/// \param  name        default file name
/// \param  extensions  default file extensions separated by |
///                     "Text File (*.txt)|*.txt|Document File (*.doc)|*.doc|All Files(*.*)|*.*||"
bool Prompt::fileOpen( std::string * pPath, const std::string & defaultName, const std::string & defaultExtension, const std::string & extensions )
{
    //return false;

    CFileDialog dlg(
        true,                                   // true for File Open dialog box
        defaultExtension.c_str(),               // The default file name extension
        defaultName.c_str(),                    // The default file name
        OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR,    // bunch of flags http://msdn.microsoft.com/en-us/library/wh5hz49d.aspx
        extensions.c_str()
        );

    auto result = dlg.DoModal();
    if(result != IDOK) return false; // failed
    pPath->assign(dlg.GetPathName());
    return true;
}

不幸的是,这会导致调试时出现编译问题: 使用 /MD[d](CRT dll 版本)构建 MFC 应用程序需要 MFC 共享 dll 版本。 请#define _AFXDLL 或不要使用/MD[d]

所以在配置 > 常规 > 使用 MFC 我将它设置为“在共享 DLL 中使用 MFC”

现在它可以编译了,但没有按预期工作。

我得到一个运行时异常:

App.exe 中 0x51A9A072 (mfc110d.dll) 处未处理的异常: 0xC0000005:访问冲突读取位置0x00000000。

winmain.cpp 第 28 行

if (!pThread->InitInstance())

基本上 pThread 是一个 nullptr

请注意,如果我删除了

的包含
#include <afxdlgs.h>

我的应用程序的 fileOpen 函数按预期工作。

我不知道如何解决这个问题,任何帮助都会很好。

谢谢

【问题讨论】:

    标签: c++ com visual-studio-2012 sdl


    【解决方案1】:

    听起来您没有在程序的其余部分使用 MFC,那么为什么要从这里开始呢? 你应该改用GetOpenFileName

    【讨论】:

    【解决方案2】:

    问题是,你的 winmain-initialisation 没有运行,因为 stl 有它自己的 main-function。您可以在适当的地方调用 winmain 来设置事件循环和所有其他东西,或者拥有自己的 winmain,就像那里描述的那样:http://forums.libsdl.org/viewtopic.php?t=1513&sid=be1738a196fe7ca5d72ea7a894ddc5b7

    【讨论】:

    • 嗯,这可能不是全部。如msdn.microsoft.com/en-us/library/w04bs753(v=vs.80).aspx 中所写,没有winmain 的应用程序:“对于不使用MFC 提供的WinMain 函数的控制台应用程序,您必须直接调用AfxWinInit 来初始化MFC。”
    • 仅仅调用 AfxWinInit 不会做任何事情。
    猜你喜欢
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2019-11-11
    • 2020-12-04
    • 2012-07-12
    • 2013-01-21
    相关资源
    最近更新 更多