• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:DOSコマンドよりMFCアプリ起動でエラーダイアログ)

DOSコマンドからMFCアプリケーションを起動したらエラーダイアログが表示される

このQ&Aのポイント
  • DOSコマンドからMFCアプリケーションを起動した際、命令がメモリを参照するエラーが発生し、アプリケーションエラーダイアログが表示されます。
  • 特定の条件下で発生するエラーで、MFCをダイナミックリンクし、グローバル変数に129桁以上のデータを設定し、ローカル変数に65桁以上のデータを設定し、CFile::GetStatus()関数やExitProcess()関数を呼び出した場合に発生します。
  • エラーの原因はまだ解明されていないので、詳しい情報を持っている方からのアドバイスを求めています。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

EndDialogでもかまわないと思いますよ …

isg7
質問者

お礼

ありがとうございます。 大変助かりました。

isg7
質問者

補足

作業日程が迫っていたので、 EndDialog()使用の方針でいくことになりました。 ありがとうございます。

その他の回答 (3)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

ExitProcessでは無くて AfxGetApp()->GetMainWnd()->SendMessage( WM_CLOSE, 0, 0 ); など正規の手順で落としてみましょう

isg7
質問者

お礼

何度もご回答ありがとうございます。 ご提示された実装でエラーウィンドウは出なくなりました。 ただ、「EndDialog()」でもエラーウィンドウは出ないのですが、 これだとまずいのでしょうか???

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

アサーションはGatStateの中なのでしょうか? VC6のリモートデバッグで実行してみて ソース行を特定してみてはいかがでしょう WinXP側のプロジェクトフォルダーを共有して ここにMFC42.DLL,MFC42D.dll,MFCO42.DLL,MSVCRTD.DLLをコピーします リモートデバック用にVC6のインストールフォルダのCommon\MSDev98\BinからMSVCMON.EXE,DM.DLL,TLN0T.DLL,MSDID110.DLLをコピーします Win2003側で XPのフォルダーにネットワークドライブを割り当てます 仮に Z:などと VC6の プロジェクト > 設定 > デバッグタブ プログラムの引数に /C デバッグ対象アプリ リモートの実行可能ファイルのパスとファイル名に C:\Windows\System32\cmd.exe を設定 ビルド > デバッガリモート接続 > 接続(C)をリモート > 設定 > Win2003のIPアドレスまたはサーバー名 > OK Win2003側で MSVCMON.EXEを起動 > 接続 VC6側で 適当なブレークポイント設定 > F5(実行) BOOL bl = CFile::GetState("a", s ); までステップ実行 > その後ステップインで MFCの中へ入れると思いますよ 当方のVC6は SP5か6です ・・・

isg7
質問者

お礼

ご回答ありがとうございます。 都合によりWin2003が使えなかったので、 WinXP(開発環境)にてデバッグモードで実施してみました。 (Visual Studioより起動) GetState()はあまり問題ないように感じました。 (元々,「a」というファイルは存在しないのでFindFirstFile()の戻り値がINVALID_HANDLE_VALUEの為、FALSEを返却してるようです) ただ、実行後に以下のメッセージが出力しました。 Detected memory leaks! Dumping objects -> strcore.cpp(118) : {69} normal block at 0x00384BF0, 78 bytes long. Data: < A A 1234> 01 00 00 00 41 00 00 00 41 00 00 00 31 32 33 34 strcore.cpp(118) : {68} normal block at 0x00384B18, 142 bytes long. Data: < 1234> 01 00 00 00 81 00 00 00 81 00 00 00 31 32 33 34 strcore.cpp(118) : {61} normal block at 0x003847C0, 45 bytes long. Data: < l r> 01 00 00 00 0F 00 00 00 20 00 00 00 82 6C 82 72 {60} normal block at 0x00384768, 16 bytes long. Data: < > FF FF FF FF CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete. スレッド 0xF18 終了、終了コード 0 (0x0)。 _CrtSetBreakAlloc()で追跡したところ 61を指定:止まらなかったのでどのオブジェクトか不明 68を指定:l_wk(129桁)の設定でストップ 69を指定:g_wk(65桁)の設定でストップ のようになりました。 CStringが怪しいということでしょうか?? どうもアサーションはプログラム実行後に出るようです。 (或いはExitProcess()内かもしれないです) 試しにExitProcess()をEndDialog()に変更したら アサーションは出ませんでした。 ExitProcess()が悪いということでしょうか?? (或いはMFCとSDKの関係に何かある?) 因みにVC++はSP6を当てています。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

当方の VirtualPC上の Win2003SverEntSP2ですと コマンドプロンプトからの起動でも別段エラー(アサーション)になりませんよ

isg7
質問者

お礼

早速のご回答ありがとうございます。 なるほど、VirtualPC上では発生しないのですか。 すいません。そこまでは調査していませんでした。 Virtualではなく、本物(っていうんでしょうか?)では ダイアログが出るので、ちょっと困り気味なのです。

関連するQ&A