AfxLoadLibrary
更新 : 2007 年 11 月
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