4

私は、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;
}

残念ながら、これによりデバッグ時にコンパイルの問題が発生します。MFC アプリケーションを /MD[d] (CRT dll バージョン) でビルドするには、MFC 共有 dll バージョンが必要です。_AFXDLL を #define するか、/MD[d] を使用しないでください

したがって、[構成] > [一般] > [MFC の使用] の下で、「共有 DLL で MFC を使用する」に設定します。

これでコンパイルできますが、期待どおりに動作しません。

実行時例外が発生します。

App.exe の 0x51A9A072 (mfc110d.dll) で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x00000000。

winmain.cpp 28行目

if (!pThread->InitInstance())

基本的に pThread は nullptr です

のインクルードを削除すると、

#include <afxdlgs.h>

私のアプリは期待どおりに機能します。

この問題を解決する方法がわかりません。

ありがとう

4

2 に答える 2

3

プログラムの残りの部分では MFC を使用していないように思えますが、なぜここから始めるのでしょうか? おそらく、代わりにGetOpenFileNameを使用する必要があります。

于 2012-11-10T14:34:34.680 に答える
0

問題は、stl には独自の main-function があるため、winmain-initialisation が実行されなかったことです。適切な場所で winmain を呼び出してイベント ループやその他すべてのものをセットアップするか、そこに記載されているように独自の winmain を用意することができます

于 2012-11-10T13:57:36.670 に答える