MFC DLL中加载图标


       图标是MFC工程中资源的一种,应用程序中的图标资源可以直接使用LoadImage来获得,在添加图标资源到工程中,然后使用下面语句就可以获得HICON。
  1// AfxGetApp()->m_hInstance用来获得应用程序实例的句柄<BR>// MAKEINTRESOURCE用来将一个资源的ID转化成字符串<BR>// IMAGE_ICON为资源的类型<BR>// 17, 14为图片大小<BR>HICON hIcon = (HICON)::LoadImage( AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_CLOSE), IMAGE_ICON, 17, 14, 0 ); <BR>
  01这样就可以把HICON设置给ImageList,然后用在控件上。<BR>但是如果工程类型是一个DLL的话,这么用就有问题了,因为资源在动态链接库里,AfxGetApp()->m_hInstance获得的是调用该DLL的应用程序的句柄,而不是该<BR>DLL的Handle。这样LoadImage就会去应用程序的资源里面寻找图标IDI_CLOSE,当然会找不到,所以返回的hIcon会为空。使用GetLastError函数,会得到错误1813。<BR>我们调试的时候会发现,AfxGetApp()->m_hInstance返回的handle跟DLL 中DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) 函数传入<BR>的hInstance值是不一样的。DllMain中传入的hInstance才是我们要的DLL的handle。 不过我们可以通过DLL名称来获取它的handle<BR><DIV class=cnblogs_Highlighter><PRE class=brush:cpp;gutter:true;> CString strModuleName = _T("ModuleUD.dll");  // DLL的文件名<BR>  // debug 模式和release模式生成的DLL名称不一样,由于是中文环境,一般都设置了UNICODE<BR>   #ifdef _MSC_VER
  02#ifdef _DEBUG
  03strModuleName = _T("ModuleUD.dll");
  04#else
  05strModuleName = _T("ModuleU.dll");
  06#endif
  07#endif
  08
  09HINSTANCE hInstance = GetModuleHandle(strModuleName);
  10HICON hIcon = (HICON)::LoadImage(hInstance, MAKEINTRESOURCE(IDI_CLOSE), IMAGE_ICON, 17, 14, 0);
  11</PRE>
  12</DIV>

///
在不使用MFC的DLL中怎么得到HINSTANCE?

想做钩子程序,但它需要一个参数HINSTANCE,我看了一下只有AfxGetInstanceHandle可以得到,但是我的程序又没使用MFC,请问怎么解决呢?

如果是线程钩子HINSTANCE=0就可以, 
如果是系统购子就必须使用dll

GetModuleHandle

我这样用的: 

hins   =   GetModuleHandle(NULL);       //返回值非NULL 
HHOOK   hkb   =   SetWindowsHookEx(WH_KEYBOARD,   (HOOKPROC)KeyboardProc,   hins,   0); 
dwError   =   GetLastError();               //dwError为6,句柄无效 

dwError值为6,   句柄无效 

…… 
DLLMain中把句柄保存起来不就完了
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值