问津BSTR

    COM 中除了使用一些简单标准的数据类型外(注2),字符串类型需要特别重点地说明一下。还记得原则吗?COM 组件是运行在分布式环境中的。通俗地说,你不能直接把一个内存指针直接作为参数传递给COM函数。你想想,系统需要把这块内存的内容传递到“地球另一 边”的计算机上,因此,我至少需要知道你这块内存的尺寸吧?不然让我如何传递呀?传递多少字节呀?!而字符串又是非常常用的一种类型,因此 COM 设计者引入了 BASIC 中字符串类型的表示方式---BSTR。BSTR 其实是一个指针类型,它的内存结构是:(输入程序片段 BSTR p = ::SysAllocString(L"Hello,你好");断点执行,然后观察p的内存)


图二、BSTR 内存结构

  BSTR 是一个指向 UNICODE 字符串的指针,且 BSTR 向前的4个字节中,使用DWORD保存着这个字符串的字节长度( 没有含字符串的结束符)。因此系统就能够正确处理并传送这个字符串到“地球另一 边”了。特别需要注意的是,由于BSTR的指针就是指向 UNICODE 串,因此 BSTR 和 LPOLESTR 可以在一定程度上混用,但一定要注意:
  有函数 fun(LPCOLESTR lp),则你调用 BSTR p=...; fun(p); 正确
  有函数 fun(const BSTR bstr),则你调用 LPCOLESTR p=...; fun(p); 错误!!!
有关 BSTR 的处理函数:
 

API 函数 说明
SysAllocString() 申请一个 BSTR 指针,并初始化为一个字符串
SysFreeString() 释放 BSTR 内存
SysAllocStringLen() 申请一个指定字符长度的 BSTR 指针,并初始化为一个字符串
SysAllocStringByteLen() 申请一个指定字节长度的 BSTR 指针,并初始化为一个字符串
SysReAllocStringLen() 重新申请 BSTR 指针

CString 函数


说明

AllocSysString() 从 CString 得到 BSTR
SetSysString() 重新申请 BSTR 指针,并复制到 CString 中

CComBSTR 函数

ATL 的 BSTR 包装类。在 atlbase.h 中定义

Append()、AppendBSTR()、AppendBytes()、ArrayToBSTR()、BSTRToArray()、AssignBSTR()、Attach()、Detach()、Copy()、CopyTo()、Empty()、Length()、ByteLength()、ReadFromStream()、WriteToStream()、LoadString()、ToLower()、ToUpper()
运算符重载:!,!=,==,<,>,&,+=,+,=,BSTR
    太多了,但从函数名称不能看出其基本功能。详细资料,查看MSDN 吧。另外,左侧函数,有很多是 ATL 7.0 提供的,VC6.0 下所带的 ATL 3.0 不支持。
    由于我们将来主要用 ATL 开发组件程序,因此使用 ATL 的 CComBSTR 为主。VC也提供了其它的包装类 _bstr_t。
时间: 2024-09-09 06:23:38

问津BSTR的相关文章

vb6.0-VB6.0怎么拿到C++ BSTR链接字符串

问题描述 VB6.0怎么拿到C++ BSTR链接字符串 求助VB6.0怎么拿到C++ BSTR链接字符串,BSTR在不同系统下是不是不同的? 解决方案 http://blog.hehehehehe.cn/a/1655.htm

java-jacob c++里方法的类型是bstr ,为啥JAVA调用时老是出错

问题描述 jacob c++里方法的类型是bstr ,为啥JAVA调用时老是出错 [id(4)] HRESULT sayHello2([in] BSTR say, [out, retval] BSTR* result); ComThread.InitMTA(true); ActiveXComponent com = new ActiveXComponent("CLSID:FF90EFCA-0856-4159-A9CC-0E7BBC317554") ; Dispatch disp = (

C++里面用到BSTR,Visula Basic 6.0里用StrConv转换存在乱码的问题

问题描述 C++里面用到BSTR,Visula Basic 6.0里用StrConv转换存在乱码的问题 C++里面用到BSTR,Visula Basic 6.0里用StrConv转换存在乱码的问题 解决方案 试试看StrConv(你的字符串,vbFromUnicode)

BSTR内存结构

COM 中除了使用一些简单标准的数据类型外,字符串类型需要特别重点地说明一下.还记得原则吗?COM组件是运行在分布式环境中的.通俗地说,你不能直接把一个内存指针直接作为参数传递给COM函数.你想想,系统需要把这块内存的内容传递到"地球另一边"的计算机上,因此,我至少需要知道你这块内存的尺寸吧?不然让我如何传递呀?传递多少字节呀?!而字符串又是非常常用的一种类型,因此 COM设计者引入了BASIC中字符串类型的表示方式-BSTR,BSTR 其实是一个指针类型,它的内存结构是:(输入程序片

Visula Basic 6.0 语言中BSTR是对应uncode字符串么?

问题描述 Visula Basic 6.0 语言中BSTR是对应uncode字符串么? Visula Basic 6.0 语言中BSTR是对应uncode字符串么?字符串用函数转换成utf8的方法是什么? 解决方案 http://blog.csdn.net/one_in_one/article/details/26346137

bstr-C++ string 转 BSTR 乱码

问题描述 C++ string 转 BSTR 乱码 std::string 转换为BSTR 乱码: 这种类型转换就不会乱码~~ SysAllocString(L"12345") 在下新手 小白 不知道哪里出错了,麻烦牛人指点一下 解决方案 mingw BSTR 转 stringchar* 转 BSTRstd::string 转BSTR的方法 解决方案二: 你用的Unicode字符集? 解决方案三: 百度上说是L 是Unicode , 我也不知道在哪设置,我用的VS2010~~ , 你用

ansi-c++里BSTR与Ansi字符串转换问题

问题描述 c++里BSTR与Ansi字符串转换问题 大虾在哪里,尝试在c++里多字节字符串转BSTR,然后再转回字符串,两次转换后,结果有误啊... 求解.... 代码如下: const UCHAR temp[17] = {0x89, 0x3d, 0xd8, 0x61, 0x67, 0x09, 0xd3, 0x4a, 0xeb, 0xe4, 0xaf, 0x46, 0xa3, 0xea, 0x56, 0xee,''}; string ss ; ss.append((const char*)tem

VC中的数据类型转换BSTR、char*和CString

简介 摘要:关于VC中的数据类型转换BSTR.char*和CString的深入研究. 步骤/方法 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应的

java调dll-JAVA如何处理DLL返回的BSTR类型

问题描述 JAVA如何处理DLL返回的BSTR类型 最近有个项目需要调用DLL,我使用JNA处理DLL里的方法的,里面有个方法返回的类型是BSTR,我用String接收这个返回类型,每次返回的都是1,用int则接收则得到一串数字,而且下一次调用返回的数字都是上一次调用的数字+56,我看DLL文档中的方法返回说明,每次返回的结果应该是不一样的.但是在JAVA中不知道如何获取正确的结果,请大家帮忙指教一下,谢谢了!