September 18, 2004

USES_CONVERSION

For use of ATL String Convert macros in your project... you must be use of this macro (USES_CONVERSION;) and add #include <atlbase.h> to your project.

USES_CONVERSION چيه؟به مثال زير نگاه کنيد

void func( LPSTR lpsz ) 
{ 
  USES_CONVERSION; 
  ... 
  LPWSTR x = A2W(lpsz) 
  // Do something with x 
  ... 
}

هنگامي که از مبدل هاي string يي ATL استفاده مي کنيد بايد براي جلوگيري از Compile Error از اين دستور مسخره استفاده کنيد. مثل زير

HRESULT CCompData::OnPreLoad(LPDATAOBJECT lpDataObject, LPARAM arg, LPARAM param) 
{ 
  USES_CONVERSION; 
  LPOLESTR wszName = NULL; 
  const _TCHAR *pszName = m_pStaticNode->GetDisplayName(); 
  wszName = (LPOLESTR)T2COLE(pszName); 
  ... 
}

مثلا T2COLE يک ATL macro باحاله که مي تونه String Poniter مانند LPCTSTR و محتوياتش رو به LPCOLESTR تبديل کنه و براي استفاده از اون تنها کافيست که USES_CONVERSION استفاده کنيد.

// use it to call OLE here
USES_CONVERSION;
pI->SomeFunctionThatNeedsUnicode(T2OLE(lpszA));
... براي اينکه ماکروهاي اين چنيني براي دسترسي به فضاهاي Temp از local variable هايي با نام convert_ استفاده مي کنند که بااحضار ماکروي USES_CONVERSION مشکل استفاده از اون ها حلله .. مثل مثال بالا.... ماکروهاي مبدل عمومي مانند زيرند:
Generic Conversion Macros
A2CW (LPCSTR) -> (LPCWSTR)
A2W (LPCSTR) -> (LPWSTR)
W2CA (LPCWSTR) -> (LPCSTR)
W2A (LPCWSTR) -> (LPSTR)
OLE Conversion Macros
T2COLE (LPCTSTR) -> (LPCOLESTR)
T2OLE (LPCTSTR) -> (LPOLESTR)
OLE2CT (LPCOLESTR) -> (LPCTSTR)
OLE2T (LPCOLESTR) -> (LPCSTR)
Other Considerations
و يه عالمه ديگه
حالا اومديد و استفاده کرديد ديديد که هر چي ميزنيد Compile ... خطا مي ده ...
خب بدبخت حق داره بايد Header مربوطه رو بهش Add کنيد دیگه ...
آره مي دونم MSDN رو زير و رو کرديد ولي پيدا نشده ... عصباني نباشيد .. مايکروسافتِ ديگه ... شعورش که نمي رسه ... شما ببخشيدش ... Header اش اينه
#include <atlbase.h>
بذاريد بالاي برنامه و تموم.

1 comment:

Anonymous said...

Thanks for this Brief and crisp information about USES_CONVERSION