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表明文件不存在或没有设置缺省语言
    {
      UINT oemcp=GetOEMCP();
      if(oemcp==)//简体中文
      {
          m_nSelectedLanguage=;
      }
      else
      {
        if (oemcp == )//繁体中文
        {
          m_nSelectedLanguage=;
          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=;
          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==)
      {
        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==)//繁体
        {
          m_hLanguageDLL=AfxLoadLibrary(_T("TraFaxQueryTraditonalResource.dll"));
          if(m_hLanguageDLL)
          {
            AfxSetResourceHandle(m_hLanguageDLL);
          }
          else
          {
            AfxMessageBox("Error: Cannot find component \"TraFaxQueryTraditonalResource.dll\"");
            return FALSE;
          }
      }
    }
  }
}
return TRUE;
}

MFC:AfxLoadLibrary-将指定的 DLL 映射到调用进程的地址空间的更多相关文章

  1. 图解MFC基本框架(深入消息映射机制)

    首先,先看整体的消息流向图: 上图解释: 起点是消息循环,在winmain函数中(mfc中winmain函数是隐含的调用的,在app全局对象构造完后紧接着调用winmain函数),while循环中不断 ...

  2. c++/MFC 封装好的文件内存映射类

    整理日: 2015年2月16日 首先介绍内存映射文件操作------函数的用法以及先后执行顺序 // 第一步:创建文件 HANDLE hFile = CreateFileForMapping(_T(& ...

  3. MFC浅析(7) CWnd类虚函数的调用时机、缺省实现

    CWnd类虚函数的调用时机.缺省实现 FMD(http://www.fmdstudio.net) 1. Create 2. PreCreateWindow 3. PreSubclassWindow 4 ...

  4. Windows提供了两种将DLL映像到进程地址空间的方法(隐式和显式)

    调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载 ...

  5. Windows提供了两种将DLL映像到进程地址空间的方法

    调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载 ...

  6. 将DLL挂接到远程进程之中(远程注入)

    线程的远程注入 要实现线程的远程注入必须使用Windows提供的CreateRemoteThread函数来创建一个远程线程该函数的原型如下:HANDLE CreateRemoteThread(    ...

  7. delphi dll创建及调用

    第一章 DLL简单介绍由于在目前的学习工作中,需要用到DLL文件,就学习了下,在这里作个总结.首先装简单介绍下DLL:1,减小可执行文件的大小DLL技术的产生有很大一部分原因是为了减小可执行文件的大小 ...

  8. 用IKVMC将jar转成dll供c#调用

    用IKVMC将jar转成dll供c#调用 ikvmc c# dll jar 用IKVMC将jar转成dll供c#调用 前言 ikvmc介绍 ikvmc下载安装 下载并解压 设置环境变量 jar-> ...

  9. Wow64(32位进程)注入DLL到64位进程

    转载自: https://blog.poxiao.me/p/wow64-process-inject-dll-into-x64-process/ 向其他进程注入DLL通常的做法是通过调用CreateR ...

随机推荐

  1. c#重写 重载

    重写:当一个子类继承一父类,而子类中的方法与父类中的方法的名称,参数个数.类型都完全一致时,就称子类中的这个方法重写了父类中的方法. 重写:通常,派生类继承基类的方法.因此,在调用对象继承方法的时候, ...

  2. 利用ant 和 Junit 生成测试报告

    我们除了使用java来直接运行junit之外,我们还可以使用junit提供的junit task与ant结合来运行. 涉及的几个主要的ant task如下: <junit>,定义一个jun ...

  3. 使用vs2019进行Linux远程开发

    通常,当我们开发Linux程序时有两种方案: 在Linux上直接编写程序并进行运行测试和调试 在Windows或Mac OS X上借助工具进行远程开发 虽然我自己是在Linux环境上直接进行开发的,但 ...

  4. 51nod 1278【贪心】

    主要这道题没有包含的情况,所以直接搞个左端,然后对于每个二分求一下>right的最近的位置j,那么ans就会增加 j 以后的: #include <cstdio> #include ...

  5. Unity3D命令行Build

    转自:http://www.cnblogs.com/gameprogram/archive/2012/05/11/2496303.html 本来是没想用这个命令行Build方式,可惜电脑不知道怎么的就 ...

  6. hdu1536(sg函数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1536 题意:首先输入K 表示一个集合的大小  之后输入集合 表示对于这对石子只能去这个集合中的元素的个 ...

  7. (十四)SpringBoot开发微信授权支付

    前提:配置好域名,在公众号配置 一.引用jar包,在pom.xml文件加入依赖 <dependency> <groupId>com.github.binarywang</ ...

  8. bzoj 4695: 最假女选手 && Gorgeous Sequence HDU - 5306 && (bzoj5312 冒险 || 小B的序列) && bzoj4355: Play with sequence

    算导: 核算法 给每种操作一个摊还代价(是手工定义的),给数据结构中某些东西一个“信用”值(不是手动定义的,是被动产生的),摊还代价等于实际代价+信用变化量. 当实际代价小于摊还代价时,增加等于差额的 ...

  9. 修正 FreeBSD 字体锯齿问题

    如果你给 FreeBSD 安装完图形界面,一登录就被满屏幕不论中英全是锯齿且残缺不堪入目的文字吓了一跳,那一定是安装了文泉驿字体.先不必急着卸载文泉驿,只需简单修改相关配置即可恢复正常显示.这是因为文 ...

  10. python+selenium问题随记

    1.用PhantomJS跑程序,莫名遇到有些元素的text不能读取,后来发现,PhantomJS运行时也需要最大化,不是全屏模式的话也和界面浏览器一样会造成压盖无法读取信息,开始以为是PhantomJ ...