当一个文件被映射到调用进程的地址空间时,GetModuleHandle函数得到其中某一模块的句柄。  
使用GetModuleHandle函数格式:
HMODULE GetModuleHandle( LPCTSTR lpModuleName);  
  
参数  lpModuleName:
    
[in]用指针指向一个包含模块名以NULL字符结尾的串,模块是.dll或.exe文件。如果文件扩展名省略,则增加默认的扩展名.dll。文件名串可以是省略号(...),表示模块名没有扩展名。这个串不是必须指定一个路径。当指定一个路径时,确定要用反斜线(\),而不是斜线(/)。这个模块名将和当前映射到调用进程地址空间的模块名进行独立地比较。    假如这个参数是NULL,函数将返回创建调用进程(.exe文件)的文件的句柄。 
 
返回值:  
如果函数调用成功,返回值是某一模块的句柄。  如果函数调用失败,返回NULL。要得知更多的出错信息,调用GetLastError。 
 
注释:
返回句柄不是全局的或可继承的。它不能被其它进程复制或使用。  假如lpModuleName没有包含路径,而且有多个相同的文件名和扩展名,将不能预测返回哪一个模块的句柄。要解决这个问题,需要指定路径。用side-by-side assemblies指定,或用GetModuleHandleEx来指定一个内存区而不是一个DLL名。  GetModuleHandle函数对一个映像的模块返回一个句柄,而不会增加引用(reference)数。然而,在传递这个句柄给FreeLibrary函数时,要当心,因为,这样传递会导致一个DLL模块过早地不能被映像。  这个函数在多线程程序中必须谨慎使用。不能保证这个模块句柄在函数返回时和使用时是有效的。比如,一个线程得到模块句柄,但在使用这个句柄之前,第二个线程释放了这个模块。假如这个系统载入另一个模块,它可以再次使用最近释放了的句柄。然而,第一个线程拥有一个模块的句柄,这个模块不同于先前那个模块。
 
 
GetModuleHandle和AfxGetInstanceHandle和CWinApp->m_hInstance的区别
在工作中遇到一个问题,就是在一个DLL中想改变这个DLL的窗口的ICON,于是写了如下的代码:
    HICON    hicon=LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_ICON1));
  if (hicon!=NULL)
  {
      LRESULT  result=SendMessage(m_hWnd,WM_SETICON,ICON_SMALL,(LPARAM)hicon);   
  }
   结果发现没有成功,hicon=NULL,调试发现是LastError=1813,说是找不到指定的资源。
后面换成了这样的代码就可以了:
         HICON    hicon=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON1));
  if (hicon!=NULL)
  {
      LRESULT  result=SendMessage(m_hWnd,WM_SETICON,ICON_SMALL,(LPARAM)hicon);   
  }
换成下面这种也可以:
         HICON    hicon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
  if (hicon!=NULL)
  {
      LRESULT  result=SendMessage(m_hWnd,WM_SETICON,ICON_SMALL,(LPARAM)hicon);   
  }
               
百思不得其解,后面查MSDN和网络,了解到是由于DLL的句柄跟Application的句柄混淆不清的原因,这里需要的是DLL的句柄。
 
1.GetModuleHandle(LPCTSTR lpModuleName)
   
  If this parameter is NULL, GetModuleHandle returns a handle to the file used to create the calling process (.exe file).
  如果参数为空,那么获取的就是调用这个DLL 的exe的 句柄,也即application句柄,而不是DLL的句柄
  如果要获得当前DLL的句柄,要传入DLL的名称即可。
2.AfxGetInstanceHandle()
  
   An HINSTANCE to the current instance of the application. If called from within a DLL linked with the USRDLL version of MFC, an HINSTANCE to the DLL is returned.
   返回的是一个application的句柄,但是如果这个函数是从一个MFC的USRDLL版本DLL的内部被调用,那么返回的就是这个DLL的句柄
3.CWinApp->m_hInstance
   
  The m_hInstance data member is a handle to the current instance of the application running under Windows. This is returned by the global function AfxGetInstanceHandle. m_hInstance is a public variable of type HINSTANCE.
  因为它是从 AfxGetInstanceHandle()返回来获得的,所以跟AfxGetInstanceHandle()的返回值一样。

GetModuleHandle,AfxGetInstanceHandle使用区别的更多相关文章

  1. CWnd中PreCreateWindow、PreSubclassWindow、SubclassWindow的区别

    http://blog.csdn.net/swimmer2000/archive/2007/10/30/1856213.aspx MFC(VC6.0)的CWnd及其子类中,有如下三个函数:     / ...

  2. LoadLibrary和GetModuleHandle

    0x01  区别 LoadLibrary是把一个模块映射进调用进程的地址空间,需要时增加引用计数,每调用一次,引用计数增加一,需要通过相同步骤地调用FreeLibrary来减少引用次数,当为0时,系统 ...

  3. 在EXE和DLL中,FindResource的区别

    转载:https://blog.csdn.net/ithzhang/article/details/7995102 在EXE和DLL中,FindResource的区别 以下的代码在EXE中,执行无误. ...

  4. c#与java的区别

    经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...

  5. jquery和Js的区别和基础操作

    jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...

  6. 【原】nodejs全局安装和本地安装的区别

    来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...

  7. 探究@property申明对象属性时copy与strong的区别

    一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...

  8. X86和X86_64和X64有什么区别?

    x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为&qu ...

  9. Java中Comparable与Comparator的区别

    相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...

随机推荐

  1. ThinkPadT440 Ubuntu14.04 RTL8192EE 链接无线网

    ThinkPadT440安装完 Ubuntu14.04之后,查看了以下内核版本为: 3.13.0-24-generic 1:通过ifconfig发现没有wlan0 2:通过 lspci -vnn | ...

  2. jQuery中的选择器《思维导图》

    学习jQuery的课程中,我对jQuery中的选择器有了更深的认识,它的简洁写法,完美的兼容性,可靠的处理机制,都让我们省了很多事, 下面是我在学习过程中对jQuery选择器写的思维导图(全屏查看:& ...

  3. j2ee概览

    J2EE诞生的背景是什么?Java 2平台企业版,也就是J2EE,定义了开发多层企业应用程序的标准.它的诞生并不是偶然的,它是在各种条件积累成熟之下的产物.原因之一:java语言的巨大成功.1994年 ...

  4. 结构体的sizeof

    首先有几条规则: 1. 结构体的成员相对于结构体的偏移量,是该成员所包含的最大简单类型(指占用内存数)的整数倍(如果该成员本身又是一个结构体,就要递归查找其简单类型,简单类型就是char short ...

  5. LeeCode-Single Number II

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  6. Unity 2DSprite

    Unity官方意识到在4.3版本之前,并没有自带的支持2D游戏工具,商店里面有很多有名2D插件Uni2D,2DToolkit,在4.3版本之后就出现UISprite精灵来支持2D游戏开发,我用这个很多 ...

  7. Sublime Text 2 介紹

    代码编辑器或者文本编辑器,对于程序猿来说,就像剑与战士一样,谁都想拥有一把能够随心驾驭且瑞丽无比的宝剑,而每一位程序猿,相同会去追求最适合自己的强大.灵活的编辑器,相信你和我一样,都不会例外. 我用过 ...

  8. PHP: configure: error: mysql configure failed. Please check config.log for more information.

    为php增加mysql模块时报错 configure: error: mysql configure failed. Please check config.log for more informat ...

  9. 克隆虚拟机,如何将克隆虚拟的网卡设置为eth0

    1.先删掉/etc/udev/rules.d/70-persistent-net.rules文件里的eth0,并要记住eth1的那个网卡的mac地址等下要用.2.把那个eth1修改为eth03.编辑网 ...

  10. 百度搜索附近加盟店等基于LBS云搜索功能的实现

    一.注册百度账号,进入开发者平台 创建应用并获取ak 地址如下 http://lbsyun.baidu.com/apiconsole/key/update?app-id=7546025 ok获取到了. ...