关于MAKEINTRESOURCE宏

1 百度百科解释

MAKEINTRESOURCE是一个资源名转换的宏,

  VC的定义是(winuser.h):  #define MAKEINTRESOURCEA(i) (LPSTR)((ULONG_PTR)((WORD)(i)))  #define MAKEINTRESOURCEW(i) (LPWSTR)((ULONG_PTR)((WORD)(i)))  #ifdef UNICODE  #define MAKEINTRESOURCE MAKEINTRESOURCEW  #else  #define MAKEINTRESOURCE MAKEINTRESOURCEA  #endif // !UNICODE  这个宏是把一个数字类型转换成指针类型的宏,它不存在释放的问题.  用这个宏的主要原因是有的资源是用序号定义的,而不是字符串.所以要把数字转换成字符串指针,然后再传递给LoadResource之类的函数,这样才加载了资源.  要释放资源(用LoadResource加载的)可以调用FreeResource函数把LoadResource返回的指针传递给FreeResource.  MAKEINTRESOURCE 的作用:  是把一个"数字形ID",转化为"字符串".但是执行前后,输入的数据的内容和长度是不变的!它只不过就是C语言里面"强制类型转换"而已.  请看 Winuser.h 代码:  #define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))  #define MAKEINTRESOURCEW(i) (LPWSTR)((DWORD)((WORD)(i)))  #ifdef UNICODE  #define MAKEINTRESOURCE MAKEINTRESOURCEW  #else  #define MAKEINTRESOURCE MAKEINTRESOURCEA  #endif // !UNICODE  现在,再来归纳它的用法.就用FindResource来说明.(这个函数与MFC的AfxFindResourceHandle)  HRSRC FindResource(  HMODULE hModule, // module handle  LPCTSTR lpName, // resource name  LPCTSTR lpType // resource type  );  就是lpName参数需要使用MAKEINTRESOURCE ,因为它需要LPCTSTR类型的参数输入.那么,情况就很清楚了.凡涉及"资源"的API或者MFC类,在参数类型为LPCTSTR时,就应该使用 MAKEINTRESOURCE.这是针对"资源名字"为"数字类型"时的情况.

 

2  一点说明  (转载)http://www.zxbc.cn/html/20080906/65318.html

MAKEINTRESOURCE 把数字转换成字符串(字符指针) 

常常 看到对MAKEINTRESOURCE的疑问,认为怎么能把一个整数转化一个指向字符串的指针?下面是这个宏的定义。 
#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i)))) 
#define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i)))) 


为什么能把一个一个ID号转化一个字符串指针,理论是不成立的,因为如果将其转化,将会是系统不允许的一内存空间。 
实际上这个宏是配合CString 一起来用的。如果单独用这个宏来输出字符串,比如AfxMessageBox(MAKEINTRESOURCEA(ID))根本不会是你所想要的字符串输出。 

无论是CString 的构造函数还是赋值运算符都会对这个输入的地址值做一个处理。 
就是调用CheckImplicitLoad来判断是否是字符串指针还是资源ID.CheckImplicitLoad的源代码如下。 

bool CheckImplicitLoad( __in_opt const void* pv ) 

bool bRet = false; 

if( (pv != NULL) && IS_INTRESOURCE( pv ) ) 

UINT nID = LOWORD( reinterpret_cast< DWORD_PTR >( pv ) ); 
if( !LoadString( nID ) ) 

ATLTRACE( atlTraceString, 2, _T( "Warning: implicit LoadString(%u) failed\n" ), nID ); 

bRet = true; 



return( bRet ); 


其中宏IS_INTRESOURCE 的定义是#define IS_INTRESOURCE(_r) ((((ULONG_PTR)(_r)) >> 16) == 0) 
也就是说判断pv的值是否小于0x10000,如果小于这个值,证明是一个资源ID,则将指针强制转换为资源ID,并从资源中加载字符串;如果不是,则认为是一个字符串指针。 

我想 MAKEINTRESOURCE 的作用在于与CString的参数类型兼容。如果是资源ID作一次转化内部还是会将其转化回来。 
结论,MAKEINTRESOURCE 一定要和CString类结合使用才有意义。

3 VC6中 资源ID的范围是0--65535 ( WORD para) 因此大于65536的都认为是字符串,小于65536的都是资源ID。



关于MAKEINTRESOURCE宏 - 大灰狼 - 大灰狼 的博客?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值