AfxLoadLibrary
DLL モジュールをマップするために AfxLoadLibrary を使用します。
HINSTANCE AFXAPI AfxLoadLibrary(
LPCTSTR lpszModuleName
);
パラメーター
lpszModuleName
モジュールの名前を含む null で終わる文字列へのポインター (.DLL または実行可能ファイル)。 指定した名前は、モジュールのファイル名です。文字列がパスを指定しても、ファイルは、指定したディレクトリに存在しない場合、この関数は失敗します。
パスを指定せずに、拡張子を省略すると、既定の拡張子は .DLL 付けられます。 ただし、ファイル名の文字列) で区切ります。モジュール名に拡張子がないことを示すために、後続の文字を含めることができます。 パスを指定しない場合、関数は次の順序でファイルの検索:
アプリケーションが読み込んだディレクトリ。
現在のフォルダー。
Windows 95/98: Windows のシステム ディレクトリ。 Windows NT: 32ビット Windows のシステム ディレクトリ。 このディレクトリの名前は SYSTEM32 です。
Windows NT only: 16 ビット Windows のシステム ディレクトリ。 このフォルダーへのパスを取得し、検索する Win32 関数はありません。 このディレクトリの名前はシステムです。
Windows ディレクトリ。
PATH 環境変数で指定されているディレクトリ。
戻り値
関数が成功した場合、戻り値はモジュールへのハンドルです。 関数が失敗した場合、戻り値は null です。
解説
これは、DLL 関数のアドレスを取得するに GetProcAddress に使用できるハンドルを返します。 またAfxLoadLibrary が別の実行可能モジュールをマップするために使用できます。
各プロセスは、それぞれの読み込まれたライブラリ モジュールの参照カウントを保持します。 この参照カウントが AfxLoadLibrary は常にデクリメントされた AfxFreeLibrary 呼び出される呼び出され、であるたびにインクリメントされます。 参照カウントがゼロに達すると、モジュールは、呼び出し元プロセスのアドレス空間から未割り当てになく、ハンドルは無効になります。
アプリケーションで複数のスレッドを使用する場合は、動的に拡張 DLL を読み込んだら AfxLoadLibrary と AfxFreeLibrary を使用してください (Win32 関数の LoadLibrary と FreeLibraryは機能します)。 AfxLoadLibrary と AfxFreeLibrary を使用して拡張 DLL に読み込まれ、アンロードされるグローバルな MFC の状態を破損しない場合に実行されるスタートアップ コードと終了することを保証します。
アプリケーションの AfxLoadLibrary を使用して動的に DLL バージョンの MFC にリンクする必要があります。; MFC は DLL としてアプリケーションにリンクされている場合にのみ AfxLoadLibraryのヘッダー ファイル、Afxdll_.h が含まれます。 これは、拡張 DLL を使用または作成する 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();
}
必要条件
ヘッダー: afxdll_.h