4

我正在开发一个 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 函数按预期工作。

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

谢谢

4

2 回答 2

3

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

于 2012-11-10T14:34:34.680 回答
0

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

于 2012-11-10T13:57:36.670 回答