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 调用,则引用计数递增。 当引用计数达到零时,模块从调用的地址空间是未映射处理,并且处理不再有效。

请确保使用 AfxLoadLibraryAfxFreeLibrary (而不是 Win32 函数 LoadLibraryFreeLibrary),如果应用程序使用多个线程,并且,如果它动态加载扩展 DLL。 使用 AfxLoadLibraryAfxFreeLibrary 确保执行的启动和关闭代码扩展 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

请参见

参考

AfxFreeLibrary

概念

MFC宏和Globals