none
MFCのスタティックリンク(デバック実行時に落ちる。) RRS feed

  • 質問

  • はじめまして。

     VC6.0でDLLを作成した折、MFCをスタティックリンクしている状況で、

    デバック実行するとafx.inlでAssartエラーになってしまいます。

    CStringのオブジェクトをコメントアウトすると平気でした。

    また、CStringをポインタ宣言して、ソース内部でnewしても平気でした。

    上位のEXEはVC5で作成したもので、こちらはMFCは使用しておりません。

    この状況で、EXEとDLLで、開発環境のバージョンが異なる時、MFCをスタティック

    リンクすると、まずいのかがすごい気になります。

    よろしくお願いいたします。

    以上です。

    2006年4月7日 4:48

すべての返信


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

    という事なのですが、動的リンクだと落ちないという意味でしょうか。


    CStringのオブジェクトをコメントアウトすると平気でした。
    また、CStringをポインタ宣言して、ソース内部でnewしても平気でした。

    からは、そう読み取れませんでした。

    私の読解力がないせいで申し訳ないのですが、これらの「平気でした」の意味がよく分かりません。
    どこをどうしたのでしょうか。

    2006年4月7日 6:00
  •  マーシー さんからの引用

    また、CStringをポインタ宣言して、ソース内部でnewしても平気でした。

    上位のEXEはVC5で作成したもので、こちらはMFCは使用しておりません。

    今ひとつ状況が読み取れないのですが、本当にEXE側では MFC を使用していないのでしょうか?

    EXE(VC5) と DLL(VC6) の間で、CString オブジェクトをやりとりしてたりしてませんか?

    DLL側API : void SetString(CString str);

    などを、EXE側で呼んでいるとか?

    確か CString クラスは名前は同じでも MFC のバージョンが異なると互換性がないと思いました。(MFC6 と MFC7 では経験してます)

    2006年4月7日 9:42
  • とっちゃんです。

     マーシー さんからの引用

     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境界違反が発生して、おかしなアサートやハングアップが発生します。

    デバッグ実行だと、デバッガが関与する影響で潜在バグが浮上するだけだと思います。

    2006年4月7日 13:30
  • お返事が遅くなりまして、申し訳有りませんでした。

    まとめRESで失礼いたします。。

    >デバッグ実行だと、デバッガが関与する影響で潜在バグが浮上するだけだと思います。

    が、気になったのですが、やはり具体的な所は分からないですね。

    RESをいただいたみなさま、ありがとうございました。

     

    2006年4月8日 14:55