当一个文件被映射到调用进程的地址空间时,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. Window 点击“X”关闭之后无法show

    将Window的属性closeAction设置为hide就可以了. var panel1 = Ext.create('Ext.panel.Panel', { title: 'this is panel ...

  2. 如何清空android ListView控件的内容

    第一种方法: listView.setAdapter(null); 第二种方法: listAdapter.clear(); listAdapter.notifyDataSetChanged() ; 满 ...

  3. Maximum Subarray 解答

    Question Find the contiguous subarray within an array (containing at least one number) which has the ...

  4. InternetExplorer 表单及用户名密码提交

    陆ftp或者其他类似需要输入密码的站点,可以在url中直接输入用户名密码,格式为: ftp://username:password@url 另外一种情况是,如果是表单提交的也可以通过url填写,如: ...

  5. 【SDUT 3038】迷之博弈

    action=showproblem&problemid=3038">[SDUT 3038]迷之博弈 简直就是上次省赛的缩减版... 仅仅只是这个是链 省赛是环. ..1 2先 ...

  6. 【DataStructure】Some useful methods about linkedList(二)

    Method 1: Add one list into the other list. For example, if list1is {22, 33, 44, 55} and  list2 is { ...

  7. nomasp 博客导读:Android、UWP、Algorithm、Lisp(找工作中……

    Profile Introduction to Blog 您能看到这篇博客导读是我的荣幸.本博客会持续更新.感谢您的支持.欢迎您的关注与留言.博客有多个专栏,各自是关于 Android应用开发 .Wi ...

  8. Android Studio虚拟机配置虚拟键盘

    1. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2pjMjExMzIy/font/5a6L5L2T/fontsize/400/fill/I0JBQkF ...

  9. android——ObjectAnimator动画

    在新的android sdk中谷歌为我们提供了新的动画实现方式.化繁为简.将以前的animation动画进一步封装,使用起来更加方便. 先来看XML文件: <RelativeLayout xml ...

  10. Android studio教程:[4]真机测试

    有了Android studio这么好用的软件,自然要有一部不错的安卓手机,然后在真机上测试自己的程序,那样才能更好的发现程序中存在的问题,毕竟模拟器不是真正的手机嘛. 工具/原料 Android s ...