CTreeCtrl派生クラスを拡張DLL間で使用するには?


supli  2007-01-06 03:11:48  No: 64167

初質問ですので、不手際あるかと思いますが、あわせてご指南ください。
開発環境は、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になりませんでした。
現在手詰まりで、どこから調べたらよいかも分からない状況です。
助言、宜しくお願いいたします。


超初心者  2007-01-06 19:48:03  No: 64168

CDialog dlg; 実際は派生クラスだよね。

CTreeCtrlの派生クラス(ポインタではない)が
dlgのメンバ変数になっているのか?

俺、仕組みをよく理解できてないから
MFC拡張DLLで派生クラスをエクスポートしたことないのでよくわからん。

食い違いが生じているのかな。
CTreeCtrlの派生クラスにメンバ変数を入れてそのDLLをリビルドする。
ちゃんと新しいCTreeCtrlの派生クラスのヘッダファイルを指定して
そのDLLを使うDLLやEXEもリビルドしたらどうでしょうか。


supli  2007-01-07 00:48:33  No: 64169

>CDialog dlg; 実際は派生クラスだよね。
>CTreeCtrlの派生クラス(ポインタではない)が
>dlgのメンバ変数になっているのか?
その通りです。言葉足らずですみません。
CDialogの派生クラスに、CTreeCtrlの派生クラスをメンバ変数にして用意しています。

>食い違いが生じているのかな。
>CTreeCtrlの派生クラスにメンバ変数を入れてそのDLLをリビルドする。
>ちゃんと新しいCTreeCtrlの派生クラスのヘッダファイルを指定して
>そのDLLを使うDLLやEXEもリビルドしたらどうでしょうか。
記憶があやふやなのですが、CTreeCtrlの派生クラスがいるDLLはリビルドしたはずです。
ただ、初期画面として、VCでExeを用意しており、そこから、各拡張DLLを呼び出しています。呼び出された拡張DLLから、さらに別の拡張DLLを呼び出したりもしています。
DLL間で相互リンクしてしまったりしているため、全部リビルドするには、2回全部リビルドしたりして、かなり時間がかかるため、省略していたので、リトライしてみようかと思います。

他に何かあれば、ご指摘お願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加