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
呼び出AfxOleInitModule
AfxOleInitModule
さないでください。
必要条件
ヘッダー: <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 モジュールのハンドル。
戻り値
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
する場合、または独自のカスタム リソースがある場合は、オブジェクトを作成します。
各プロセスが 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 を呼び出すAfxInitExtensionModule
DllMain
必要があります。 DLL がオブジェクトをエクスポートCRuntimeClass
する場合、または独自のカスタム リソースがある場合はCDynLinkLibrary
DllMain
、
必要条件
Header:<afxdll_.h>