- ベストアンサー
DOSコマンドからMFCアプリケーションを起動したらエラーダイアログが表示される
- DOSコマンドからMFCアプリケーションを起動した際、命令がメモリを参照するエラーが発生し、アプリケーションエラーダイアログが表示されます。
- 特定の条件下で発生するエラーで、MFCをダイナミックリンクし、グローバル変数に129桁以上のデータを設定し、ローカル変数に65桁以上のデータを設定し、CFile::GetStatus()関数やExitProcess()関数を呼び出した場合に発生します。
- エラーの原因はまだ解明されていないので、詳しい情報を持っている方からのアドバイスを求めています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
EndDialogでもかまわないと思いますよ …
その他の回答 (3)
- redfox63
- ベストアンサー率71% (1325/1856)
ExitProcessでは無くて AfxGetApp()->GetMainWnd()->SendMessage( WM_CLOSE, 0, 0 ); など正規の手順で落としてみましょう
お礼
何度もご回答ありがとうございます。 ご提示された実装でエラーウィンドウは出なくなりました。 ただ、「EndDialog()」でもエラーウィンドウは出ないのですが、 これだとまずいのでしょうか???
- redfox63
- ベストアンサー率71% (1325/1856)
アサーションは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です ・・・
お礼
ご回答ありがとうございます。 都合により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)
当方の VirtualPC上の Win2003SverEntSP2ですと コマンドプロンプトからの起動でも別段エラー(アサーション)になりませんよ
お礼
早速のご回答ありがとうございます。 なるほど、VirtualPC上では発生しないのですか。 すいません。そこまでは調査していませんでした。 Virtualではなく、本物(っていうんでしょうか?)では ダイアログが出るので、ちょっと困り気味なのです。
お礼
ありがとうございます。 大変助かりました。
補足
作業日程が迫っていたので、 EndDialog()使用の方針でいくことになりました。 ありがとうございます。