zoukankan      html  css  js  c++  java
  • bstr_t与BSTR

    转:https://blog.csdn.net/dyzhen/article/details/19398829

    bstr_t与BSTR

    问题:

    BSTR   a   =   _bstr_t("a");

    BSTR   b   =   _bstr_t("b"); 
    CString   c   ; 
    c   =   a; 
    MessageBox(c); 
    c   =   b; 
    MessageBox(c); 
    为什么消息框中显示的都是   b? 
    如果这样: 
        _bstr_t   bstr1("a"); 
    BSTR   a   =   bstr1; 
    _bstr_t   bstr2("b"); 
    BSTR   b   =   bstr2; 
    CString   c   ; 
    c   =   a; 
    MessageBox(c); 
    c   =   b; 
    MessageBox(c); 
    消息框中显示就对了!

    Answer:

    首先要明确,_bstr_t是对BSTR的封装。 
       
    Code   1: 
       
    BSTR   a   =   _bstr_t("a"); 
    //这里,_bstr_t("a")只是临时对象,当它初始化(包含一个内部的BSTR)并赋值给BSTR   a之后

    ,它就被撤销了。而它赋的值是BSTR的地址。 
    BSTR   b   =   _bstr_t("b"); 
    //第二次,仍然产生一个临时对象,它也初始化...过程跟上面一样。而且,由于前面的_bstr_t对

    象已被撤销,所以它产生BSTR的地址也同上。 
    //所以,实际上a,b指向同一个地址。而该地址的内容被写了两次。 
       
    Code   2: 
       
    _bstr_t   bstr1("a"); 
    BSTR   a   =   bstr1; 
    _bstr_t   bstr2("b"); 
    BSTR   b   =   bstr2; 
    //这里的两个_bstr_t   bstr1,bstr2都是局部对象,同时存在。所以,他们内部包含的BSTR的地

    址不一样。这样分别赋值就没问题。



    #if   defined(WIN32)   &&   !defined(OLE2ANSI) 
    typedef   WCHAR   OLECHAR; 
    #else 
    typedef   char   OLECHAR; 
    #endif 
    typedef   OLECHAR*   BSTR; 
       
    实际上BSTR就是直接指向字符串的首地址(双字节或者ANSI字符串)。 
    而BSTR之前的四个字节是该字符串的长度,由编译器生成的代码自动去读这个长度,而不是用""

    来标识字符串的结束。


    BSTR字符串有以下几个要点要强调一下: 
    1.一个BSTR字符串变量实际上是一个指针变量。它占用32bit即4个字节,就像其它的指针一样。

    而且,它指向一个Unicode格式的字符数组。但是,我们不能把字符串与BSTR字符串等同起来。我们

    必须用它自己确切的名字――“BSTR“。 
    2.一个BSTR字符串变量指向的字符串数组必须由4个字节的保留字开始(保存字符串数组的字节数

    而不是字符数),由2个空字符结束。 
    3.由于空字符在Unicode格式的字符串中的任何位置都有可能出现,所以,以空字符声明一个

    Unicode格式的字符串的结束并不合适。因此,在4个保留字中保存字符串的长度是至关重要的。 
    4.我们再强调一下,BSTR字符串指针实际指向的是Unicode格式的字符数组的首地址,而不是开头

    的4个字节。接下来我们就会看到,在这儿这样不厌其烦地强调BSTR字符串变量的特征是为了与马上

    就要解释的VC++中的string类型作个比较。 
    5.前4个字节的length记录的是字符数组的字节数(注意,不是字符数),包括结尾的空字节。因

    为数组是Unicode格式的,所以实际字符是length的一半。 
    在这儿强调一下,一个Unicode格式的空字符其实是占用2个字节的空间,而不是1个字节。在

    Unicode格式的数组中测试空字符时要当心这一点。 
    我们一般在惯例上说BSTR字符串“help”是“一个BSTR类型的字符串”。一般公认为,一个BSTR字

    符串变量指向的一个字符数组中包括至少两个空字符。 
    就Visual   Basic来说,BSTR字符串未尾的两个空字节可能没什么用处,但是对Win32来说,它们

    却是至关重要的。原因在于,Win32版本的Unicode   String(它称为LPWSTR)定义为指向一个空字

    符结尾的Unicode格式的字符串的指针。 
    从这个原因上解释BSTR字符串为什么要以空字符结尾就合情合理了。下面让我们讨论一下C++类型

    的string变量。 
    两句代码: 
    Dim   str   as   String 
    str=”help” 
    str表示的是一个BSTR字符串变量的名字,而不是一个Unicode格式的字符数组。换句话说,str是

    一个保存地址xxxx的变量的名字。 
    以下是个小小的实验,它表明Visual   Basic中string变量是指向字符数组的指针而不是字符数组

    。下面定义了一个结构,它的成员变量的类型是string。 
    Private   Tyep   utTest 
    astring   As   String 
    bstring   As   String 
    End   Type 
    Dim   uTest   As   utTest 
    Dim   s   as   String 
    s=”testing” 
    uTest.astring=”testing” 
    uTest.astring=”testing” 
    Debug.Print   Len(s) 
    Debug.Print   Len(uTest) 
    这几句代码的执行结果是: 


    对string变量来说,Len函数返回的是字符串数组的字符个数。所以7个字符的字符串“testing”

    返回7。对结构变量uTest来说,Len函数返回的是该结构占用的内存空间。所以返回值8清楚地表明了

    每一个BSTR变量在内存中占用4个字节。因为BSTR是一个Win32的指针! 
    C类型的LPSTR和LPWSTR   字符串 
    Visual   C++使用LPSTR和LPWSTR字符串。 
    LPSTR类型字符串的定义是:指向一个空字节结尾的ANSI格式的字符串数组的指针。但是,因为我

    们是以空字节的位置来判断LPSTR字符串的终止的,所以,在LPSTR中是不允许字符串中还有第二个空

    字节存在。同样,LPWSTR是一个指向空字节终止的Unicode格式的字符串的指针,它的中间也不允许

    有空字节存在。LPWSTR中的W指Wide,它是微软对Unicode的另一种说法。 
       
    可能我们也会碰到LPCSTR和LPCWSTR类型的字符串。其中的C表示Constant(常量)。这种字符串是

    不能被API函数修改的。除此以外,LPCSTR都与LPSTR相同。同理,LPCWSTR除不能修改外,其它的都

    与LPWSTR相同。 
    再说LPTSTR,LPTSTR一般都用在条件编译中,就象TCHAR一样。以下是一个例子代码: 
    #ifdef     UNICODE 
    typedef   LPWSTR   LPTSTR;             //   在Unicode下LPTSTR与LPWSTR是相同的 
    typedef   LPCWSTR   LPCTSTR;         //   在Unicode下LPCTSTR与LPCWSTR是相同的 
    #else        
    typedef   LPSTR   LPTSTR;               //在ANSI下LPTSTR与LPSTR是相同的 
    typedef   LPCSTR   LPCTSTR;           //在ANSI下LPTCSTR与LPCSTR是相同的 
    #endif

  • 相关阅读:
    进度条
    html5 表单新增事件
    html5 表单的新增type属性
    html5 表单的新增元素
    html5 语义化标签
    jq 手风琴案例
    codeforces 702D D. Road to Post Office(数学)
    codeforces 702C C. Cellular Network(水题)
    codeforces 702B B. Powers of Two(水题)
    codeforces 702A A. Maximum Increase(水题)
  • 原文地址:https://www.cnblogs.com/CipherLab/p/14874711.html
Copyright © 2011-2022 走看看