我正在开发一个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函数我的应用程序按预期工作。
我不确定如何解决这个问题,任何帮助都会很好。
由于
答案 0 :(得分:2)
听起来你没有在程序的其余部分使用MFC,为什么要从这里开始呢? 您应该使用GetOpenFileName代替。
答案 1 :(得分:0)
问题是,你的winmain-initialisation没有运行,因为stl有自己的主函数。您可以在适当的位置调用winmain来设置事件循环和所有其他内容,或者拥有自己的winmain,如下所述:http://forums.libsdl.org/viewtopic.php?t=1513&sid=be1738a196fe7ca5d72ea7a894ddc5b7