各个dx有兴趣看看下边的各个代码都有什么错误
帮助新手更好理解它们的用法
更请各个dx补充void Q1()
{
BSTR bstr=SysAllocString(L"this is a string");
_bstr_t bstr_t(bstr);
...
SysFreeString(bstr);

}
void Q2()
{
BSTR bstr=SysAllocString(L"this is a string");
_bstr_t bstr_t;
bstr_t=bstr;
...
SysFreeString(bstr);}
void Q3()
{
BSTR bstr=SysAllocString(L"this is a string");
_bstr_t bstr_t; bstr_t=bstr;

bstr=bstr_t;
...
SysFreeString(bstr);
}void Q4()
{
BSTR bstr=SysAllocString(L"this is a string");
_bstr_t bstr_t(bstr,false);
...
SysFreeString(bstr);
}

解决方案 »

  1.   

    _bstr_t( )   Constructs a default _bstr_t object that encapsulates a NULL BSTR object. 
    _bstr_t( _bstr_t& s1 )   Constructs a _bstr_t object as a copy of another. This is a "shallow" copy, which increments the reference count of the encapsulated BSTR object instead of creating a new one. 
    _bstr_t( char* s2 )   Constructs a _bstr_t object by calling SysAllocString to create a new BSTR object and encapsulate it. This constructor first performs a multibyte to Unicode conversion. 
    If s2 is too large, you may generate a stack overflow error. In such a situation, convert your char* to a wchar_t with MultiByteToWideChar and then call the wchar_t * constructor. _bstr_t( wchar_t* s3 )   Constructs a _bstr_t object by calling SysAllocString to create a new BSTR object and encapsulates it. 
    _bstr_t( _variant_t& var )   Constructs a _bstr_t object from a _variant_t object by first retrieving a BSTR object from the encapsulated VARIANT object. 
    _bstr_t( BSTR bstr | bool fCopy )   Constructs a _bstr_t object from an existing BSTR (as opposed to a wchar_t* string). If fCopy is false, the supplied BSTR is attached to the new object without making a new copy with SysAllocString. This is the method used by the wrapper functions in the type library headers to encapsulate and take ownership of a BSTR, returned by an interface method, in a _bstr_t object.
      

  2.   

    楼上是正解吗?我也想学学请继续详解,_bstr_t是一个管理 BSTR 的类,现在讨论的是如何给它初始化或赋值的问题,另外是否也可以扩大一下范围,讨论一下UNICODE 和ANSI 之间的相互转换,这中间的汉字处理的方法。请高手们继续详解。高度关切。
      

  3.   

    1和2 对。
    3不对。
    bstr=bstr_t;
    ...
    SysFreeString(bstr);
    这里bstr指向的内存是由_bstr_t管理的,
    因此不能调用SysFreeString(bstr);
      

  4.   

    4.不对
    bstr_t已经接管了bstr的内存,就不需要SysFreeString释放了
    其实就象用new 分配的内存给一个auto_ptr对象一样.不用例外的delete
      

  5.   

    Q1(): 错
    串被释放了两次Q2(): 对Q3(): 错
    BSTR bstr=SysAllocString(L"this is a string");
    _bstr_t bstr_t; bstr_t=bstr; 

    bstr=bstr_t; // bstr 永远地丢了
    ...
    SysFreeString(bstr);
    Q4(): 错
    串被释放了两次
      

  6.   

    Q3  有错误!!!
    BSTR不该在没释放时就重新赋值
    bstr_t = bstr:
    SysFreeString(bstr);
    bstr = bstr_t;要避免BSTR和_bstr_t混用!
    BSTR -》_bstr_t 赋值后就立即释放BSTR
    _bstr_t -》 BSTR 使用_bstr_t的copy()
      

  7.   

    同意 force_eagle(战鹰) 经验
    BSTR -》_bstr_t 赋值后就立即释放BSTR
    _bstr_t -》 BSTR 使用_bstr_t的copy()
      

  8.   

    force_eagle(战鹰) 要分情况的,以下这段表明,如果用
    BSTR a=::SysAllocString(L"123");
    _bstr_t test(a,FALSE);
    就不能释放BSTR_bstr_t( BSTR bstr | bool fCopy )   Constructs a _bstr_t object from an existing BSTR (as opposed to a wchar_t* string). If fCopy is false, the supplied BSTR is attached to the new object without making a new copy with SysAllocString. This is the method used by the wrapper functions in the type library headers to encapsulate and take ownership of a BSTR, returned by an interface method, in a _bstr_t object.
      

  9.   

    各位dx,有兴趣咱们再来讨论几个。对俺自己也是学习。
    看看以下的写法都会有什么问题吗?_bstr_t m_bstrt; //一个类成员
    void X1(/*[out]*/BSTR* bstrRet)
    {
    *bstrRet=m_bstrt;
    }
    void X2(/*[out]*/BSTR* bstrRet)
    {
    *bstrRet=m_bstrt.copy ();
    }
    void X3(/*[out]*/BSTR* bstrRet)
    {
    *bstrRet=SysAllocString(m_bstrt);
    }
    void X4(/*[out]*/BSTR* bstrRet)
    {
    BSTR bstr;
    bstr=m_bstrt;
    *bstrRet=bstr;
    }×××××××××××××××××××××××CComBSTR m_bstr;//一个类成员
    void Y1(/*[out]*/BSTR* bstrRet)
    {
    *bstrRet=m_bstr;
    }void Y2(/*[out]*/BSTR* bstrRet)
    {
    *bstrRet=m_bstr.Detach ();
    }
    void Y3(/*[out]*/BSTR* bstrRet)
    {
    *bstrRet=SysAllocString(m_bstr);
    }
    void Y4(/*[out]*/BSTR* bstrRet)
    {
    BSTR bstr;
    bstr=m_bstr;
    *bstrRet=bstr;
    }
      

  10.   

    void X1(/*[out]*/BSTR* bstrRet)
    {
    *bstrRet=m_bstrt; // Wrong
    }
    *bstrRet= SysAllocString(m_bstrt);void X2(/*[out]*/BSTR* bstrRet)
    {
    *bstrRet=m_bstrt.copy (); //OK
    }void X3(/*[out]*/BSTR* bstrRet)
    {
    *bstrRet=SysAllocString(m_bstrt); //OK
    }void X4(/*[out]*/BSTR* bstrRet)
    {
    BSTR bstr;
    bstr=m_bstrt; // Wrong
    *bstrRet=bstr;
    }
    bstr=SysAllocString(m_bstrt);void Y1(/*[out]*/BSTR* bstrRet)
    {
    *bstrRet=m_bstr; // Wrong
    }
    *bstrRet=SysAllocString(m_bstr);void Y2(/*[out]*/BSTR* bstrRet)
    {
    *bstrRet=m_bstr.Detach (); //OK
    }
    void Y3(/*[out]*/BSTR* bstrRet)
    {
    *bstrRet=SysAllocString(m_bstr); //OK
    }
    void Y4(/*[out]*/BSTR* bstrRet)
    {
    BSTR bstr;
    bstr=m_bstr; //Wrong
    *bstrRet=bstr;
    }
             bstr=SysAllocString(m_bstr);
      

  11.   

    我也提个问题
    下面的写法有哪些问题? BSTR Addr1, Addr2;

    Addr1 = OLESTR("Test");
    Addr2 = OLESTR("Memm");         Addr2 = SysAllocString(Addr1);
      

  12.   

    long k;
    _bstr_t tt(k);
    tt.Destroy();
    tt=k;
    在赋值中_bstr_t 实际上是重新分配了一个对象
    所以在次使用必须释放