この MFC ライブラリを Windows ダイナミック リンク ライブラリ (DLL) の一部として使用できるレギュラー Dll について説明します。それは、Windows Dll やそれらを構築する方法に精通しているを前提としています。MFC の DLL バージョンの MFC 拡張 Dll は、MFC ライブラリの拡張機能を作成するための情報を参照してください。
DLL インターフェイス
レギュラー Dll は、アプリケーションと DLL 間のインターフェイスは通常の C のような関数または明示的にエクスポートしたクラスで指定されていると仮定します。MFC クラスのインターフェイスをエクスポートすることはできません。
DLL とアプリケーションの両方が MFC を使用する場合は、[両方の共有バージョンの MFC ライブラリを使用するか、静的にリンクされた MFC ライブラリのコピーがあることを選択があります。Visual C 4.0 より前のバージョンでは、MFC のスタティック リンク ライブラリは、アプリケーションと Dll の異なっていた。MFC は、アプリケーションと DLL の現在のバージョンの両方、標準バージョンの MFC ライブラリのいずれかを使用できます。Dll を別のライブラリ (MFC の実行時に選択) このバージョンではないです。
レギュラー Dll にいくつかの利点があります。:
API の制限
いくつかの MFC 機能は DLL のバージョンは、技術的な制限のためのいずれか適用されませんまたはこれらのサービスは通常、アプリケーションで提供されているため。これらの制限事項を以下に示します:
DLL を構築
MFC に静的にリンクするレギュラー Dll をコンパイルすると、記号「_USRDLL」と「_WINDLL」を定義しなければなりません。あなたの DLL のコードは、次のコンパイラ スイッチもコンパイルする必要があります。:
動的に MFC にリンクするレギュラー Dll をコンパイルする場合、上記のシンボルを定義し、上記のコンパイラ スイッチを使用する必要があります。Additonally、シンボル"_AFXDLL"を定義する必要があり、あなたの DLL のコードをコンパイルする必要があります:
アプリケーションと DLL 間のインターフェイス (Api) は、明示的にエクスポートする必要があります。C インタ フェースを可能な限り付着低帯域にインターフェイスを定義することをお勧めします。直接 C インタ フェースがより複雑な C++ クラスより保守が容易です。
Api は、C と C++ の両方のファイル (DLL お客様 C++ プログラマに制限はありませんその方法) を含めることができます別のヘッダーを配置します。ヘッダー TRACEAPI を参照してください。Mfc サンプルの H DLLTRACE例。モジュール定義ファイルのEXPORTSセクションでを入力、関数をエクスポートするには、彼ら (。DEF) または__declspec(dllexport)を関数の定義が含まれます。用意されてを使用して実行可能ファイルのクライアントにこれらの関数をインポートするには。
DLL には、現在のモジュール状態を設定すると、MFC に動的にリンクする標準 Dll でエクスポートされた関数がすべての始まりでAFX_MANAGE_STATEマクロを追加する必要があります。これは、DLL からエクスポートされる関数の先頭に次のコード行を追加することによって行われます:
特価; & 特価(&N);
AFX_MANAGE_STATE (AfxGetStaticModuleState ())
特価; & 特価(&N);
WinMain gt;DllMain(&G)
MFC ライブラリでは、通常の MFC アプリケーションでCWinApp派生オブジェクトを初期化します標準の Win32 DllMainエントリ ポイントを定義します。InitInstanceメンバー関数は、通常の MFC アプリケーションでのすべての DLL 固有の初期化を配置します。
アプリケーションのメイン メッセージ ポンプを所有して以来CWinApp::Run機構は DLL には、適用されていないことに注意してください。DLL をモードレス ダイアログをもたらす独自のメイン フレーム ウィンドウがある場合は、アプリケーションのメイン メッセージ ポンプcwinapp::pretranslatemessageを呼び出し、DLL エクスポート ルーチンを呼び出す必要があります。
DLLTRACE サンプルこの関数の使用を参照してください。
DLL が読み込まれる前に、CWinApp の派生クラスは、MFC から呼び出されますのExitInstanceメンバ関数がDllMain関数を提供。
何それをすべて一緒にリンクするには
MFC に静的にリンクする標準 Dll (NAFXCWD。 このライブラリと DLL をリンクする必要があります。LIB、または NAFXCW。LIB) と呼ばれる C ランタイムのバージョンと共に ' LIBCMT。LIB'。これらのライブラリは既に組み込まれている、Visual C のセットアップを実行時に指定してインストールすることがあります。
サンプル コード
Mfc のサンプル プログラムを参照してください DLLTRACEサンプルを。これと呼ばれる単純な DLL が含まれています ' トレーサー。DLL' AFX トレース フラグ] ダイアログ (テクニカル ノート 7を参照) を実装します。ダイアログ ボックスを使用する DLL を呼び出す、単純な HELLO アプリケーションをも。
いくつかの興味深いことに注意してください。:
次の抽出 TRACEAPI から。静的に MFC にリンクされるレギュラー DLL に定義されている 1 つの API に必要な時間を示しています:
#ifdef _cplusplusextern"C"{#endifnbsp;・ ※ _cplusplus ※/構造体 TracerData{BOOL bEnabled;UINT をフラグ;};BOOL までパスカル エクスポート PromptTraceFlags (TracerData まで ※ 指定されて);#ifdef _cplusplus}#endif(&N)
この例では、宣言は C++ ユーザー 'extern"C"}' に囲まれています。これはいくつかの利点があります。まず、それを DLL の Api 使用可能な C++ 以外のクライアント アプリケーションでします。第二に、C++ の名前の修飾がエクスポート名に適用されませんので DLL のオーバーヘッドを削減します。最後に、それを明示的に追加する方が簡単になりますが。DEF ファイル (序数によるエクスポートの名前を修飾することについて心配することなくが。
すべての API 関数は、「これまでパスカルをエクスポート」です。ないというわけが Win32 Dll の必要なこれらの定義の簡単な移植の 16 ビット版の Windows に保管されています。Win32 の下で何も遠い、パスカル、およびエクスポートのマクロをすべてを展開します。
API で使用される構造は、MFC クラスから派生していないと、API ヘッダーで完全に定義されています。これは、DLL とアプリケーション間のインターフェイスの複雑さを緩和し、もう一度、DLL 使用 C プログラムからもできます。
API で使用される、データ ポインター明示的なFARポインターです。もう一度、遠いWin32 には、本当に必要はありませんがいつか将来 16 ビット Windows 用のコードをコンパイルする場合に便利です。
番号順テクニカル ノート|nbsp;カテゴリ別テクニカル ノート(&N)