みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

CWndを使うDLL

質問1
CWndのサブクラスを作りたいDLLは、以下のどのDLLとして作成すれば良いでしょうか?

・Win32 DLL
・MFC共有DLL
・MFC拡張DLL

ちなみに、このDLLは、必ずしもMFCで作成されたアプリケーションでロードされるとは限りません。

質問2
上記選択でMFCになった場合、MFCのライブラリは動的リンクと静的リンクのどちらになるのでしょうか?
自分で選択できるのであれば、その方法を教えてください。

質問3
上記選択で静的リンクになった場合。
MSDNのページで調べると以下のような制限があるとのことですが、具体的には、こういうことでしょうか?
・DLL内で確保したメモリのポインタを上位からもらってもいけないし、上位へ返してもいけない。
・MFC オブジェクト(CWndサブクラスへのポインタなど)を上位からもらってもいけないし、返してもいけない。

--- MSDN引用ここから
「レギュラー DLL 内のメモリ割り当てはすべて、DLL の範囲内に収める必要があります。
したがって、以下のポインタを呼び出し側の実行可能ファイルとやり取りすることはできません。
・MFC オブジェクトへのポインタ
・MFC によって割り当てられたメモリへのポインタ
--- MSDN引用ここまで

よろしくお願いします。

投稿日時 - 2008-10-21 22:15:42

QNo.4419462

すぐに回答ほしいです

質問者が選んだベストアンサー

CWndクラスの派生クラスを使いたいのであれば Win32DLLではダメですね
このDLLの呼び出し元が MFC/非MFCなのであれば『MFC共有DLL』になるでしょう
MFCのリンクは静的/動的どちらでも良いようです
動的リンクならDLL自体は小さく出来ますが MFCのDLL(MFC4x.DLLやMSVCRT.DLLなど)配布と個々のエクスポートする関数に細工が必要なようです
静的リンクですとDLL自体が大きくなってしまいますが個々の関数への細工は不要なようです

CWndなどMFCオブジェクトを直接やり取りしたいなら呼び出し元もMFC実行形式に限定して『MFC拡張DLL』でということになるでしょう

実際のDLLからエクスポート出来る関数は必要なデータを構造体にまとめてやり取りするような具合になると思います

DLL側
HWND FAR PASCAL EXPORT myCWndCreate( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, HWND hParentWnd);
などの宣言で行うように思います

直接 CWndやその派生クラスのポインタを返すのは無理なようです
非MFCではそのポインタを理解できないため ・・・

MFCのサンプルの『DLLTRACE』あたりを参照してみましょう
MFC/非MFC双方からアクセスするのであればMFCの静的リンクのほうが良いかもしれません
MFCの動的リンクの場合 呼び出し元とDLL側のMFCグローバルモジュールの切り替えようのコードをエクスポートする個々の関数に記述する必要があるようです
詳細は『DLLTRACE』の要約を参照してください

投稿日時 - 2008-10-22 01:48:25

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問