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 で MFC 拡張 DLL をクリーンアップできます。

AFX_EXT_CLASS

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

注釈

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

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

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

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

要件

ヘッダー:<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」を参照してください

注意

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

要件

ヘッダー:<afxstat_.h>

AfxOleInitModule

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

構文

void AFXAPI AfxOleInitModule( );

注釈

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

OLE コントロールを構築し、 COleControlModuleAfxOleInitModule を使用している場合は、 のメンバー関数が を呼び出すので、 を呼InitInstanceび出す必要COleControlModuleはありませんAfxOleInitModule

要件

ヘッダー: <afxdll_.h>

AfxNetInitModule

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

構文

void AFXAPI AfxNetInitModule( );

注釈

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

要件

ヘッダー:<afxdll_.h>

AfxGetAmbientActCtx

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

構文

BOOL AFXAPI AfxGetAmbientActCtx();

戻り値

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

注釈

フラグが設定され (既定値)、スレッドが MFC モジュールに入った場合 ( AFX_MANAGE_STATE「」を参照)、モジュールのコンテキストがアクティブになります。

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

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

要件

ヘッダー:<afxcomctl32.h>

AfxGetStaticModuleState

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

構文

AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );

戻り値

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

注釈

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

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

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

このマクロは、現在のモジュールの状態を、現在の AfxGetStaticModuleState スコープの末尾までから返された状態にスワップします。

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

要件

ヘッダー:<afxstat_.h>

AfxInitExtensionModule

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

構文

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

パラメーター

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

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

戻り値

TRUE MFC 拡張 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 があります。

  • を呼び AfxInitExtensionModule 出し、戻り値を確認します。

  • DLL が CDynLinkLibrary Structure オブジェクトをエクスポートする場合、またはCRuntimeClass独自のカスタム リソースを持つ場合は、 オブジェクトを作成します。

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

要件

ヘッダー:<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.
}

要件

ヘッダー:<afxcomctl32.h>

AfxTermExtensionModule

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

構文

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 では、 DllMain を呼び出す AfxInitExtensionModule 必要があります。 DLL がオブジェクトをエクスポート CRuntimeClass する場合、または独自のカスタムリソースがある場合は、で DllMain オブジェクトを作成 CDynLinkLibrary する必要もあります。

要件

ヘッダー:<afxdll_>

こちらもご覧ください

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