看流星社区

 找回密码
 注册账号
查看: 1513|回复: 0

谈ATL(二)BSTR与CComBSTR

[复制链接]

该用户从未签到

发表于 2014-6-15 09:51:37 | 显示全部楼层 |阅读模式
关于BSTR类
BSTR类型的实质是指向一个带长度前缀的OLECHAR字符数组的指针。
BSTR是指针数据类型。它指向数组的第一个字符,长度是以整数存储的数据中紧接第一个字符前面的位置。
BSTR中的字符数组以NUL字符结束。
前缀长度以字节单位,描述的是字符串的长度,该长度不包括终止字符NUL。
字符数组内部可以包括有效的NUL字符。
BSTR必须使用SysAllocString和SysFreeString函数族进行分配和释放。
NULL的BSTR指针表示空字符串。简单讲就是BSTR *p = NULL 等同于 BSTR *p = "";
BSTR是非引用计数的,两次引用同一字符串的内容必须指向两个单独的BSTR,也就是说BSTR本身实现的是深拷贝。

关于CComBSTR类
CComBSTR是ATL的工具类,它封装了COM字符串数据类型BSTR,CComBSTR的定义参见“atlcomcli.h”。
CComBSTR的部分定义如下:
class CComBSTR
{
public:
    BSTR m_str;
...
}
其中,维护的数据成员只有一个BSTR,为了和其他的字符串类转换和提高通用性,CComBSTR共提供了八个构造函数,如下:
CComBSTR()  //将m_str初始化为NULL
CComBSTR(LPCOLESTR pSrc)  //用LPCOLESTR初始化m_str
CComBSTR(int nSize, LPOLESR sz)//去LPOLESTR前nSize个字符初始化m_str
CComBSTR(int nSize)   //初始化m_str的空间为nSize
CComBSTR(LPCSTR pSrc)//用LPCSTR字符串初始化m_str
CComBSTR(int nSize, LPCSTR sz)//用LPCSTR的前nSize个字符初始化m_str
CComBSTR(const CComBSTR& src) //拷贝构造函数

BSTR字符串在应用上并不是新的应用,而是有很长历史了,在VB(在上大学时第一个商业程序就是用VB开发的,所以对于VB程序当时是情有独钟,对于内部原理也算略知一二)和JAVA(JAVA是大学的课程虽然讲的不多,但也用其做过一些小的应用和项目,一些皮毛的东西还算了解)中的字符串类型都用的BSTR。不过在C++中用BSTR就不是那么方便了,如果想将BSTR类型的字符串转换为C++能用的char*类型,其实也不用自己写转换函数或转换类,很多IDE环境就有现成的类库支持,下面介绍一种简单方便的:
#include "comutil.h"
#pragma comment(lib, "comsupp.lib")
::_com_util::ConvertBSTRToString(BSTR类型的变量)
::_com_util::ConvertStringToBSTR(const char*类型)

具体的函数原型如下:
// Convert char * to BSTR
//
BSTR __stdcall ConvertStringToBSTR(const char* pSrc) throw(_com_error);
// Convert BSTR to char *
//
char* __stdcall ConvertBSTRToString(BSTR pSrc) throw(_com_error);

至于函数的具体参数和使用细节,只要写入IDE环境后,自动的代码提示会帮你解决这些问题。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-29 09:14

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表