计算机二级C技巧:VCMAKEINTRESOURCE析疑

发布时间:2011-08-29 共1页

  常常 看到对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类结合使用才有意义。

百分百考试网 考试宝典

立即免费试用