質問者
MFCのスタティックリンク(デバック実行時に落ちる。)

質問
-
はじめまして。
VC6.0でDLLを作成した折、MFCをスタティックリンクしている状況で、
デバック実行するとafx.inlでAssartエラーになってしまいます。
CStringのオブジェクトをコメントアウトすると平気でした。
また、CStringをポインタ宣言して、ソース内部でnewしても平気でした。
上位のEXEはVC5で作成したもので、こちらはMFCは使用しておりません。
この状況で、EXEとDLLで、開発環境のバージョンが異なる時、MFCをスタティック
リンクすると、まずいのかがすごい気になります。
よろしくお願いいたします。
以上です。
すべての返信
-
マーシー さんからの引用 また、CStringをポインタ宣言して、ソース内部でnewしても平気でした。
上位のEXEはVC5で作成したもので、こちらはMFCは使用しておりません。
今ひとつ状況が読み取れないのですが、本当にEXE側では MFC を使用していないのでしょうか?
EXE(VC5) と DLL(VC6) の間で、CString オブジェクトをやりとりしてたりしてませんか?
DLL側API : void SetString(CString str);
などを、EXE側で呼んでいるとか?
確か CString クラスは名前は同じでも MFC のバージョンが異なると互換性がないと思いました。(MFC6 と MFC7 では経験してます)
-
とっちゃんです。
マーシー さんからの引用 VC6.0でDLLを作成した折、MFCをスタティックリンクしている状況で、
デバック実行するとafx.inlでAssartエラーになってしまいます。
えっと、EXE は、VC5 ではビルドされているが、CRTまでスタティックリンクしているものなんですよね?
そうではないのだとしたら、まずはEXEをVC6でビルドしなおすことをお勧めします。
詳しいことは、VC6のKBやドキュメントを漁ってもらいたいと思いますが、互換性の問題で致命的な不具合のある環境が存在していますし、DLLとEXEで違うバージョンを使ってる場合、互換性スイッチを有効にすることが出来ないという問題が発生します。
ちなみに、全部VC5で作ってる場合で、2000以降または、VC6なMSVCRT.DLLがインストールされるOS(95/NT4など)の場合も互換性スイッチをオンにしないと同じような不具合が発生すると思います。
問題点はそっちではないのだとしたら、DLLの外(コールバックを含む)から呼ばれる全ての関数の先頭で
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
を呼び出しを漏れなく行なっていることを確認してください。
DLL内の関数を呼び出すのが誰であっても(APIを含む)、入り口で必ず上記マクロを挟まないとMFC境界違反が発生して、おかしなアサートやハングアップが発生します。
デバッグ実行だと、デバッガが関与する影響で潜在バグが浮上するだけだと思います。