アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。

DOSコマンドからMFCアプリケーションを起動したら、
アプリケーションエラーのダイアログが出力しました。
メッセージ文言
「"0xNNNNNNNN"の命令が"0xNNNNNNNN"のメモリを参照しました。
メモリが"written"になることはできませんでした。
プログラムを終了するには[OK]をクリックしてください」

開発環境
OS Windows XP SP2
VC++ MicroSoft Visual C++ Ver6.0 Enterprise Edition

実行環境
OS Windows Server 2003 Enterprise Edition SP2
(但しWindows Server 2000で実行したところ、上記現象は起こりませんでした。試しにWindows XP SP2(開発環境)で実行したら、上記現象は起こりました。)

条件は以下の1~5が同時に成立した場合にダイアログが出力します
1. MFCをダイナミックリンク(スタティックリンクはOKでした)
2. グローバル変数(CString型)に129桁以上を設定(128桁の場合、OKでした)
3. ローカル変数(CString型)に65桁以上を設定(64桁の場合、OKでした)
4. MFCの関数:CFile::GetStatus()をコール(第一引数のファイルは実際に存在する/しないに関わらず、エラーダイアログは出力します)
5. SDKの関数:ExitProcess()をコール

原因がわかる方がいましたら、教えて頂けませんか??
宜しくお願い致します。

実装は以下のような感じです。

//グローバル変数定義
CString g_wk; (.hではなく、.cppに直接記述してあります)

BOOL CTest01Dlg::OnInitDialog()
{
CDialog::OnInitDialog();

//↓↓↓↓↓ここから↓↓↓↓↓
CString l_wk = "1234567…56789"; // 129桁
g_wk = "1234567…56789"; // 65桁
CFileStatus s;
BOOL bl = CFile::GetStatus("a", s);
ExitProcess(0);
//↑↑↑↑↑ここまで↑↑↑↑↑

return TRUE;
}

A 回答 (4件)

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

この回答への補足

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

補足日時:2008/10/08 22:23
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/10/08 22:20

ExitProcessでは無くて


AfxGetApp()->GetMainWnd()->SendMessage( WM_CLOSE, 0, 0 );
など正規の手順で落としてみましょう
    • good
    • 0
この回答へのお礼

何度もご回答ありがとうございます。
ご提示された実装でエラーウィンドウは出なくなりました。

ただ、「EndDialog()」でもエラーウィンドウは出ないのですが、
これだとまずいのでしょうか???

お礼日時:2008/10/08 01:07

アサーションは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です ・・・
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

都合により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を当てています。

お礼日時:2008/10/06 23:01

当方の VirtualPC上の Win2003SverEntSP2ですと


コマンドプロンプトからの起動でも別段エラー(アサーション)になりませんよ
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。

なるほど、VirtualPC上では発生しないのですか。
すいません。そこまでは調査していませんでした。

Virtualではなく、本物(っていうんでしょうか?)では
ダイアログが出るので、ちょっと困り気味なのです。

お礼日時:2008/10/06 07:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!