初質問ですので、不手際あるかと思いますが、あわせてご指南ください。
開発環境は、Windows2000,VisualStudio6.0です。
MFC拡張DLLを作成しています。
別の拡張DLLに、CTreeCtrlの派生クラスをのせた画面を呼び出せるようにしたいのです。
ソースが手元にないので記憶の限りで記述させていただきます。
画面クラスと、CTreeCtrlの派生クラスをエクスポートし、
(class __declspec(dllexport) 派生クラス名 : public CTreeCtrl)
画面が呼び出せはするのですが、画面を閉じる時に、Access Violationが起きてしまいます。
デバッグで追いかけたところ、呼び出し時に、呼び出し元にて確保してあるリソースハンドルがクリアされてしまいました。
const HINSTANCE hInstance = AfxGetResourceHandle();
AfxSetResourceHandle(DLL のインスタンス ハンドル);
CDialog dlg;
dlg.DoModal();//画面呼び出し時に、上のhInstanceがNULLになってしまいます。
AfxSetResourceHandle(hInstance);
CTreeCtrlの派生クラスに、メンバ変数が存在しない場合は、hInstanceはNULLになりませんでした。
現在手詰まりで、どこから調べたらよいかも分からない状況です。
助言、宜しくお願いいたします。
CDialog dlg; 実際は派生クラスだよね。
CTreeCtrlの派生クラス(ポインタではない)が
dlgのメンバ変数になっているのか?
俺、仕組みをよく理解できてないから
MFC拡張DLLで派生クラスをエクスポートしたことないのでよくわからん。
食い違いが生じているのかな。
CTreeCtrlの派生クラスにメンバ変数を入れてそのDLLをリビルドする。
ちゃんと新しいCTreeCtrlの派生クラスのヘッダファイルを指定して
そのDLLを使うDLLやEXEもリビルドしたらどうでしょうか。
>CDialog dlg; 実際は派生クラスだよね。
>CTreeCtrlの派生クラス(ポインタではない)が
>dlgのメンバ変数になっているのか?
その通りです。言葉足らずですみません。
CDialogの派生クラスに、CTreeCtrlの派生クラスをメンバ変数にして用意しています。
>食い違いが生じているのかな。
>CTreeCtrlの派生クラスにメンバ変数を入れてそのDLLをリビルドする。
>ちゃんと新しいCTreeCtrlの派生クラスのヘッダファイルを指定して
>そのDLLを使うDLLやEXEもリビルドしたらどうでしょうか。
記憶があやふやなのですが、CTreeCtrlの派生クラスがいるDLLはリビルドしたはずです。
ただ、初期画面として、VCでExeを用意しており、そこから、各拡張DLLを呼び出しています。呼び出された拡張DLLから、さらに別の拡張DLLを呼び出したりもしています。
DLL間で相互リンクしてしまったりしているため、全部リビルドするには、2回全部リビルドしたりして、かなり時間がかかるため、省略していたので、リトライしてみようかと思います。
他に何かあれば、ご指摘お願いします。
ツイート | ![]() |