実質初めての書き込み
MFCを静的リンクしたときに起こる問題。
いままでVCで開発したことがなく、長いことはまってしまったので、メモをしておく。


始まりはランタイムエラー

DebugLibrary
Debug Assertion Failed!
Program:・・・
File:f:\sp\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl
Line 24
・
・
・


下記のassertionで落ちていた。

_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle()
{ ASSERT(afxCurrentResourceHandle != NULL);
return afxCurrentResourceHandle; }


AfxGetResourceHandleを呼んでいるコードを探していくと、
CExceptionのGetErrorMessageにたどり着いた。


そこからどうしていいかわからずぐぐったら、
MFCの静的リンクに問題があるらしいことがわかった。
http://www.codeguru.com/forum/archive/index.php/t-249754.html


上記URLでは、ダイアログのよびだしで同じようなエラーが出ている。
原因は、静的リンクでMFCを使っているにもかかわらず、
GetErrorMessage@CExceptionが定義してあるオブジェクトを動的にリンクしていると、
実行環境が解釈してしまっていることにあると思われる。
違ってたらすいません。


自分がやった対策は、GetErrorMessage@CExceptionを定義しているDLLをリンクすること。
下記のようなコードをGetErrorMessageを呼び出す前に入れておく。

HINSTANCE hRes = NULL;
hRes = LoadLibrary("MFC42.DLL");
if(hRes)
   AfxSetResourceHandle(hRes);


せっかく静的リンクでMFCをよんでいるのに、動的リンクをしてしまっていることに挫折を感じるが、
静的ライブラリ中のCException(GetErrorMessage@CException?)を使う方法がわからないので、とりあえずこのままにしておく。


VCで初めて書いたコードで起こった問題だが、
同じようなことに行き当たった人がほとんどいないことに違和感を感じる。
自分のVCの設定に問題があるのだろうか。

自分がいじった設定は、

  • スタティック ライブラリで MFC を使用する
  • マルチ バイト文字セットを使用する

くらいだ。