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