次の方法で共有


DLL を管理するためのマクロと関数

名前 説明
AFX_EXT_CLASS] クラスをエクスポートします。
AFX_MANAGE_STATE DLL でエクスポートされた関数を保護します。
AfxOleInitModule MFC に動的にリンクされている通常の MFC DLL から OLE サポートを提供します。
AfxNetInitModule MFC に動的にリンクされている通常の MFC DLL から MFC ソケットのサポートを提供します。
AfxGetAmbientActCtx モジュールごとの状態フラグの現在の状態を取得します。
AfxGetStaticModuleState 初期化前のモジュールの状態を設定し、クリーンアップ後に前のモジュールの状態を復元します。
AfxInitExtensionModule DLL を初期化します。
AfxSetAmbientActCtx MFC の WinSxS 動作に影響するモジュールごとの状態フラグを設定します。
AfxTermExtensionModule 各プロセスが DLL からデタッチされるときに、MFC 拡張機能 DLL をクリーンできるようにします。

AFX_EXT_CLASS

MFC 拡張 DLL では 、マクロ AFX_EXT_CLASS を使用してクラスをエクスポートします。MFC 拡張 DLL にリンクする実行可能ファイルは、マクロを使用してクラスをインポートします。

解説

このマクロを AFX_EXT_CLASS 使用すると、MFC 拡張 DLL のビルドに使用されるのと同じヘッダー ファイルを、DLL にリンクする実行可能ファイルと共に使用できます。

DLL のヘッダー ファイルで、次のようにクラスのAFX_EXT_CLASS宣言にキーワード (keyword)を追加します。

class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};

詳細については、「.」を使用したエクスポートとインポートを参照AFX_EXT_CLASSしてください

必要条件

Header:<afxv_dll.h>

AFX_MANAGE_STATE

DLL でエクスポートされた関数を保護するには、このマクロを呼び出します。

構文

AFX_MANAGE_STATE(AFX_MODULE_STATE* pModuleState )

パラメーター

pModuleState
構造体への AFX_MODULE_STATE ポインター。

解説

このマクロが呼び出されると、 pModuleState 即時に含まれるスコープの残りの部分の有効なモジュール状態になります。 スコープを離れると、以前の有効なモジュールの状態が自動的に復元されます。

構造体 AFX_MODULE_STATE には、モジュールのグローバル データ、つまり、プッシュまたはポップされるモジュール状態の部分が含まれています。

既定では、MFC はメイン アプリケーションのリソース ハンドルを使用して、リソース テンプレートを読み込みます。 DLL でダイアログ ボックスを起動する関数など、DLL にエクスポートされた関数がある場合、リソース テンプレートは DLL モジュールに格納されます。 正しいハンドルが使用されるようにモジュールの状態を必ず切り替えます。 関数の先頭に次のコードを追加することで、状態を切り替えることができます。

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

このマクロは、現在のモジュールの状態を、現在のスコープの最後まで AfxGetStaticModuleState 返された状態と入れ替えます。

モジュールの状態と MFC の詳細については、MFC モジュールの状態データの管理とテクニカル ノート 58 を参照してください。

Note

MFC は、アセンブリのアクティブ化コンテキストを作成するときに、コンテキストの作成とアクティブ化とAFX_MANAGE_STATE非アクティブ化に使用AfxWinInitします。 また AFX_MANAGE_STATE 、ユーザー DLL によって選択された適切なアクティブ化コンテキストで MFC コードを実行できるようにするために、MFC DLL と同様に、静的 MFC ライブラリに対しても有効になっていることに注意してください。 詳細については、「MFC モジュール状態でのアクティブ化コンテキストのサポート」を参照してください

必要条件

Header:<afxstat_.h>

AfxOleInitModule

MFC に動的にリンクされている通常の MFC DLL からの OLE サポートの場合は、MFC OLE DLL を初期化するために、通常の CWinApp::InitInstance MFC DLL の関数でこの関数を呼び出します。

構文

void AFXAPI AfxOleInitModule( );

解説

MFC OLE DLL は MFC 拡張 DLL です。MFC 拡張 DLL をチェーンに CDynLinkLibrary ワイヤードするには、それを使用するすべてのモジュールのコンテキストでオブジェクトを作成 CDynLinkLibrary する必要があります。 AfxOleInitModule は、通常の CDynLinkLibrary MFC DLL のオブジェクト チェーンにワイヤードされるように、通常の MFC DLL のコンテキストで CDynLinkLibrary オブジェクトを作成します。

OLE コントロールをビルドしていて使用COleControlModuleしている場合は、呼び出しのCOleControlModuleメンバー関数が原因でInitInstance呼び出AfxOleInitModuleAfxOleInitModuleさないでください。

必要条件

ヘッダー: <afxdll_.h>

AfxNetInitModule

MFC に動的にリンクされている通常の MFC DLL からの MFC ソケットのサポートの場合は、MFC ソケット DLL を初期化する通常の CWinApp::InitInstance MFC DLL の関数でこの関数の呼び出しを追加します。

構文

void AFXAPI AfxNetInitModule( );

解説

MFC ソケット DLL は MFC 拡張 DLL です。MFC 拡張 DLL をチェーンに CDynLinkLibrary ワイヤードするには、それを使用するすべてのモジュールのコンテキストでオブジェクトを作成 CDynLinkLibrary する必要があります。 AfxNetInitModule は、通常の CDynLinkLibrary MFC DLL のオブジェクト チェーンにワイヤードされるように、通常の MFC DLL のコンテキストで CDynLinkLibrary オブジェクトを作成します。

必要条件

Header:<afxdll_.h>

AfxGetAmbientActCtx

この関数を使用して、MFC の WinSxS 動作に影響するモジュールごとの状態フラグの現在の状態を取得します。

構文

BOOL AFXAPI AfxGetAmbientActCtx();

戻り値

モジュール状態フラグの現在の値。

解説

フラグが設定され (既定)、スレッドが MFC モジュールに入ると (参照 AFX_MANAGE_STATE)、モジュールのコンテキストがアクティブ化されます。

フラグが設定されていない場合、モジュールのコンテキストはエントリでアクティブになりません。

モジュールのコンテキストはマニフェストから決定され、多くの場合、モジュール リソースに埋め込まれます。

必要条件

Header:<afxcomctl32.h>

AfxGetStaticModuleState

初期化前にモジュールの状態を設定し、クリーンup 後に前のモジュールの状態を復元するには、この関数を呼び出します。

構文

AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );

戻り値

構造体への AFX_MODULE_STATE ポインター。

解説

構造体 AFX_MODULE_STATE には、モジュールのグローバル データ、つまり、プッシュまたはポップされるモジュール状態の部分が含まれています。

既定では、MFC はメイン アプリケーションのリソース ハンドルを使用して、リソース テンプレートを読み込みます。 DLL でダイアログ ボックスを起動する関数など、DLL にエクスポートされた関数がある場合、リソース テンプレートは DLL モジュールに格納されます。 正しいハンドルが使用されるようにモジュールの状態を必ず切り替えます。 関数の先頭に次のコードを追加することで、状態を切り替えることができます。

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

このマクロは、現在のモジュールの状態を、現在のスコープの最後まで AfxGetStaticModuleState 返された状態と入れ替えます。

モジュールの状態と MFC の詳細については、MFC モジュールの状態データの管理とテクニカル ノート 58 を参照してください。

必要条件

Header:<afxstat_.h>

AfxInitExtensionModule

MFC 拡張 DLL でこの関数を呼び出して、DLL DllMain を初期化します。

構文

BOOL AFXAPI AfxInitExtensionModule( AFX_EXTENSION_MODULE& state,  HMODULE hModule );

パラメーター

state
初期化後に AFX_EXTENSION_MODULE MFC 拡張 DLL モジュールの状態を格納する構造体 構造体への参照。 状態には、前に実行される通常の静的オブジェクト構築の一部として MFC 拡張 DLL によって初期化された DllMain ランタイム クラス オブジェクトのコピーが含まれます。

hModule
MFC 拡張 DLL モジュールのハンドル。

戻り値

TRUEMFC 拡張 DLL が正常に初期化された場合。それ以外の場合は . FALSE

解説

次に例を示します。

static AFX_EXTENSION_MODULE NVC_MFC_DLLDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    // Remove this if you use lpReserved
    UNREFERENCED_PARAMETER(lpReserved);

    if (dwReason == DLL_PROCESS_ATTACH)
    {
        TRACE0("NVC_MFC_DLL.DLL Initializing!\n");

        // MFC extension DLL one-time initialization
        if (!AfxInitExtensionModule(NVC_MFC_DLLDLL, hInstance))
            return 0;
...

AfxInitExtensionModule は DLL の HMODULE のコピーを作成し、DLL のランタイム クラス (CRuntimeClass 構造体) とそのオブジェクト ファクトリ (COleObjectFactory オブジェクト) をキャプチャして、オブジェクトの作成時に後 CDynLinkLibrary で使用できるようにします。 MFC 拡張 DLL は、その関数で次の 2 つの操作を DllMain 行う必要があります。

各プロセスが MFC 拡張 DLL からデタッチされたとき (プロセスが終了したとき、または DLL が呼び出AfxTermExtensionModuleしによってAfxFreeLibraryアンロードされるときに発生する) に、MFC 拡張 DLL をクリーンするために呼び出すことができます。

必要条件

Header:<afxdll_.h>

AfxSetAmbientActCtx

この関数を使用して、MFC の WinSxS 動作に影響するモジュールごとの状態フラグを設定します。

構文

void AFXAPI AfxSetAmbientActCtx(BOOL bSet);

パラメーター

bSet
モジュール状態フラグの新しい値。

解説

フラグが設定され (既定)、スレッドが MFC モジュールに入ると (参照 AFX_MANAGE_STATE)、モジュールのコンテキストがアクティブ化されます。 フラグが設定されていない場合、モジュールのコンテキストはエントリでアクティブになりません。 モジュールのコンテキストはマニフェストから決定され、多くの場合、モジュール リソースに埋め込まれます。

BOOL CMFCListViewApp::InitInstance()
{
   AfxSetAmbientActCtx(FALSE);
   // Remainder of function definition omitted.
}

必要条件

Header:<afxcomctl32.h>

AfxTermExtensionModule

この関数を呼び出して、各プロセスが DLL からデタッチされるときに (プロセスが終了したとき、または DLL が呼び出しによってAfxFreeLibraryアンロードされたときに) MFC 拡張 DLL をクリーンできるようにします。

構文

void AFXAPI AfxTermExtensionModule( AFX_EXTENSION_MODULE& state, BOOL bAll = FALSE );

パラメーター

state
MFC 拡張 DLL モジュールの AFX_EXTENSION_MODULE 状態を含む構造体への参照。

bAll
TRUE の場合、すべての MFC 拡張 DLL モジュールをクリーンします。 それ以外の場合は、現在の DLL モジュールのみをクリーンします。

解説

AfxTermExtensionModule では、モジュールに接続されているローカル ストレージが削除され、メッセージ マップ キャッシュからエントリが削除されます。 次に例を示します。

static AFX_EXTENSION_MODULE NVC_MFC_DLLDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    // Remove this if you use lpReserved
    UNREFERENCED_PARAMETER(lpReserved);

    if (dwReason == DLL_PROCESS_ATTACH)
    {
        TRACE0("NVC_MFC_DLL.DLL Initializing!\n");

        // MFC extension DLL one-time initialization
        if (!AfxInitExtensionModule(NVC_MFC_DLLDLL, hInstance))
            return 0;

        new CMyDynLinkLibrary(NVC_MFC_DLLDLL);

    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {
        TRACE0("NVC_MFC_DLL.DLL Terminating!\n");

        // Terminate the library before destructors are called
        AfxTermExtensionModule(NVC_MFC_DLLDLL);
    }
    return 1;   // ok
}

アプリケーションが MFC 拡張 DLL を動的に読み込んで解放する場合は、必ず呼び出 AfxTermExtensionModuleしてください。 ほとんどの MFC 拡張 DLL は動的に読み込まれないため (通常、それらはそれぞれのインポート ライブラリを介してリンクされます)、AfxTermExtensionModule の呼び出しは通常必要ありません。

MFC 拡張 DLL を呼び出すAfxInitExtensionModuleDllMain必要があります。 DLL がオブジェクトをエクスポートCRuntimeClassする場合、または独自のカスタム リソースがある場合はCDynLinkLibraryDllMain

必要条件

Header:<afxdll_.h>

関連項目

マクロとグローバル
AfxMessageBox
MFC モジュールの状態データの管理