精品理论电影在线_日韩视频一区二区_一本色道精品久久一区二区三区_香蕉综合视频

計算機二級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類結合使用才有意義。

百分百考試網 考試寶典

立即免費試用