AfxLoadLibrary
使用 AfxLoadLibrary對應 DLL 模組。
HINSTANCE AFXAPI AfxLoadLibrary(
LPCTSTR lpszModuleName
);
參數
lpszModuleName
包含模組名稱以 Null 結束之字串的點 (.dll 或 .exe 檔)。 指定的名稱是模組的檔名。如果字串指定路徑,但檔案不存在於指定的目錄,函式失敗。
如果沒有指定路徑,而且副檔名省略,預設副檔名附加 .dll。 不過, filename 字串可能包含尾端點字元 (.) 表示模組名稱沒有副檔名。 當沒有指定路徑,函式依照下列順序搜尋檔案:
應用程式載入的目錄。
目前的目錄。
Windows 95/98: Windows 系統目錄。 Windows NT: 32 位元 Windows 系統目錄。 此目錄名稱為 SYSTEM32。
Windows NT only: 16 位元 Windows 系統目錄。 無法取得這個目錄路徑的 Win32 函式,不過,它會搜尋。 此目錄名稱為 SYSTEM。
Windows 目錄。
列於 PATH 環境變數的目錄。
傳回值
如果函式成功,則傳回值是控制代碼模組。 如果函式失敗,則傳回值為 NULL。
備註
它會傳回可用於 GetProcAddress 取得 DLL 函式的位址的控制代碼。 AfxLoadLibrary 也可用來對應其他可執行模組。
每個處理序會維護每個載入的程式庫模組的參考次數。 每次呼叫 AfxLoadLibrary 且為每次遞減 AfxFreeLibrary 的呼叫,此參考計數會遞增。 在參考計數達到零時,模組從呼叫處理序的位址空間是未對應,且控制代碼不再有效。
請務必使用 AfxLoadLibrary 和 AfxFreeLibrary (而不是 Win32 函式 LoadLibrary 和 FreeLibrary),如果您的應用程式使用多執行緒,然後,如果動態載入擴充 DLL。 使用 AfxLoadLibrary 和 AfxFreeLibrary,可確保載入或卸載擴充 DLL 時所執行的開機與關機程式碼不會毀損全域 MFC 狀態。
使用應用程式的 AfxLoadLibrary 需要與 MFC DLL 版本動態連接;如果 MFC 與應用程式連接為 DLL, AfxLoadLibrary的標頭檔, Afxdll_.h,只會包含在內。 這是根據設計,因為您必須與 MFC DLL 版本連接使用或建立的擴充 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