没有合适的资源?快使用搜索试试~ 我知道了~
首页BSTR、LPSTR和LPWSTR
资源详情
资源评论
资源推荐
2009-12-11
BSTR 、 LPSTR
和
LPWSTR
博客分类:
C++
数据结构
MFC C C++ C#
一、 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(‘ ’)结尾的 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 和 CStringW
Visual C++.NET 中将 CStringT 作为 ATL 和 MFC 的共享的“一般”字符串类,它有
CString、CStringA 和 CStringW 三种形式,分别操作不同字符类型的字符串。这些字符类
型是 TCHAR、char 和 wchar_t。TCHAR 在 Unicode 平台中等同于 WCHAR(16 位
Unicode 字符),在 ANSI 中等价于 char。wchar_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 变量赋值时,也要先指明其类型。例如:
VARIANT va;
:: VariantInit(&va); // 初始化
int a = 2002;
va.vt = VT_I4; // 指明 long 数据类型
va.lVal = a; // 赋值
为了方便处理 VARIANT 类型的变量,Windows 还提供了这样一些非常有用的函数:
VariantInit —— 将变量初始化为 VT_EMPTY;
VariantClear —— 消除并初始化 VARIANT;
VariantChangeType —— 改变 VARIANT 的类型;
VariantCopy —— 释放与目标 VARIANT 相连的内存并复制源 VARIANT。
COleVariant 类是对 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" )
四、BSTR、CComBSTR 和_bstr_t
CComBSTR 是对 BSTR 数据类型封装的一个 ATL 类,它的操作比较方便。例如:
CComBSTR bstr1; bstr1 = "Bye"; // 直接赋值
OLECHAR* str = OLESTR("ta ta"); // 长度为 5 的宽字符
CComBSTR bstr2(wcslen(str)); // 定义长度为 5
wcscpy(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");
或 LPTSTR p = _T("This is a test");
CString theString = chArray;
剩余18页未读,继续阅读
xsjm206
- 粉丝: 28
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论2