如何正确使用CFileDialog

时间:2012-11-10 13:30:00

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

我正在开发一个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]

所以在Configuration&gt;下一般&gt;使用MFC 我将其设置为“在共享DLL中使用MFC”

现在它编译,但不能按预期工作。

我遇到了运行时异常:

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

winmain.cpp第28行

if (!pThread->InitInstance())

基本上pThread是一个nullptr

请注意,如果删除

的包含内容
#include <afxdlgs.h>

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

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

由于

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

问题是,你的winmain-initialisation没有运行,因为stl有自己的主函数。您可以在适当的位置调用winmain来设置事件循环和所有其他内容,或者拥有自己的winmain,如下所述:http://forums.libsdl.org/viewtopic.php?t=1513&sid=be1738a196fe7ca5d72ea7a894ddc5b7