
VC++类型转换整理.doc
6页VC++类型转换整理1、CString to char* 经过类型强制转换,可以将 CString 类型转换成 char*,例如: CString cStr = “Hello,world!“; char* zStr = (char*)(LPCTSTR)cStr; 2、char* to CString char*类型可以直接给 CString,完成自动转换,例如: char* zStr = “Hello,world!“; CString cStr = zStr; 3、CString to LPCSTR 将 CString 转换成 LPCSTR,需要获得 CString 的长度,例如: CString cStr = _T(“Hello,world!“); int nLen = cStr.GetLength(); LPCSTR lpszBuf = cStr.GetBuffer(nLen); 4、CString to LPSTR 这个和第 3 个技巧是一样的,例如: CString cStr = _T(“Hello,world!“); int nLen = str.GetLength(); LPSTR lpszBuf = str.GetBuffer(nLen); 5、Char[] to int 将字符串类型转换成整数型,可以使用 atoi 函数,例如: char c[10]; int n; n = atoi?; 6、Char[] to float 和第 5 个技巧一样,使用 atof()函数可以转换成 float 型,例如: char c[10]; float f; f = atof?; 7、Char* to int 和第 5 个技巧完全一样,例如: char *str = “100“; int i; i = atoi(str); 一、其它数据类型转换为字符串 短整型(int) itoa(i,temp,10);///将 i 转换为字符串放入 temp 中,最后一个数字表示十进制 itoa(i,temp,2); ///按二进制方式转换 长整型(long) ltoa(l,temp,10); 二、从其它包含字符串的变量中获取指向该字符串的指针 CString 变量 str = “2008 北京奥运“; buf = (LPSTR)(LPCTSTR)str; BSTR 类型的_variant_t 变量 v1 = (_bstr_t)“程序员“; buf = _com_util::ConvertBSTRToString((_bstr_t)v1); 三、字符串转换为其它数据类型 strcpy(temp,“123“); 短整型(int) i = atoi(temp); 长整型(long) l = atol(temp); 浮点(double) d = atof(temp); 四、其它数据类型转换到 CString 使用 CString 的成员函数 Format 来转换,例如: 整数(int) str.Format(“%d“,i); 浮点数(float) str.Format(“%f“,i); 字符串指针(char *)等已经被 CString 构造函数支持的数据类型可以直接赋值 str = username; 五、BSTR、_bstr_t 与 CComBSTR CComBSTR、_bstr_t 是对 BSTR 的封装,BSTR 是指向字符串的 32 位指针。
char *转换到 BSTR 可以这样: BSTR b=_com_util::ConvertStringToBSTR(“数据“);///使用前需要 加上头文件 comutil.h 反之可以使用 char *p=_com_util::ConvertBSTRToString(b); 六、VARIANT 、_variant_t 与 COleVariant VARIANT 的结构可以参考头文件 VC98\Include\OAIDL.H 中关于结构体 tagVARIANT 的定义 对于 VARIANT 变量的赋值:首先给 vt 成员赋值,指明数据类型,再对联合结构中相同数据 类型的变量赋值,举个例子: VARIANT va; int a=2001; va.vt=VT_I4;///指明整型数据 va.lVal=a; ///赋值 对于不马上赋值的 VARIANT,最好先用 Void VariantInit(VARIANTARG FAR* pvarg);进行初始 化,其本质是将 vt 设置为 VT_EMPTY,下表我们列举 vt 与常用数据的对应关系: unsigned char bVal; VT_UI1 short iVal; VT_I2 long lVal; VT_I4 float fltVal; VT_R4 double dblVal; VT_R8 VARIANT_BOOL boolVal; VT_BOOL SCODE scode; VT_ERROR CY cyVal; VT_CY DATE date; VT_DATE BSTR bstrVal; VT_BSTR IUnknown FAR* punkVal; VT_UNKNOWN IDispatch FAR* pdispVal; VT_DISPATCH SAFEARRAY FAR* parray; VT_ARRAY|* unsigned char FAR* pbVal; VT_BYREF|VT_UI1 short FAR* piVal; VT_BYREF|VT_I2 long FAR* plVal; VT_BYREF|VT_I4 float FAR* pfltVal; VT_BYREF|VT_R4 double FAR* pdblVal; VT_BYREF|VT_R8 VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL SCODE FAR* pscode; VT_BYREF|VT_ERROR CY FAR* pcyVal; VT_BYREF|VT_CY DATE 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; VT_BYREF _variant_t 是 VARIANT 的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理 这些数据类型。
例如: 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; 七、其它 对消息的处理中我们经常需要将 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 位 后记:本文匆匆写成,错误之处在所难免,欢迎来信指正。
int ->str itoa,atoi double- str ftoa,atof _bstr_t,_variant_t,CString,long 等等看看下面: 我给你点详细的例子,看下面 先看懂_variant_t 与_bstr_t 这两个类的构造函数和 operator= 里面有重载了很多情况, 其他类型向_variant_t 赋值: _variant_t( ) throw( ); _variant_t( const VARIANT _variant_t( const VARIANT* pVarSrc ) throw( _com_error ); _variant_t( const _variant_t _variant_t( VARIANT _variant_t( short sSrc, VARTYPE vtSrc = VT_I2 ) throw( _com_error ); _variant_t( long lSrc, VARTYPE vtSrc = VT_I4 ) throw( _com_error ); _variant_t( float fltSrc ) throw( ); _variant_t( double dblSrc, VARTYPE vtSrc = VT_R8 ) throw( _com_error ); _variant_t( const CY _variant_t( const _bstr_t _variant_t( const wchar_t *wstrSrc ) throw( _com_error ); _variant_t( const char* strSrc ) throw( _com_error ); _variant_t( bool bSrc ) throw( ); _variant_t( IUnknown* pIUknownSrc, bool fAddRef = true ) throw( ); _variant_t( IDispatch* pDispSrc, bool fAddRef = true ) throw( ); _variant_t( const DECIMAL _variant_t( BYTE bSrc ) throw( ); operator=的重载形式: _variant_t _variant_t _variant_t _variant_t _variant_t _variant_t _variant_t _variant_t _variant_t _variant_t _variant_t _variant_t _variant_t _variant_t _variant_t _variant_t 有了以上两个函数,举个例子: double f=1.0 _variant_t v; v=f; //是合法的看看 operator=的重载形式就知道了 CString str=“ddd“ _variant_t v; v=str.AllocSysString() 或者 v=(_bstr_t)(char*)str; 即可 _variant_t 转换成别的形式 你首先必须确定你要转化成什么样的形式 double f; _variant_t v f=v.dblVal 即可或者 f=(double)v;也可以 附:_variant_t。












