VC里面声明一个BSTR,调试器显示器类型就是wchar_t*。
问题是,网上的介绍都说BSTR是个VB能用的字符串类型,在它的头部是个2字节长的长度信息,后面才是内容。但是我发现,如果我写BSTR s=L"abc",那么调试器显示s的第一个元素就是a,而不是什么长度信息。然后我怀疑长度信息在s之前或者之后,因此我写了个小的测试程序,如下:#include<algorithm>
#include<iostream>
#include<iterator>
using namespace std;
int main(void)
{
    BSTR bstr=L"abc";
    LPWSTR lp=bstr;
    short* ps=(short*)bstr;
    copy(&ps[-4],&ps[8],ostream_iterator<short>(cout,","));
    return 0;
}运行的结果是:15797,1451,0,0,97,98,99,0,0,0,112,61,Press any key to continue . . .并没有我们想看到的长度信息"3"。这是为什么呢? BSTR的长度到底在哪里?

解决方案 »

  1.   

    BSTR bstr=L"abc";
    这样定义出来的字符串并不是一个标准的VB字符串。
    标准的BSTR字符应该是用::SysAllocString()创建的字符串。
    你把你的第一行代码BSTR bstr=L"abc"; 
    改成BSTR bstr = ::SysAllocString(L"abc");
    再试试看看。BSTR bstr = ::SysAllocString(L"abc");
    DWORD dwLen = *(bstr-2);
    cout<<dwLen<<endl;
      

  2.   

    它的头部是个4字节长的长度信息。注意,是4个字节,不是2个字节。
    你可以看百度百科上的介绍:http://baike.baidu.com/view/3346619.htm什么是BSTR
    BSTR是“Basic STRing”的简称,微软在COM/OLE中定义的标准字符串数据类型。
    对于C++,Windows头文件wtypes.h中定义如下:
    typedef wchar_t WCHAR;
    typedef WCHAR OLECHAR;
    typedef OLECHAR __RPC_FAR *BSTR;;
    使用以Null结尾的简单字符串在COM component间传递不太方便。因此,标准BSTR是一个有长度前缀和null结束符的OLECHAR数组。BSTR的前4字节是一个表示字符串长度的前缀。BSTR长度域的值是字符串的字节数,并且不包括0结束符。
    由于是Unicode串,所以字符数是字节数的一半。这种方式的优点是允许程序员在BSTR串中间嵌入NULL字符。但是,BSTR的前四个字节表示长度,而OLECHAR数组的前四字节表示前两个字符。这种情况下,对于C++程序,如何实现BSTR和OLECHAR的交换?答案是COM提供了两个BSTR分配用的API:SysAllocString / SysReallocString。函数返回的指针指向BSTR的第一个字符,而不是BSTR在内存的第一个字节。