AfxLoadLibrary
DLL モジュールを割り当てるには、AfxLoadLibrary を使用します。
HINSTANCE AFXAPI AfxLoadLibrary(
LPCTSTR lpszModuleName
);
パラメーター
lpszModuleName
モジュール (.DLL または .EXE ファイルのどちらか) の名前が入っている NULL で終わる文字列へのポインター。 指定された名前は、モジュールのファイル名です。文字列にパスが含まれているにもかかわらず、ファイルが指定されたフォルダーに存在しない場合、関数は失敗します。
パスもファイル名の拡張子も指定されていない場合、既定の拡張子の .DLL が付加されます。 ただし、ファイル名文字列は、モジュール名に拡張子がないことを示すピリオド文字 (.) を含めることができます。 パスが指定されない場合、関数は、以下の順番でファイルを検索します。
アプリケーションが読み込まれたフォルダー。
現在のフォルダー。
**Windows 95/98:**Windows システム フォルダー。 **Windows NT:**32 ビット Windows のシステム ディレクトリ。 このフォルダーの名前は SYSTEM32 です。
**Windows NT の場合のみ:**16 ビット Windows のシステム ディレクトリ。 このフォルダーのパスを取得する Win32 関数はありませんが、検索の対象になります。 このフォルダーの名前は SYSTEM です。
Windows ディレクトリ。
PATH 環境変数に設定されているフォルダー。
戻り値
正常終了した場合は、モジュールへのハンドルを返します。 関数が失敗したときは、NULL が戻り値となります。
解説
この関数は、DLL 関数のアドレスを取得するために GetProcAddress で使用できるハンドルを返します。 AfxLoadLibrary は、他の実行モジュールを割り当てるためにも使用されます。
各プロセスは、読み込まれたライブラリ モジュールごとに参照カウントを持っています。 この参照カウントは、AfxLoadLibrary が呼び出されるたびにインクリメントされ、AfxFreeLibrary が呼び出されるたびにデクリメントされます。 参照カウントが 0 になると、モジュールが呼び出しプロセスのアドレス領域から解放され、ハンドルが無効になります。
アプリケーションでマルチスレッドを使用し、動的に拡張 DLL を読み込む場合、FreeLibrary Win32 関数および LoadLibrary Win32 関数の代わりに、必ず AfxFreeLibrary と AfxLoadLibrary を使用する必要があります。 AfxLoadLibrary と AfxFreeLibrary を使用することによって、拡張 DLL の読み込みまたはアンロード時に実行されるスタートアップ コードと終了コードが、グローバルな MFC の状態を破損するのを防ぎます。
アプリケーションで AfxLoadLibrary を使用すると、ユーザーは MFC の DLL バージョンへ動的にリンクする必要があります。つまり、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