如何正确使用cfiledialog

How to use CFileDialog correctly

本文关键字:cfiledialog 何正确      更新时间:2023-10-16

我正在使用VS2012,定位Windows的SDL应用程序。

我想做以下操作:

  • 有一个文件打开对话框
  • 有一个文件保存作为对话框

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

#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]

so在配置下&gt;一般&gt;使用MFC我将其设置为"在共享DLL中使用MFC"

现在它编译了,但无法正常工作。

我有一个运行时间异常:

app.exe中的0x51A9A072(MFC110D.DLL)未经处理的异常:0xc0000005:访问违规阅读位置0x00000000。

winmain.cpp行28

if (!pThread->InitInstance())

基本上是pthread是nullptr

请注意,如果我删除

的INCLUCE
#include <afxdlgs.h>

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

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

听起来您在程序的其余部分中不使用MFC,所以为什么从这里开始呢?您可能应该使用GetOpenFileName

问题是,您的winmain-Inialisation没有运行,因为STL具有自己的主要功能。您可以在适当的地方致电Winmain,以设置事件 - 循环和所有其他内容,或者拥有自己的Winmain,如那里所述:http://forums.libsdl.org/viewtopic.php?t=1513&sid==BE1738A196FE7CA5D72EA7A894DDC5B7