关于BSTR数据类型

关于BSTR数据类型 - 极品垃圾 - C++博客 http://www.cppblog.com/bestcln/articles/82712.html

1.COM字符串类型
字符串的长度可能互不相同,因此跨COM边界传输特定的字符串时,需要确定它的长度,而且,字符串有时需要

分配内存。

2.Unicode和ANSI数据类型

3.OLECHAR,LPOLESTR,LPCOLESTR
COM的基本字符数据类型是OLECHAR,与平台无关的字符表示法。在创建该字符集时,OLECHAR的基本数据类型随操

作系统的不同而不同。如今最流行的COM平台是基于Win32_API的,而且基于此,OLECHAR就是wchar_t的typedef.

w表示它是Unicode字符。LPOLESTR是OLECHAR*的typedef,LPCOLESTR是同一种数据类型的const声明。

4.处理LPOLESTR
如果你试图将字符串值赋给LPOLESTR,则会收到编译错误,例如:
OLECHAR *olechar="A String!";//编译错误
反之,你应在这样的字符串前添加L前缀,如下所示:
LPOLESTR szMyString = L"This is a string!";
在使用printf()或ATLTRACE()时,这尤其重要(但通常被遗忘)
例如:
LPOLESTR szstr = L"Hello!";
ATLTRACE("string=%s",szstr);
编译后打印的是
string=T
显然是错误的,应该添加L前缀或OLESTR()宏,应该如下写:
ATLTRACE(L"string=%s",szstr);
或者
ATRTRACE(OLESTR("string=%s",szstr);
下面两个函数通常用来复制字符串。第一个是ANSI函数wcscpy();
第二个是ATL函数,名为ocscpy()

4.是否执行Unicode编译
实际上在默认情况下,ATL向导既创建了ANSI配置,又创建了Unicode配置,这使你能够一种格式或两种格式编译

及发布组件服务程序,你只需坚持使用TCHAR数据类型,以便你的代码可以兼容两种字符集。

5.TCHAR
TCHAR是一般的字符类型。TCHAR的定义如下:
#ifdef UNICODE
typedef WCHAR TCHAT
#else
typedef char TCHAR
#endif
默认情况下,C++字符串文字为char*类型,通过在字符串前使用L前缀,可以将他们指定为宽字符。
在TCHAR*数据类型,应该使用_T,例如:
TCHAR *p_tchar = _T("this is string";
此代码将字符串赋给ANSI/UNICODE兼容格式的字符串。_T是个宏,根据UNICODE来制定具体内容。

6.使用BSTR处理不同大小的字符串。
由于存在内存方面的问题,因此使用BSTR数据类型,BSTR就是指向OLECHAR字符串的指针,可以利用字符串的长

度区分BSTR,该长度不包括最后的null结尾符,而且在字符串指针之前的4个字节里指定。由于它是Unicode字符

串,所以每个字符占用2个字节,与LPOLESTR结尾方式一样,BSTR也必须以null结尾。BSTR避免了LPOLESTR的缺

陷,因为它的长度是显示指定的,所以null字符也可嵌入到BSTR中,所以BSTR可被用于发送二进制数据和简单字

符串。由于BSTR具有特殊结构,因此增加了一些特殊的API函数来处理BSTR.创建和销毁BSTR时调用这些函数。
(BSTR就是LPOLESTR指针,并且在指针的前面加上4个字节来表示大小)

7.处理BSTR的常用API函数。
应该使用SysAllocString()和SysFreeString()来管理BSTR类型
声明如下:
BSTR SysAllocString(const OLECHAR *szSource);
反之,使用SysAllocStringLen()来指定结果BSTR的长度。
所有的BSTR都必须使用SysFreeString()释放。否则会造成内存泄漏。

8.跨COM边界的字符串内存管理。
BSTR没有引用计数机制
(1)在传递字符串时,服务器负责什么操作。
COM服务器程序不应该维护跨COM边界传递的变量的引用,相反,应该进行复制。
在跨COM边界传递BSTR时,服务器程序的管理原则是客户程序负责释放BSTR。无论BSTR是[in]还是[out]参数。都

将如此。在将字符串传递给客户程序时,需要服务器程序释放该字符串的唯一时候是为[in,out]参数赋信值之前

。此时,客户程序传递被分配的字符串,而服务器程序释放该字符串,然后制订一个指针,他指向新分配的字符

串的位置,而且该字符串将由客户程序释放,对于服务器程序而言,管理原则始终是创建输入和输出BSTR的copy

,而不是给现有BSTR添加另一个引用。
例如:
STDMETHOD CstrigTest::GetValue(BSTR *pResult)
{
*pResult = m_str;
return S_OK;
}
//这是不对的,虽然没有 语法错误,大违反了COM的管理规则,应该如下:
方法一:

STDMETHOD CstrigTest::GetValue(BSTR *pResult)
{
*pResult = SysAllocString(m_str);
return S_OK;
}
方法二:
STDMETHOD CstrigTest::GetValue(BSTR *pResult)
{
*pResult = m_str;
m_str = NULL;
return S_OK;
}
输入参数时原则相同。
下面是处理BSTR的指导方针:
(1)[in]参数必须由client拥有,所以,如果服务器程序应该创建copy,不应释放或更改这些参数。
(2)[out]参数由client释放。
(3)客户程序必须将NULL或释放的BSTR传递给服务器程序的[out]参数中。
(4)在服务器程序在被赋予新的BSTR值之前,[in,out]参数必须被释放。
(5)始终使用SysStringLen()获得BSTR的长度。
COM+提供了两个类函数对字符串进行封装:CComBSTR 和_bstr_t

9.字符串转换函数
ATL字符串转换宏(在使用任何宏之前,一定要指定USER_CONVERSION宏,否则会遇到如下编译错误:error c2065:‘_lpw‘undeclared

identifier)
A2BSTR A2COLE A2CW .......(很多)
例如:(使用W2A宏)
LPOLESTR szString=L"this is a string!";
char *str;
str = W2A(szString);
所有这些宏都是以ATL为基础的,在ATL中使用这些宏时,项目必须包括atlconv.h。
COM+还定义了另外两个转换函数,而且有#import指令自动包含,这两个函数都位于comutil.h文件中,并从属于_com_util名称空间,他们可以

将ANSI字符串转换成BSTR,或者反向。函数为:
ConvertStringToBSTR()
ConvertBSTRToString()

10.CComBSTR(CComBSTR封装了BSTR)
如果在BSTR超出了其作用域时没有调用SysFreeString(),则系统调用会造成内存泄漏。
CComBSTR在ATL的atlbase.h头文件中定义,因为它在一个ATL文件中定义,所以CComBSTR在ATL项目中最常用,以从COM客户程序中来回传递字符

串。
CComBSTR只有一个数据成员,名为m_str的公共BSTR。CComBSTR的用途是封装BSTR数据类型,以帮助BSTR的内存管理。还有ToUpper(),ToLower(

)等将字符串转换为特定的大小写格式。
(在构造函数种分配内存,在析构函数中释放内存)。
在赋值,实例化,删除时内存管理非常关键。
Attach()转移所有权。
必须是m_str=NULL时才能使用Attach()
Detach()用于释放所有权,
BSTR Detach()
{
BSTR s = m_str;
m_str = NULL;
return s;
}
Copy()函数用于复制字符串。

11._bstr_t
_bstr_t保持内部的引用计数
_bstr_t是由#import指令自动添加的。与CComBSTR的最大区别是保持了一个内部引用。另一个区别是_bstr_t要求异常处理,ATL项目不会包括

异常处理,因此_bstr_t更适合于COM客户程序,_bstr_t的定义与实现位于comutil.h中。
一个通用的原则是:_bstr_t类应用于COM客户程序,而CComBSTR应用于ATL服务器程序。

12.其它数据类型
1.COM数据类型
COM name                   C++             size
Byte                            BYTE              8
Boolean                     VARIANT_BOOL 16
Double                       double              64
Float                          float                 32
Integer                       int                  
Long                          long                 32
Short                         short                16
String                        BSTR
Date                          DATE
Variant                      VARIANT           
Dispatch Interface    IDispatch*
Unknown Interface    IUnknown*
2.VARIANT结构
3._variant_t
_variant_t是micsoft特有的,它是VARIANT的C++封装器类
4.传递数组
传递数组的类型为:SAFEARRAY**。

时间: 2024-08-09 02:21:08

关于BSTR数据类型的相关文章

CString char BSTR 转换

转自:http://www.cnblogs.com/lingyun1120/archive/2011/11/03/2234169.html 一.CString, int, string, char*之间的转换 string 转 CStringCString.Format("%s", string.c_str());char 转 CString  CString.Format("%s", char*);char 转 string  string s(char *);s

ATL - JavaScript混合编程

JavaScript混合编程- ATL 最后更新日期:2014-5-10 环境:Windows8.1 64bit英文版,Visual Studio 2013 Professional Update1英文版 阅读前提:COM的基本概念 内容简介 ATL(ActiveTemplate Library)是微软为了简化COM编程提供的一套C++模板,这里介绍如何用ATL建立一个简单的轻量级COM服务供JavaScript脚本调用,使我们对ATL的使用有个概念. Hello,World 使用Adminis

C++主要数据类型在计算机中所占字节大小

遇到了数据存储的大端和小端问题,这你妹的看的一头雾水,发现我基本知识严重匮乏啊,先了解C++各数据类型在自己机子上占多少字节吧,以及这些数据类型所占字节大小与神马有关.各种查资料然后写代码检验,小结于本文中,给自己补补基础知识. 先来列一下C++的数据类型: 整型:int,long.这两个还分signed(有符号)和unsigned(无符号)的,当然有符号和无符号所占字节大小是一样的,就不管他了. 布尔型:bool 字符型:char,wchar_t 浮点型:float,double 这只能上代码

VC常用数据类型使用转换

我们先定义一些常见类型变量借以说明 [cpp] view plain copy int i = 100; long l = 2001; float f=300.2; double d=12345.119; char username[]="赵三"; char temp[200]; char *buf; CString str; _variant_t v1; _bstr_t v2; 一.其它数据类型转换为字符串 短整型(int) [cpp] view plain copy itoa(i,

【转载】CString、BSTR和LPCTSTR之间的区别

原文:http://www.cnblogs.com/GT_Andy/archive/2011/01/18/1938605.html 一.定义 1.CString:动态的TCHAR数组.它是一个完全独立的类,封装了+等操作符和字符串操作方法. 2.BSTR:专有格式的字符串(需要使用系统函数来操纵).定义为:typedef OLECHAR FAR* BSTR 3.LPCTSTR:常量的TCHAR指针.定义为:typedef const char* LPCTSTR 二.要点 1.char*:指向AN

谈ATL(二)--BSTR与CComBSTR

关于BSTR类 BSTR类型的实质是指向一个带长度前缀的OLECHAR字符数组的指针. BSTR是指针数据类型.它指向数组的第一个字符,长度是以整数存储的数据中紧接第一个字符前面的位置. BSTR中的字符数组以NUL字符结束. 前缀长度以字节单位,描述的是字符串的长度,该长度不包括终止字符NUL. 字符数组内部可以包括有效的NUL字符. BSTR必须使用SysAllocString和SysFreeString函数族进行分配和释放. NULL的BSTR指针表示空字符串.简单讲就是BSTR *p =

Delphi 数据类型列表 good

Delphi 数据类型列表 分类 范围 字节 备注 简单类型 序数 整数 Integer -2147483648 .. 2147483647 4 有符号32位 Cardinal 0 .. 4294967295 4 无符号32位 Shortint -128 .. 127 1 有符号8位 Smallint -32768 .. 32767 2 有符号16位 Longint -2147483648 .. 2147483647 4 有符号32位 Int64 -263 .. 263 8 有符号64位 Byt

ATL接口返回类型&&ATL接口返回字符串BSTR*

感觉在ATL中做COM组件,添加方法的时候,其返回值只能是HRESULT,我想返回其他数据类型,可以吗? 非也非也 HRESULT指示返回的状态,即正确与否, 返回值是这样的 HRESULT MyMethod([in]int p1,[out,retval]int *pRetval); 在VB和脚本里就可以n=obj.MyMethod(123) 这是COM规范规定的,其他同上 COM规范并没有规定接口成员函数一定要返回HRESULT,可以返回其它类型的值,使用其它类型值时,组件没有远程能力,组件不

COM组件设计与应用(三)——数据类型

本文摘自:http://www.vckbase.com/index.php/wv/1206 一.前言 上回书介绍了GUID.CLSID.IID和接口的概念.本回的重点是介绍 COM 中的数据类型.咋还不介绍组件程序的设计步骤呀?咳......别着急,别着急!孔子曰:"饭要一口一口地吃":老子语:"心急吃不了热豆腐",孙子云:"走一步看一步吧" ...... 先掌握必要的知识,将来写起程序来才会得心应手也:-) 走入正题之前,请大家牢牢记住一条原则