
vc常用数据类型转换.doc
28页VC 常用数据类型转换1 / 28VC常用数据类型转换2009-11-27 10:10 91 人阅读 评论(0) 收藏 举报一、BSTR、LPSTR 和 LPWSTR 在 Visual C++.NET 的所有编程方式中,我们常常要用到这样的一些基本字符串类型,如BSTR、LPSTR 和 LPWSTR 等之所以出现类似上述的这些数据类 型,是因为不同编程语言之间的数据交换以及对 ANSI、Unicode 和多字节字符集(MBCS)的支持那么什么是 BSTR、LPSTR 以及 LPWSTR 呢?BSTR(Basic STRing,Basic 字符串)是一个 OLECHAR*类型的 Unicode 字符串它被描述成一个与自动化相兼容的类型由于操作系统提供相应的 API 函数(如 SysAllocString)来管理它以及一些默认的调度代码,因此 BSTR 实际上就是一个 COM 字符串,但它却在自动化技术以外的多种 场合下得到广泛使用图 1 描述了 BSTR 的结构,其中 DWORD 值是字符串中实际所占用的字节数,且它的值是字符串中 Unicode 字符的两倍LPSTR 和 LPWSTR 是 Win32 和 VC++所使用的一种字符串数据类型。
LPSTR 被定义成是一个指向以 NULL(‘/0’)结尾的 8 位 ANSI 字符数组指针,而 LPWSTR 是一个指向以 NULL 结尾的 16 位双字节字符数组指针在 VC++中,还有类似的字符串类型,如 LPTSTR、 LPCTSTR 等,它们的含义如图 2所示例如,LPCTSTR 是指“long pointer to a constant generic string”,表示“ 一个指向一般字符串常量的长指针类型”,与 C/C++的 const char*相映射,而 LPTSTR 映射为 char*一般地,还有下列类型定义:#ifdef UNICODE typedef LPWSTR LPTSTR;typedef LPCWSTR LPCTSTR; #else typedef LPSTR LPTSTR; typedef LPCSTR LPCTSTR; #endif二、CString、CStringA 和 CStringWVC 常用数据类型转换2 / 28Visual C++.NET 中将 CStringT 作为 ATL 和 MFC 的共享的“一般” 字符串类,它有CString、CStringA 和 CStringW 三种形式,分 别操作不同字符类型的字符串。
这些字符类型是TCHAR、char 和 wchar_tTCHAR 在 Unicode 平台中等同于 WCHAR(16 位 Unicode 字符) ,在 ANSI中等价于 charwchar_t 通常定义为 unsigned short由于 CString 在 MFC 应用程序中经常用到,这里不再重复三、VARIANT、COleVariant 和_variant_t在 OLE、ActiveX 和 COM 中,VARIANT 数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可以实 现各种不同的自动化数据的传输下面让我们来看看OAIDL.H 文件中 VARIANT 定义的一个简化版:struct tagVARIANT {VARTYPE vt;union { short iVal; // VT_I2. long lVal; // VT_I4. float fltVal; // VT_R4. double dblVal; // VT_R8. DATE date; // VT_DATE. BSTR bstrVal; // VT_BSTR. … short * piVal; // VT_BYREF|VT_I2. long * plVal; // VT_BYREF|VT_I4. float * pfltVal; // VT_BYREF|VT_R4. double * pdblVal; // VT_BYREF|VT_R8. DATE * pdate; // VT_BYREF|VT_DATE. BSTR * pbstrVal; // VT_BYREF|VT_BSTR. }; };显然,VARIANT 类型是一个 C 结构,它包含了一个类型成员 vt、一些保留字节以及一个大的union 类型。
例如,如果 vt 为 VT_I2,那么我们 可以从 iVal 中读出 VARIANT 的值同样,当给一个VARIANT 变量赋值时,也要先指明其类型例如:VC 常用数据类型转换3 / 28VARIANT va;:: VariantInit( // 初始化int a = 2002;va.vt = VT_I4; // 指明 long 数据类型va.lVal = a; // 赋值为了方便处理 VARIANT 类型的变量,Windows 还提供了这样一些非常有用的函数:VariantInit —— 将变量初始化为 VT_EMPTY;VariantClear —— 消除并初始化 VARIANT;VariantChangeType —— 改变 VARIANT 的类型;VariantCopy —— 释放与目标 VARIANT 相连的内存并复制源 VARIANTCOleVariant 类是对 VARIANT 结构的封装它的构造函数具有极为强大大的功能,当对象构造时首先调用 VariantInit 进行初始 化,然后根据参数中的标准类型调用相应的构造函数,并使用VariantCopy 进行转换赋值操作,当 VARIANT 对象不在有效范围时,它的析构函数就 会被自动调用,由于析构函数调用了 VariantClear,因而相应的内存就会被自动清除。
除此之外,COleVariant 的赋值操作符在与 VARIANT 类型转换中为我们提供极大的方便例如下面的代码:COleVariant v1("This is a test"); // 直接构造COleVariant v2 = "This is a test"; // 结果是 VT_BSTR 类型,值为"This is a test"COleVariant v3((long)2002);COleVariant v4 = (long)2002;// 结果是 VT_I4 类型,值为 2002_variant_t 是一个用于 COM 的 VARIANT 类,它的功能与 COleVariant 相似不过在 Visual C++.NET 的 MFC 应用程序中使用时需要在代码文件前面添加下列两句:#include "comutil.h"#pragma comment( lib, "comsupp.lib" )VC 常用数据类型转换4 / 28四、CComBSTR 和_bstr_tCComBSTR 是对 BSTR 数据类型封装的一个 ATL 类,它的操作比较方便例如:CComBSTR bstr1; bstr1 = "Bye"; // 直接赋值OLECHAR* str = OLESTR("ta ta"); // 长度为 5 的宽字符CComBSTR bstr2(wcslen(str)); // 定义长度为 5wcscpy(bstr2.m_str, str); // 将宽字符串复制到 BSTR 中CComBSTR bstr3(5, OLESTR("Hello World")); CComBSTR bstr4(5, "Hello World"); CComBSTR bstr5(OLESTR("Hey there")); CComBSTR bstr6("Hey there"); CComBSTR bstr7(bstr6); // 构造时复制,内容为"Hey there"_bstr_t 是是 C++对 BSTR 的封装,它的构造和析构函数分别调用 SysAllocString 和 SysFreeString函数,其他操作是 借用 BSTR API 函数。
与_variant_t 相似,使用时也要添加 comutil.h 和comsupp.lib五、BSTR、char*和 CString 转换(1) char*转换成 CString若将 char*转换成 CString,除了直接赋值外,还可使用 CString::Format 进行例如:char chArray[] = "This is a test";char * p = "This is a test";或LPSTR p = "This is a test";或在已定义 Unicode 应的用程序中TCHAR * p = _T("This is a test");VC 常用数据类型转换5 / 28或LPTSTR p = _T("This is a test");CString theString = chArray;theString.Format(_T("%s"), chArray);theString = p;(2) CString 转换成 char*若将 CString 类转换成 char*(LPSTR)类型,常常使用下列三种方法:方法一,使用强制转换例如:CString theString( "This is a test" );LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;方法二,使用 strcpy。
例如:CString theString( "This is a test" );LPTSTR lpsz = new TCHAR[theString.GetLength()+1];_tcscpy(lpsz, theString);需要说明的是,strcpy(或可移值 Unicode/MBCS 的_tcscpy) 的第二个参数是 const wchar_t* (Unicode)或 const char* (ANSI),系统编译器将会自动对其进行转换方法三,使用 CString::GetBuffer例如:CString s(_T("This is a test "));LPTSTR p = s.GetBuffer();// 在这里添加使用 p 的代码if(p != NULL) *p = _T('/0');s.ReleaseBuffer(); // 使用完后及时释放,以便能使用其它的 CString 成员函数(3) BSTR 转换成 char*方法一,使用 ConvertBSTRToString例如:VC 常用数据类型转换6 / 28#include #pragma comment(lib, "comsupp.lib")int _tmain(int argc, _TCHAR* argv[]){BSTR bstrText = ::SysAllocString(L"Test");char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);SysFreeString(bstrText); // 用完释放delete[] lpszText2;return 0;}方法二,使用_bstr_t 的赋值运算符重载。
例如:_bstr_t b = bstrText;char* lpszText2 = b;(4) char*转换成 BSTR方法一,使用 SysAllocString 等 API 函数例如:BSTR bstrText = ::SysAllocString(L"Test");BSTR bstrText = ::SysAllocStringLen(L"Test",4);BSTR bstrText = ::SysAllocStringByteLen("Test",4);方法二,使用 COleVariant 或_variant_t 例如://COleVariant str。












