AfxLoadLibrary
使用 AfxLoadLibrary 映射 DLL 模块。
HINSTANCE AFXAPI AfxLoadLibrary(
LPCTSTR lpszModuleName
);
参数
lpszModuleName
指向包含模块的名称为 NULL 终止的字符串 (DLL 或 .exe 文件)。 指定名称是模块的文件名。如果该字符串指定路径,但该文件不存在于所指定的目录,则函数将失败。
如果未指定路径,并且文件扩展名省略,默认扩展 DLL 追加。 但是,文件名字符串可能包括尾部点字符 () 指示模块名称没有扩展名。 当未指定路径时,函数按下列顺序搜索的文件:
应用程序加载的内容。
当前目录。
Windows 95/98: windows 系统目录。 Windows NT: 32 位 windows 系统目录。 此目录的名称为 SYSTEM32。
Windows NT only: 16 位 windows 系统目录。 未获取此目录路径的 Win32 函数,但是,它将搜索。 此目录的名称是系统。
Windows 目录。
PATH 环境变量中列出的目录。
返回值
如果函数成功,则返回值是句柄模块。 如果函数失败,则返回值是空。
备注
它返回可用于 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