DLL

DLLの種類

  • 非MFC DLL
  • MFCと静的にリンクされるレギュラーDLL
  • MFCと動的にリンクされるレギュラーDLL
  • 拡張DLL

非MFC DLL

非 MFC DLL は、MFC を内部的に使わない DLL です。非 MFC DLL のエクスポート関数は、MFC、非 MFC のどちらの実行可能ファイルからも呼び出すことができます。通常、関数は C 言語の標準インターフェイスを使って非 MFC DLL からエクスポートされます。

MFCと静的にリンクされるレギュラーDLL

MFC と静的にリンクするレギュラー DLL は、MFC を内部的に使用します。このレギュラー DLL のエクスポート関数は、MFC、非 MFC のどちらの実行可能ファイルからも呼び出すことができます。名前からもわかるように、この種の DLL は MFC のスタティック リンク ライブラリ バージョンを使ってビルドされます。通常、関数は C 言語の標準インターフェイスを使ってレギュラー DLL からエクスポートされます。

USRDLL という用語は、Visual C++ ドキュメントでは使用されなくなりました。MFC に静的にリンクしたライブラリが以前の USRDLL に相当します。
MFC と静的にリンクされるレギュラー DLL の特徴は、以下のとおりです。
  • クライアントの実行可能ファイルは、DLL を使用できる任意の言語 (C、C++、Pascal、Visual Basic など) で記述できます。MFC アプリケーションでなくてもかまいません。
  • 複数のアプリケーションで使用される MFC のスタティック リンク ライブラリとリンクできます。DLL のスタティック リンク バージョンのライブラリは、今後使用されなくなります。
  • MFC のバージョン 4.0 以前では、MFC と静的にリンクされるレギュラー DLL と同じ種類の機能を各種の USRDLL が提供していました。しかし、Visual C++ バージョン 4.0 では USRDLL という用語は使用しません。

MFC と静的にリンクされるレギュラー DLL の必要条件は、以下のとおりです。
  • CWinApp 派生クラスをインスタンス化します。
  • MFC から提供される DllMain を使用します。通常の MFC アプリケーションと同じく、DLL 固有のすべての初期化コードをInitInstance メンバ関数に配置し、終了コードを ExitInstance メンバ関数に配置します。
  • USRDLL という用語は使用されませんが、コンパイラのコマンド ラインではまだ "_USRDLL" を定義する必要があります。この定義により、MFC ヘッダーファイルから取り込まれる宣言が決まります。

MFCと動的にリンクされるレギュラーDLL

MFC と動的にリンクするレギュラー DLL は、MFC を内部的に使用します。このレギュラー DLL のエクスポート関数は、MFC、非 MFC のどちらの実行可能ファイルからも呼び出すことができます。名前からもわかるように、この種の DLL は MFC のダイナミック リンク ライブラリ バージョン (MFC の共有バージョン) を使ってビルドされます。通常、関数は C 言語の標準インターフェイスを使ってレギュラー DLL からエクスポートされます。

MFC と動的にリンクする標準 DLL 中のエクスポートされるすべての関数の先頭に AFX_MANAGE_STATE マクロを追加して、現在のモジュール ステートを DLL のモジュール ステートに設定する必要があります。これは、DLL からエクスポートされる関数の先頭に次のコード行を追加して行います。
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

MFC と動的にリンクされるレギュラー DLL の特徴は、以下のとおりです。
  • Visual C++ 4.0 で新たに導入された DLL です。
  • クライアントの実行可能ファイルは、DLL を使用できる任意の言語 (C、C++、Pascal、Visual Basic など) で記述できます。MFCアプリケーションでなくてもかまいません。
  • 静的にリンクされるレギュラー DLL とは異なり、MFC DLL と動的にリンクされます。MFC DLL は、MFC の共有 DLL とも呼ばれます。
  • この種の DLL にリンクされる MFC インポート ライブラリは、MFC DLL を利用するアプリケーションや拡張 DLL で使われるものと同じもので、MFCxx(D).lib です。

MFC と動的にリンクされるレギュラー DLL には、以下の必要条件があります。
  • MFC DLL と動的にリンクされる実行可能ファイルと同じく、_AFXDLL を定義してコンパイルされます。ただし、MFC と静的にリンクされるレギュラー DLL と同じく、_USRDLL も定義されます。
  • CWinApp 派生クラスをインスタンス化します。
  • MFC から提供される DllMain を使用します。通常の MFC アプリケーションと同じく、DLL 固有のすべての初期化コードをInitInstance メンバ関数に配置し、終了コードを ExitInstance メンバ関数に配置します。

拡張DLL

MFC 拡張 DLL は、既存の MFC ライブラリ クラスから派生した再利用可能なクラスを主に実装する DLL です。拡張 DLL は、MFC のダイナミック リンク ライブラリ バージョン (MFC の共有バージョン) を使ってビルドされます。ただし、拡張 DLL を使用できるのは、MFC の共有バージョンを使ってビルドされた MFC の実行可能ファイル (アプリケーションまたはレギュラー DLL) だけです。拡張 DLL を使うと、MFC から新しいカスタム クラスを派生し、この拡張バージョンの MFC を DLL を呼び出すアプリケーションに提供できます。

また、拡張 DLL を使うと、アプリケーションと DLL の間で MFC の派生オブジェクトをやり取りすることもできます。やり取りされるオブジェクトに関連付けられたメンバ関数は、そのオブジェクトが作成されたモジュール内にあります。これらの関数は MFC の共有 DLL バージョンの使用時に正しくエクスポートされるので、MFC のポインタまたは MFC の派生オブジェクトのポインタをアプリケーションと拡張 DLL との間で自由にやり取りできます。

DLLのリソースを使う

DLLからリソースを使おうとすると、EXE側のリソースが使われてしまう。
使用するリソースを切り替えるために、DLLでリソースを使うスコープで、AFX_MANAGE_STATE(AfxGetStaticModuleState())の処理を入れる。
切り替えたリソースは、スコープから外れると自動で元に戻る。
ただし、DLLでリソースを使うたびに処理を入れるのは面倒なので、リソースDLLを作ってEXEと共有するのが楽だと思う。



最終更新:2011年09月27日 17:13