首页 > C/C++开发工具专区 > VC技术 > CString 与其他类型的转换
2006
09-21

CString 与其他类型的转换

一.                VC常用数据类型列表


 


二.                常用数据类型转化


 


2.1数学类型变量与字符串相互转换


2.2 CStringstring,char *与其他数据类型的转换和操作


CString,string,char*的综合比较


数学类型与CString相互转化


CStringchar*相互转换举例


CString BSTR 型转换


VARIANT 型转化成 CString


2.3 BSTR_bstr_tCComBSTR


 


2.4 VARIANT _variant_t COleVariant


 


附录CString及字符串转及操作详解

 

参考书籍:CSDN,<<MFC深入浅出(Second Edit)>>


 


一.VC常用数据类型列表 


 


























































































































































































































































  Type Default Size Description
       说明:这些基础数据类型对于MFC还是API都是被支持的

boolean


unsigned 8 bit ,

取值TRUE/FALSE

byte


unsigned 8 bit,

整数,输出按字符输出

char


unsigned 8 bit,

字符

double


signed 64 bit

浮点型

float


signed32 bit

浮点型

handle_t

  Primitive handle type

hyper


signed 64 bit

整型

int


signed 32 bit

整型

long


signed 32 bit

整型

short


signed 16 bit

整型

small


signed 8 bit

整型

void *


32-bit

指向未知类型的指针

wchar_t


unsigned 16 bit

16位字符,char可容纳更多的字符
     
Win32API   说明: 这些Win32API支持的简单数据类型主要是用来定义函数返回值,消息参数,结构成员。这类数据类型大致可以分为五大类:字符型、布尔型、整型、指针型和句柄型(?. 总共大概有100多种不同的类型,
BOOL/BOOLEAN

8bit,TRUE/FALSE

布尔型
BYTE

unsigned 8 bit

 
BSTRCComBSTR_bstr_t

32 bit

BSTR是指向字符串的32位指针是对BSTR的封装是对BSTR的封装
CHAR

8 bit

(ANSI)字符类型
COLORREF

32 bit

RGB颜色值 整型
DWORD

unsigned 32 bit

整型
FLOAT

float

float
HANDLE   Object句柄
HBITMAP   bitmap句柄
HBRUSH   brush句柄
HCURSOR   cursor句柄
HDC   设备上下文句柄
HFILE   OpenFile打开的File句柄
HFONT   font句柄
HHOOK   hook句柄
HKEY   注册表键句柄
HPEN   pen句柄
HWND   window句柄
INT

——–

——–
LONG

——–

———
LONGLONG   64位带符号整型
LPARAM

32 bit

消息参数
LPBOOL   BOOL型指针
LPBYTE   BYTE型指针
LPCOLOREF   COLORREF型指针
LPCSTR/LPSTR/PCSTR   指向8位(ANSI)字符串类型指针
LPCWSTR/LPWSTR/PCWSTR   指向16Unicode字符串类型
LPCTSTR/LPTSTR/PCTSTR   指向一8位或16位字符串类型指针
LPVOID   指向一个未指定类型的32位指针
LPDWORD   指向一个DWORD型指针
其他相似类型: LPHANDLELPINTLPLONGLPWORDLPRESULTPBOOLPBOOLEANPBYTEPCHARPDWORDPFLOATPHANDLEPINTPLONGPSHORT……说明 :( 1)16位系统中 LP16bit,P8bit,32位系统中都是32bit(此时等价)(2)LPCSTR 中的CConst,T表示TCHAR模式即可以工作在ANSI下也可UNICODE
SHORT

usigned

整型
其他UCHARUINTULONGULONGLONGUSHORT为无符号相应类型
TBYTE   WCHAR型或者CHAR
TCHAR   ANSIunicode均可
VARIANT_variant_tCOleVariant   一个结构体参考OAIDL.H_variant_tVARIANT的封装类COleVariant也是VARIANT的封装类
     
     
WNDPROC   指向一个窗口过程的32位指针
WCHAR   16Unicode字符型
WORD   16位无符号整型
WPARAM   消息参数
MFC独有数据类型 下面两个数据类型是微软基础类库中独有的数据类型

POSITION

标记集合中一个元素的位置的值,MFC中的集合类所使用

LPCRECT

指向一个RECT结构体常量(不能修改)的32位指针

CString

其实是MFC中的一个类
     

 


说明:


(1)——-表示省略


(2)1Byte=8Bit,


字与机器有关,8位系统中:=1字节,16位系统中,1=2字节,32位中:1=4字节,


64位中1=8字节.不要搞混这些概念.


  二.常用数据类型转化及操作21 数学类型变量与字符串相互转换(这些函数都在STDLIB.H)


 


1)将数学类型转换为字符串可以用以下一些函数:


举例: _CRTIMP char * __cdecl _itoa(int, char *, int);//这是一个将数字转换为一个字符串类型的函数,最后一个int表示转换的进制


如以下程序:

int iTyep=3;char *szChar;itoa(iType,szChar,2);cout<<szChar;//输出为1010

类似函数列表:


_CRTIMP char * __cdecl _itoa(int, char *, int);//为了完整性,也列在其中_CRTIMP char * __cdecl _ultoa(unsigned long, char *, int);_CRTIMP char * __cdecl _ltoa(long, char *, int);_CRTIMP char * __cdecl _i64toa(__int64, char *, int);_CRTIMP char * __cdecl _ui64toa(unsigned __int64, char *, int);_CRTIMP wchar_t * __cdecl _i64tow(__int64, wchar_t *, int);_CRTIMP wchar_t * __cdecl _ui64tow(unsigned __int64, wchar_t *, int);_CRTIMP wchar_t * __cdecl _itow (int, wchar_t *, int);//转换为长字符串类型_CRTIMP wchar_t * __cdecl _ltow (long, wchar_t *, int);_CRTIMP wchar_t * __cdecl _ultow (unsigned long, wchar_t *, int);还有很多,请自行研究2)将字符串类型转换为数学类型变量可以用以下一些函数:举例: _CRTIMP int  __cdecl atoi(const char *);//参数一看就很明了char *szChar=”88”;int temp(0);temp=atoi(szChar);cout<<temp;类似的函数列表:_CRTIMP int    __cdecl atoi(const char *);_CRTIMP double __cdecl atof(const char *);_CRTIMP long   __cdecl atol(const char *);_CRTIMP long double __cdecl _atold(const char *);_CRTIMP __int64 __cdecl _atoi64(const char *);_CRTIMP double __cdecl strtod(const char *, char **);//_CRTIMP long   __cdecl strtol(const char *, char **, int);//_CRTIMP long double __cdecl _strtold(const char *, char **);_CRTIMP unsigned long __cdecl strtoul(const char *, char **, int);_CRTIMP double __cdecl wcstod(const wchar_t *, wchar_t **);//长字符串类型转换为数学类型_CRTIMP long   __cdecl wcstol(const wchar_t *, wchar_t **, int);_CRTIMP unsigned long __cdecl wcstoul(const wchar_t *, wchar_t **, int);_CRTIMP int __cdecl _wtoi(const wchar_t *);_CRTIMP long __cdecl _wtol(const wchar_t *);_CRTIMP __int64   __cdecl _wtoi64(const wchar_t *);还有很多,请自行研究


22CStringstring,char *与其他数据类型的转换和操作


1CString,string,char*的综合比较(这部分CSDN上的作者joise的文章<< CString,string,char*的综合比较>>写的很详细,请大家在仔细阅读他的文章.


地址: http://blog.csdn.net/joise/


或参考附录:


(2)转换:

数学类型与CString相互转化

 数学类型转化为CString


可用Format函数,举例:


CString s;


int i = 64;


s.Format(“%d”, i)

CString转换为数学类型:举例
CString strValue(“1.234″);

double dblValue;


dblValue = atof((LPCTSTR)strValue);


 


CStringchar*相互转换举例


CString strValue(“Hello”);


char *szValue;


szValue=strValue.GetBuffer(szValue);

也可用(LPSTR)(LPCTSTR)CString//  进行强制转换.  

szValue=(LPSTR)(LPCTSTR)strValue;


反过来可直接赋值:


char *szChar=NULL;


CString strValue;


szChar=new char[10];


memset(szChar,0,10);


strcpy(szChar,”Hello”);


strValue=szChar;


 


CString BSTR 型转换


CString 型转化成 BSTR


当我们使用 ActiveX 控件编程时,经常需要用到将某个值表示成 BSTR 类型.BSTR 是一种记数字符串,Intel平台上的宽字符串(Unicode),并且可以包含嵌入的 NULL 字符。


可以调用 CString 对象的 AllocSysString 方法将 CString 转化成 BSTR


CString str;


str = …..; // whatever


BSTR bStr = str.AllocSysString();

 

BSTR型转换为CString


如果你在 UNICODE 模式下编译代码,你可以简单地写成:


CString convert(BSTR bStr)


{


    if(bStr == NULL)


        return CString(_T(“”));


    CString s(bStr); // in UNICODE mode


    return s;


}


如果是 ANSI 模式


CString convert(BSTR b)


{


    CString s;


    if(b == NULL)


       return s; // empty for NULL BSTR


#ifdef UNICODE


    s = b;


#else


    LPSTR p = s.GetBuffer(SysStringLen(b) + 1);


    ::WideCharToMultiByte(CP_ACP,              // ANSI Code Page


                            0,                   // no flags


                            b,                   // source widechar string


                            -1,                  // assume NUL-terminated


                            p,                   // target buffer


                            SysStringLen(b)+1, // target buffer length


                            NULL,                // use system default char


                            NULL);               // don”t care if default used


    s.ReleaseBuffer();


#endif


    return s;


}

 

VARIANT 型转化成 CString


VARIANT 类型经常用来给 COM 对象传递参数,或者接收从 COM 对象返回的值。你也能自己编写返回 VARIANT 类型的方法,函数返回什么类型 依赖可能(并且常常)方法的输入参数(比如,在自动化操作中,依赖与你调用哪个方法。IDispatch::Invoke 可能返回(通过其一个参数)一个 包含有BYTEWORDfloatdoubledateBSTR 等等 VARIANT 类型的结果,(详见 MSDN 上的 VARIANT 结构的定义)。在下面的例子中,假设 类型是一个BSTR的变体,也就是说在串中的值是通过 bsrtVal 来引用,其优点是在 ANSI 应用中,有一个构造函数会把 LPCWCHAR 引用的值转换为一个 CString(见 BSTR-to-CString 部分)。在 Unicode 模式中,将成为标准的 CString 构造函数,参见对缺省::WideCharToMultiByte 转换的告诫,以及你觉得是否可以接受(大多数情况下,你会满意的)。VARIANT vaData;


vaData = m_com.YourMethodHere();


ASSERT(vaData.vt == VT_BSTR);


CString strData(vaData.bstrVal);


你还可以根据 vt 域的不同来建立更通用的转换例程。为此你可能会考虑:


CString VariantToString(VARIANT * va)


{


    CString s;


    switch(va->vt)


      { /* vt */


       case VT_BSTR:


          return CString(vaData->bstrVal);


       case VT_BSTR | VT_BYREF:


          return CString(*vaData->pbstrVal);


       case VT_I4:


          s.Format(_T(“%d”), va->lVal);


          return s;


       case VT_I4 | VT_BYREF:


          s.Format(_T(“%d”), *va->plVal);


       case VT_R8:


          s.Format(_T(“%f”), va->dblVal);


          return s;


       剩下的类型转换由读者自己完成


       default:


          ASSERT(FALSE); // unknown VARIANT type (this ASSERT is optional)


          return CString(“”);


      } /* vt */


}


 


 23 BSTR_bstr_tCComBSTR


 


CComBSTR_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。


char *转换到BSTR可以这样:


BSTR b=_com_util::ConvertStringToBSTR(“数据“);///使用前需要加上头文件comutil.h


反之可以使用char *p=_com_util::ConvertBSTRToString(b);


 


24()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_tVARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。


例如:


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;


留下一个回复