次の方法で共有


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を使用したエクスポートとインポート」を参照してください。

要件

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

要件

Header:<afxstat_.h>

AfxOleInitModule

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

構文

void AFXAPI AfxOleInitModule( );

解説

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

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

要件

ヘッダー: <afxdll_.h>

AfxNetInitModule

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

構文

void AFXAPI AfxNetInitModule( );

解説

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

要件

Header:<afxdll_.h>

AfxGetAmbientActCtx

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

構文

BOOL AFXAPI AfxGetAmbientActCtx();

戻り値

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

解説

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

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

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

要件

Header:<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を参照してください。

要件

Header:<afxstat_.h>

AfxInitExtensionModule

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

構文

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

パラメーター

state
初期化後に MFC 拡張 DLL モジュールの状態を格納する AFX_EXTENSION_MODULE 構造体 構造体への参照。 状態には、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 のコピーを作成し、後でCDynLinkLibrary オブジェクトが作成されるときに使用するために、DLL のランタイム クラス (CRuntimeClass構造体) とそのオブジェクト ファクトリ (COleObjectFactory オブジェクト) をキャプチャします。 MFC 拡張 DLL は、 DllMain 関数で次の 2 つの操作を行う必要があります。

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

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

AfxTermExtensionModuleを呼び出して、各プロセスが MFC 拡張 DLL からデタッチされたとき (プロセスが終了したとき、または DLL が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 は、DllMainAfxInitExtensionModuleを呼び出す必要があります。 DLL がオブジェクトCRuntimeClassエクスポートする場合、または独自のカスタム リソースがある場合は、DllMainCDynLinkLibrary オブジェクトを作成する必要もあります。

要件

Header:<afxdll_.h>

関連項目

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