桜、抹茶、白、日記

名古屋市在住のC++使いのcoderの日記だったもの。

AFX_MANAGE_STATE

今まであまり意識していなかったけど、このマクロがどのように作用するのか今日ちょっぴり理解した。


今の作業で、複数バージョンのVC++コンパイルできるようにソリューションを用意しているんですが、VC++2008で一式ビルドした後にVC++2010で1つのアプリケーションだけビルドして実行した場合、EXE側とDLL側で使っているMFCのバージョンが異なる組み合わせになる。このような場合に、MFCグローバル変数にアクセスするような関数を呼び出すと、バージョン不整合で落ちる。
今の構成では、MFC拡張DLLとして作成しているので、EXEとDLLは同じMFCバージョンになっていないといけないのに、バイナリを入れ替えないままでビルドしてしまって、変な挙動になって1時間も時間を無駄にした。

で、MFC拡張DLLではなくてMFC共有DLLにした場合、AFX_MANAGE_STATEマクロを呼び出せば、異なるMFCバージョンでもうまく処理してくれるようになる。ですけどもAfxGetAppName()をDLL内から呼び出したら、DLLのプロジェクト名が返ってくるのでEXEの名前は取得できない。結局使えない。


プロジェクト毎に*.cppを取り込んで使っている設定になっていてDLLにしたらいいんじゃね?と思って変えたんだけど、プロジェクト単位で開発環境が異なる場合にはソースコードを取り込んだ方が良いかもなぁ。