版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2222 22CString及string,char *与其他22CString及string,char *与其他数据类型的转换和操作(1)CString,string,char*的综合比较(这部分CSDN上的作者joise的文章<< CString,string,char*的综合比较>>写的很详细,请大家在仔细阅读他的文章. 地址: 或参考附录: (2)转换:数学类型与CString相互转化 数学类型转化为CString 可用Format函数,举例:CString s; int i = 64; s.Format("%d", i) CString转换
2、为数学类型:举例CString strValue("1.234"); double dblValue;dblValue = atof(LPCTSTR)strValue); CString与char*相互转换举例CString strValue(“Hello”);char *szValue;szValue=strValue.GetBuffer(szValue);也可用(LPSTR)(LPCTSTR)对CString/ 进行强制转换. szValue=(LPSTR)(LPCTSTR)strValue;反过来可直接赋值:char *szChar=NULL;CString strV
3、alue;szChar=new char10;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 = .; / whateve
4、rBSTR 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 UNI
5、CODE 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 i
6、f default used s.ReleaseBuffer();#endif return s; VARIANT 型转化成 CString 型VARIANT 类型经常用来给 COM 对象传递参数,或者接收从 COM 对象返回的值。你也能自己编写返回 VARIANT 类型的方法,函数返回什么类型 依赖可能(并且常常)方法的输入参数(比如,在自动化操作中,依赖与你调用哪个方法。IDispatch:Invoke 可能返回(通过其一个参数)一个 包含有BYTE、WORD、float、double、date、BSTR 等等 VARIANT 类型的结果,(详见 MSDN 上的 VARIANT 结构的定义
7、)。在下面的例子中,假设 类型是一个BSTR的变体,也就是说在串中的值是通过 bsrtVal 来引用,其优点是在 ANSI 应用中,有一个构造函数会把 LPCWCHAR 引用的值转换为一个 CString(见 BSTR-to-CString 部分)。在 Unicode 模式中,将成为标准的 CString 构造函数,参见对缺省:WideCharToMultiByte 转换的告诫,以及你觉得是否可以接受(大多数情况下,你会满意的)。VARIANT vaData;vaData = m_com.YourMethodHere();ASSERT(vaData.vt = VT_BSTR);CString
8、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
9、); 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_t与CComBST
10、R 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的结构可以参考头文件VC98IncludeOAIDL.H中关于结构体tagVARIANT的定义。 对于VARIANT变量的赋值:首先给
11、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;
12、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
13、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*
14、 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 =
15、(long)i; COleVariant的使用与_variant_t的方法基本一样,请参考如下例子: COleVariant v3 = "字符串", v4 = (long)1999; CString str =(BSTR)v3.pbstrVal; long i = v4.lVal;和操作(1)CString,string,char*的综合比较(这部分CSDN上的作者joise的文章<< CString,string,char*的综合比较>>写的很详细,请大家在仔细阅读他的文章. 地址: 或参考附录: (2)转换:数学类型与CString相互转化 数学
16、类型转化为CString 可用Format函数,举例:CString s; int i = 64; s.Format("%d", i) CString转换为数学类型:举例CString strValue("1.234"); double dblValue;dblValue = atof(LPCTSTR)strValue); CString与char*相互转换举例CString strValue(“Hello”);char *szValue;szValue=strValue.GetBuffer(szValue);也可用(LPSTR)(LPCTSTR)对CS
17、tring/ 进行强制转换. szValue=(LPSTR)(LPCTSTR)strValue;反过来可直接赋值:char *szChar=NULL;CString strValue;szChar=new char10;memset(szChar,0,10);strcpy(szChar,”Hello”);strValue=szChar; CString 与 BSTR 型转换CString 型转化成 BSTR 型当我们使用 ActiveX 控件编程时,经常需要用到将某个值表示成 BSTR 类型.BSTR 是一种记数字符串,Intel平台上的宽字符串(Unicode),并且可以包含嵌入的 NULL
18、 字符。可以调用 CString 对象的 AllocSysString 方法将 CString 转化成 BSTR:CString str;str = .; / whateverBSTR 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 模式CS
19、tring 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
20、, / 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 可能返回(通过
21、其一个参数)一个 包含有BYTE、WORD、float、double、date、BSTR 等等 VARIANT 类型的结果,(详见 MSDN 上的 VARIANT 结构的定义)。在下面的例子中,假设 类型是一个BSTR的变体,也就是说在串中的值是通过 bsrtVal 来引用,其优点是在 ANSI 应用中,有一个构造函数会把 LPCWCHAR 引用的值转换为一个 CString(见 BSTR-to-CString 部分)。在 Unicode 模式中,将成为标准的 CString 构造函数,参见对缺省:WideCharToMultiByte 转换的告诫,以及你觉得是否可以接受(大多数情况下,你会满
22、意的)。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: ret
23、urn 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 (
24、this ASSERT is optional) return CString(""); /* vt */ 23 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); 24(引)VARIANT 、_variant_t 与
25、 COleVariant VARIANT的结构可以参考头文件VC98IncludeOAIDL.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 c
26、har 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_A
27、RRAY|* 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 DA
28、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; VT_BYREF _variant_t是VARIANT的封装类
29、,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。 例如: 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;(1)CString,string,char*的综合比较(这部分CSDN上的作者joise的文章<< CStri
30、ng,string,char*的综合比较>>写的很详细,请大家在仔细阅读他的文章. 地址: 或参考附录: (2)转换:数学类型与CString相互转化 数学类型转化为CString 可用Format函数,举例:CString s; int i = 64; s.Format("%d", i) CString转换为数学类型:举例CString strValue("1.234"); double dblValue;dblValue = atof(LPCTSTR)strValue); CString与char*相互转换举例CString strVal
31、ue(“Hello”);char *szValue;szValue=strValue.GetBuffer(szValue);也可用(LPSTR)(LPCTSTR)对CString/ 进行强制转换. szValue=(LPSTR)(LPCTSTR)strValue;反过来可直接赋值:char *szChar=NULL;CString strValue;szChar=new char10;memset(szChar,0,10);strcpy(szChar,”Hello”);strValue=szChar; CString 与 BSTR 型转换CString 型转化成 BSTR 型当我们使用 Act
32、iveX 控件编程时,经常需要用到将某个值表示成 BSTR 类型.BSTR 是一种记数字符串,Intel平台上的宽字符串(Unicode),并且可以包含嵌入的 NULL 字符。可以调用 CString 对象的 AllocSysString 方法将 CString 转化成 BSTR:CString str;str = .; / whateverBSTR bStr = str.AllocSysString(); BSTR型转换为CString如果你在 UNICODE 模式下编译代码,你可以简单地写成:CString convert(BSTR bStr) if(bStr = NULL) return
33、 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, / sou
34、rce 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 对象返回的值。你也能自己编写返回 VAR
35、IANT 类型的方法,函数返回什么类型 依赖可能(并且常常)方法的输入参数(比如,在自动化操作中,依赖与你调用哪个方法。IDispatch:Invoke 可能返回(通过其一个参数)一个 包含有BYTE、WORD、float、double、date、BSTR 等等 VARIANT 类型的结果,(详见 MSDN 上的 VARIANT 结构的定义)。在下面的例子中,假设 类型是一个BSTR的变体,也就是说在串中的值是通过 bsrtVal 来引用,其优点是在 ANSI 应用中,有一个构造函数会把 LPCWCHAR 引用的值转换为一个 CString(见 BSTR-to-CString 部分)。在 Un
36、icode 模式中,将成为标准的 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) /*
37、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->
38、dblVal); return s; . 剩下的类型转换由读者自己完成 default: ASSERT(FALSE); / unknown VARIANT type (this ASSERT is optional) return CString(""); /* vt */ 23 BSTR、_bstr_t与CComBSTR CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。 char *转换到BSTR可以这样: BSTR b=_com_util:ConvertStringToBSTR("数据");/使用前需要加上头文件
39、comutil.h 反之可以使用char *p=_com_util:ConvertBSTRToString(b); 24(引)VARIANT 、_variant_t 与 COleVariant VARIANT的结构可以参考头文件VC98IncludeOAIDL.H中关于结构体tagVARIANT的定义。 对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子: VARIANT va; int a=2001; va.vt=VT_I4;/指明整型数据 va.lVal=a; /赋值 对于不马上赋值的VARIANT,最好先用Void Varian
40、tInit(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*
41、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_
42、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|* VARIAN
43、T 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.pbstr
44、Val; long i = v4.lVal;(1)CString,string,char*的综合比较(这部分CSDN上的作者joise的文章<< CString,string,char*的综合比较>>写的很详细,请大家在仔细阅读他的文章. 地址: 或参考附录: (2)转换:数学类型与CString相互转化 数学类型转化为CString 可用Format函数,举例:CString s; int i = 64; s.Format("%d", i) CString转换为数学类型:举例CString strValue("1.234");
45、double dblValue;dblValue = atof(LPCTSTR)strValue); CString与char*相互转换举例CString strValue(“Hello”);char *szValue;szValue=strValue.GetBuffer(szValue);也可用(LPSTR)(LPCTSTR)对CString/ 进行强制转换. szValue=(LPSTR)(LPCTSTR)strValue;反过来可直接赋值:char *szChar=NULL;CString strValue;szChar=new char10;memset(szChar,0,10);st
46、rcpy(szChar,”Hello”);strValue=szChar; CString 与 BSTR 型转换CString 型转化成 BSTR 型当我们使用 ActiveX 控件编程时,经常需要用到将某个值表示成 BSTR 类型.BSTR 是一种记数字符串,Intel平台上的宽字符串(Unicode),并且可以包含嵌入的 NULL 字符。可以调用 CString 对象的 AllocSysString 方法将 CString 转化成 BSTR:CString str;str = .; / whateverBSTR bStr = str.AllocSysString(); BSTR型转换为CS
47、tring如果你在 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(SysStr
48、ingLen(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 对象返回
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论