MFC:AfxLoadLibrary-将指定的 DLL 映射到调用进程的地址空间

Visual Studio 2012 - Visual C++
LoadLibrary 和 AfxLoadLibrary

 

进程调用 LoadLibrary (或 AfxLoadLibrary) 以显式链接到 DLL。 如果函数成功,它将指定的 DLL 映射到调用进程的地址空间中并返回句柄可用于其他功能在显式链接 (例如、GetProcAddress 和 FreeLibrary的 DLL。

LoadLibrary 尝试定位 DLL 可以使用隐式链接的相同搜索顺序。 如果系统无法找到所需的 DLL 或者入口点函数返回 FALSE,则 LoadLibrary 将返回 NULL。 如果对 LoadLibrary 的调用中指定已映射到调用的地址空间的 DLL 模块过程,该函数将返回该 DLL 的句柄并递增模块的引用数。

如果 DLL 具有入口点函数,则操作系统将在调用 LoadLibrary 的线程的上下文中调用此函数。 入口点函数没有调用 DLL 已经附加到进程,则由于没有相应的调用于 FreeLibrary 功能以前的调用 LoadLibrary

对于加载扩展 DLL 的 MFC 应用程序,建议使用 AfxLoadLibrary,而不使用 LoadLibrary 在调用 LoadLibrary 之前,AfxLoadLibrary 处理线程同步。 AfxLoadLibrary 的接口(函数原型)与 LoadLibrary 相同。

如果 Windows 无法加载 DLL,则进程会尝试从错误中恢复。 例如,进程会通知用户所发生的错误,并要求用户指定 DLL 的其他路径。

 

安全说明:

如果代码是运行在 Windows NT、Windows 2000 或 Windows XP 下 (SP1 以前),请确保为所有 DLL 指定完整路径。 在这些操作系统中,加载文件时会首先搜索当前目录。 如果没有限定文件的路径,而不是预期的一个的文件被加载。

 

 

例:

.h:

HMODULE m_hLanguageDLL;//用于保存语言的资源句柄
int m_nSelectedLanguage;//用于保存当前所选择的语种,0为没有设置1为简体中文2为英语

.cpp

BOOL CTraFaxReportApp::InitLanguageResource()
{
  if (!QuerySelectedLanguage())
  {
    return FALSE;
  }
  else
  {
    if(m_nSelectedLanguage==0)//如果为0表明文件不存在或没有设置缺省语言
    {
      UINT oemcp=GetOEMCP();
      if(oemcp==936)//简体中文
      {
          m_nSelectedLanguage=1;
      }
      else
      {
        if (oemcp == 950)//繁体中文
        {
          m_nSelectedLanguage=3;
          m_hLanguageDLL=AfxLoadLibrary(_T("TraFaxQueryTraditonalResource.dll"));
          if(m_hLanguageDLL)
          {
             AfxSetResourceHandle(m_hLanguageDLL);
          }
          else
          {
            AfxMessageBox("Error: Cannot find component \"TraFaxQueryTraditonalResource.dll\"");
            return FALSE;
          }
        }
        else
        {    
          m_nSelectedLanguage=2;
          m_hLanguageDLL=AfxLoadLibrary(_T("TraFaxReportEnglishResource.dll"));
          if(m_hLanguageDLL)
          {
            AfxSetResourceHandle(m_hLanguageDLL);
          }
          else
          {
            AfxMessageBox("Error: Cannot find component \"TraFaxReportEnglishResource.dll\"");
            return FALSE;
          }
        }
      }
      SetSelectedLanguageToFile(m_nSelectedLanguage);
    }
    else
    {
      if(m_nSelectedLanguage==2)
      {
        m_hLanguageDLL=AfxLoadLibrary(_T("TraFaxReportEnglishResource.dll"));
        if(m_hLanguageDLL)
        {
          AfxSetResourceHandle(m_hLanguageDLL);
        } 
        else
        {    
          AfxMessageBox("Error: Cannot find component \"TraFaxReportEnglishResource.dll\"");
          return FALSE;
        }
      }    
      else
      {
        if (m_nSelectedLanguage==3)//繁体
        {
          m_hLanguageDLL=AfxLoadLibrary(_T("TraFaxQueryTraditonalResource.dll"));
          if(m_hLanguageDLL)
          {
            AfxSetResourceHandle(m_hLanguageDLL);
          }
          else
          {
            AfxMessageBox("Error: Cannot find component \"TraFaxQueryTraditonalResource.dll\"");
            return FALSE;
          }
      }
    }
  }
}
return TRUE;
}

 

posted @ 2013-10-16 11:00  CPYER  阅读(1551)  评论(0编辑  收藏  举报