当前位置:文档之家› 常用数据类型转换使用详解

常用数据类型转换使用详解

VC常用数据类型使用转换详解CString ,BSTR ,LPCTSTR之间关系和区别CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。

CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法。

typedef OLECHAR FAR* BSTR;typedef const char * LPCTSTR;vc++中各种字符串的表示法首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。

LP的含义是长指针(long pointer)。

LPSTR是一个指向以‘/0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。

而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。

1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位.所以这里的LP和P是等价的.2.C表示const3.T是什么东西呢,我们知道TCHAR在采用Unicode方式编译时是wchar_t,在普通时编译成char.为了满足程序代码国际化的需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。

LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t而不是char。

然后为了实现两种编码的通用,提出了TCHAR的定义:如果定义_UNICODE,声明如下:typedef wchar_t TCHAR;如果没有定义_UNICODE,则声明如下:typedef char TCHAR;LPTSTR和LPCTSTR中的含义就是每个字符是这样的TCHAR。

CString类中的字符就是被声明为TCHAR类型的,它提供了一个封装好的类供用户方便地使用。

LPCTSTR:#ifdef _UNICODEtypedef const wchar_t * LPCTSTR;#elsetypedef const char * LPCTSTR;#endifVC常用数据类型使用转换详解先定义一些常见类型变量借以说明int i = 100;long l = 2001;float f=300.2;double d=12345.119;char username[]="女侠程佩君";char temp[200];char *buf;CString str;_variant_t v1;_bstr_t v2;一、其它数据类型转换为字符串短整型(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与CComBSTRCComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。

char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据"); //使用前需要加上头文件comutil.h反之可以使用char *p=_com_util::ConvertBSTRToString(b);六、VARIANT 、_variant_t 与 COleVariantVARIANT的结构可以参考头文件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_UI1short iVal; VT_I2long lVal; VT_I4float fltVal; VT_R4double dblVal; VT_R8VARIANT_BOOL boolVal; VT_BOOLSCODE scode; VT_ERRORCY cyVal; VT_CYDATE date; VT_DATEBSTR bstrVal; VT_BSTRIUnknown FAR* punkVal; VT_UNKNOWNIDispatch FAR* pdispVal; VT_DISPATCHSAFEARRAY FAR* parray; VT_ARRAY|*unsigned char FAR* pbVal; VT_BYREF|VT_UI1short FAR* piVal; VT_BYREF|VT_I2long FAR* plVal; VT_BYREF|VT_I4float FAR* pfltVal; VT_BYREF|VT_R4double FAR* pdblVal; VT_BYREF|VT_R8VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOLSCODE FAR* pscode; VT_BYREF|VT_ERRORCY FAR* pcyVal; VT_BYREF|VT_CYDATE FAR* pdate; VT_BYREF|VT_DATEBSTR FAR* pbstrVal; VT_BYREF|VT_BSTRIUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWNIDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCHSAFEARRAY FAR* FAR* pparray; VT_ARRAY|*VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANTvoid 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位如何将CString类型的变量赋给char*类型的变量1、GetBuffer函数:使用CString::GetBuffer函数。

char *p;CString str="hello";p=str.GetBuffer(str.GetLength());str.ReleaseBuffer();将CString转换成char * 时CString str("aaaaaaa");strcpy(str.GetBuffer(10),"aa");str.ReleaseBuffer();当我们需要字符数组时调用GetBuffer(int n),其中n为我们需要的字符数组的长度.使用完成后一定要马上调用ReleaseBuffer();还有很重要的一点就是,在能使用const char *的地方,就不要使用char *2、memcpy:CString mCS=_T("cxl");char mch[20];memcpy(mch,mCS,20);3、用LPCTSTR强制转换:尽量不使用char *ch;CString str;ch=(LPSTR)(LPCTSTR)str;CString str = "good";char *tmp;sprintf(tmp,"%s",(LPTSTR)(LPCTSTR)str);4、CString Msg;Msg=Msg+"abc";LPTSTR lpsz;lpsz = new TCHAR[Msg.GetLength()+1];_tcscpy(lpsz, Msg);char * psz;strcpy(psz,lpsz);CString类向const char *转换char a[100];CString str("aaaaaa");strncpy(a,(LPCTSTR)str,sizeof(a));或者如下:strncpy(a,str,sizeof(a));以上两种用法都是正确地. 因为strncpy的第二个参数类型为const char *.所以编译器会自动将CString类转换成const char *.CString转LPCTSTR (const char *)CString cStr;const char *lpctStr=(LPCTSTR)cStr;LPCTSTR转CStringLPCTSTR lpctStr;CString cStr=lpctStr;将char*类型的变量赋给CString型的变量可以直接赋值,如:CString myString = "This is a test";也可以利用构造函数,如:CString s1("Tom");将CString类型的变量赋给char []类型(字符串)的变量1、sprintf()函数CString str = "good";char tmp[200] ;sprintf(tmp, "%s",(LPCSTR)str);(LPCSTR)str这种强制转换相当于(LPTSTR)(LPCTSTR)strCString类的变量需要转换为(char*)的时,使用(LPTSTR)(LPCTSTR)str然而,LPCTSTR是const char *,也就是说,得到的字符串是不可写的!将其强制转换成LPTSTR 去掉const,是极为危险的!一不留神就会完蛋!要得到char *,应该用GetBuffer()或GetBufferSetLength(),用完后再调用ReleaseBuffer()。

相关主题