AfxLoadLibrary
DLL モジュールを割り当てるに AfxLoadLibrary を使用します。
HINSTANCE AFXAPI AfxLoadLibrary(
LPCTSTR lpszModuleName
);
パラメーター
lpszModuleName
モジュールの名前を含む終了文字列へのポインター (.DLL または .exe ファイル)。指定された名前は、モジュールのファイル名です。文字列がパスを指定する場合は、ファイルが指定されたディレクトリにない場合、関数は失敗します。
パスが指定されず、拡張子を省略すると、既定の拡張子は .DLL 追加されます。ただし、ファイル名の文字列 ()。モジュール名に拡張子がないことを示すために、後続のポイントの文字を含めることができます。パスを指定しないと、関数は次のシーケンスのファイルを検索します:
アプリケーションの読み込みしたディレクトリ。
現在のフォルダー。
Windows 95/98: Windows のシステム ディレクトリ。Windows NT: 32ビット Windows のシステム ディレクトリ。このディレクトリの名前は SYSTEM32 です。
Windows NT only: 16 ビット Windows のシステム ディレクトリ。このディレクトリのパスを取得し、検索する Win32 関数はありません。このディレクトリの名前は、システムです。
Windows ディレクトリ。
パス環境変数に示されているディレクトリ。
戻り値
関数が正常に終了した場合、戻り値はモジュールへのハンドルです。関数が失敗した場合、戻り値の null である。
解説
これは、 DLL の関数のアドレスの取得に GetProcAddress で使用できるハンドルを返します。またAfxLoadLibrary が他の実行可能モジュールをマップするために使用できます。
各プロセスは、読み込まれた各ライブラリのモジュールの参照カウントを保持します。この参照カウントは AfxLoadLibrary は常にデクリメントされた AfxFreeLibrary 呼び出され、で呼び出されるたびにインクリメントします。参照カウントがゼロに達すると、モジュールが呼び出しプロセスのアドレス空間からサイトマップになく、ハンドルは無効になります。
アプリケーションが複数のスレッドを使用する場合は、動的に拡張 DLL を読み込んだら AfxLoadLibrary と AfxFreeLibrary を指定してください (Win32 の代わりに LoadLibrary と FreeLibraryは機能します)。AfxLoadLibrary と AfxFreeLibrary を使用して拡張 DLL の読み込みまたはアンロード グローバルな MFC の状態を破損しない場合に実行する起動および終了コードがすることを保証します。
アプリケーションの AfxLoadLibrary を使用して動的に MFC DLL バージョンにリンクするように要求します; MFC が DLL としてアプリケーションにリンクされている場合にのみ AfxLoadLibraryのヘッダー ファイル、 Afxdll_.h は、含まれます。これは、デザインによって拡張ダイナミック リンク ライブラリを使用または作成する MFC DLL バージョンにリンクする必要があるためです。
使用例
// The following shows how to create a MDI based application
// using a generic CView derived class that is implemented in
// a dynamically loaded MFC Extension DLL.
typedef CRuntimeClass * (*GETDLLVIEW)();
BOOL CUserApp::InitInstance()
{
// Standard Application Wizard generated initialization excluded.
...
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views
//Load MFC Extension DLL based view class.
m_hViewDll = AfxLoadLibrary(szMyViewDllPath);
if (!m_hViewDll)
{
CString str;
str.Format(_T("Error: Cannot find component %s"), szMyViewDllPath);
AfxMessageBox(str);
return FALSE;
}
GETDLLVIEW GetMyView = (GETDLLVIEW)GetProcAddress(m_hViewDll, "GetMyView");
ASSERT(GetMyView != NULL);
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_NVC_MFC_DLLUserTYPE,
RUNTIME_CLASS(CUserDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
GetMyView());
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
// Standard Application Wizard generated initalization excluded.
...
return TRUE;
}
int CUserApp::ExitInstance()
{
if (NULL != m_hViewDll)
{
AfxFreeLibrary(m_hViewDll);
m_hViewDll = NULL;
}
return CWinApp::ExitInstance();
}
必要条件
Header: afxdll_.h