设为首页 加入收藏

TOP

常用数据类型使用转换详解(二)
2014-11-23 20:15:01 来源: 作者: 【 】 浏览:168
Tags:常用 数据 类型 使用 转换 详解
TE FAR* pdate; // VT_BYREF|VT_DATE.
  BSTR FAR* pbstrVal; // VT_BYREF|VT_BSTR.
  IUnknown FAR* FAR* ppunkVal; // VT_BYREF|VT_UNKNOWN.
  IDispatch FAR* FAR* ppdispVal; // VT_BYREF|VT_DISPATCH.
  SAFEARRAY FAR* FAR* pparray; // VT_ARRAY|*.
  VARIANT FAR* pvarVal; // VT_BYREF|VT_VARIANT.
  void FAR* byref; // Generic ByRef.
  char cVal; // VT_I1.
  unsigned short uiVal; // VT_UI2.
  unsigned long ulVal; // VT_UI4.
  int intVal; // VT_INT.
  unsigned int uintVal; // VT_UINT.
  char FAR * pcVal; // VT_BYREF|VT_I1.
  unsigned short FAR * puiVal; // VT_BYREF|VT_UI2.
  unsigned long FAR * pulVal; // VT_BYREF|VT_UI4.
  int FAR * pintVal; // VT_BYREF|VT_INT.
  unsigned int FAR * puintVal; //VT_BYREF|VT_UINT.
  _variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
  使用时需加上#include
  例如:
  long l=222;
  ing i=100;
  _variant_t lVal(l);
  lVal = (long)i;
  COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
  COleVariant v3 = "字符串", v4 = (long)1999;
  CString str =(BSTR)v3.pbstrVal;
  long i = v4.lVal;
  六、其它一些COM数据类型
  根据ProgID得到CLSID
  HRESULT CLSIDFromProgID( LPCOLESTR lpszProgID,LPCLSID pclsid);
  CLSID clsid;
  CLSIDFromProgID( L"MAPI.Folder",&clsid);
  根据CLSID得到ProgID
  WINOLEAPI ProgIDFromCLSID( REFCLSID clsid,LPOLESTR * lplpszProgID);
  例如我们已经定义了 CLSID_IApplication,下面的代码得到ProgID
  LPOLESTR pProgID = 0;
  ProgIDFromCLSID( CLSID_IApplication,&pProgID);
  ...///可以使用pProgID
  CoTaskMemFree(pProgID);//不要忘记释放
  七、ANSI与Unicode
  Unicode称为宽字符型字串,COM里使用的都是Unicode字符串。
  将ANSI转换到Unicode
  (1)通过L这个宏来实现,例如: CLSIDFromProgID( L"MAPI.Folder",&clsid);
  (2)通过MultiByteToWideChar函数实现转换,例如:
  char *szProgID = "MAPI.Folder";
  WCHAR szWideProgID[128];
  CLSID clsid;
  long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));
  szWideProgID[lLen] = '\0';
  (3)通过A2W宏来实现,例如:
  USES_CONVERSION;
  CLSIDFromProgID( A2W(szProgID),&clsid);
  将Unicode转换到ANSI
  (1)使用WideCharToMultiByte,例如:
  // 假设已经有了一个Unicode 串 wszSomeString...
  char szANSIString [MAX_PATH];
  WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL );
  (2)使用W2A宏来实现,例如:
  USES_CONVERSION;
  pTemp=W2A(wszSomeString);
  八、其它
  对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:
  LPARAM lParam;
  WORD loValue = LOWORD(lParam);///取低16位
  WORD hiValue = HIWORD(lParam);///取高16位
  对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:
  WORD wValue;
  BYTE loValue = LOBYTE(wValue);///取低8位
  BYTE hiValue = HIBYTE(wValue);///取高8位
  两个16位数据(WORD)合成32位数据(DWORD,LRESULT,LPARAM,或WPARAM)
  LONG MAKELONG( WORD wLow, WORD wHigh );
  WPARAM MAKEWPARAM( WORD wLow, WORD wHigh );
  LPARAM MAKELPARAM( WORD wLow, WORD wHigh );
  LRESULT MAKELRESULT( WORD wLow, WORD wHigh );
  两个8位的数据(BYTE)合成16位的数据(WORD)
  WORD MAKEWORD( BYTE bLow, BYTE bHigh );
  从R(red),G(green),B(blue)三色得到COLORREF类型的颜色值
  COLORREF RGB( BYTE byRed,BYTE byGreen,BYTE byBlue );
  例如COLORREF bkcolor = RGB(0x22,0x98,0x34);
  从COLORREF类型的颜色值得到RGB三个颜色值
  BYTE Red = GetRValue(bkcolor); ///得到红颜色
  BYTE Green = GetGValue(bkcolor); ///得到绿颜色
  BYTE Blue = GetBValue(bkcolor); ///得到兰颜色
  九、注意事项
  假如需要使用到ConvertBSTRToString此类函数,需要加上头文件comutil.h,并在setting中加入comsupp.lib或者直接加上#pragma comment( lib, "comsupp.lib" )
  1. CString与LPCTSTR(const wchar_t *)
  CString转LPCTSTR:
  CString str;
  LPCTSTR lpstr = str.GetBuffer();
  LPCTSTR转CString:
  LPCTSTR lpstr;
  CString str(lpstr);
  2. BSTR与char *(来自互联网)
  BSTR
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇errorLNK2005:……alreadydefined.. 下一篇C++实例:求2至N(2≤N≤500)之间..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: