将BSTR字符串传递给_bstr_t或CComBSTR构造函数时发生访问冲突

时间:2013-08-11 12:31:32

标签: c++ com crash access-violation bstr

我有从BS服务器传递的BSTR字符串。当我将此字符串放入_bstr_t(或CComBSTR)构造函数时,会发生访问冲突。我检查了这个异常,发现只有当BSTR为空(或为空)时才会引发此异常。

我试图将明确的BSTR明确地放到_bstr_t构造函数中,这样可以正常工作:

BSTR bstr = NULL;
_bstr_t t(bstr, false); 

cout << t.length() << endl;

但是从BS服务器传递的BSTR不起作用 - 当字符串为空或为空(或者可能已损坏?)时,会出现访问冲突异常。

我发现这种解决方法运行正常:

if (SysStringLen(bstrFromCOMserver) > 0) {
    _bstr_t t(bstrFromCOMserver, false);    
    cout << t.length() << endl;
}

但我想知道为什么这不能直接使用_bstr_t或CComBSTR包装器:

_bstr_t t(bstrFromCOMserver, false);
if (t.length() > 0) {...}

更新

COM服务器如何传递BSTR字符串:

void CALLBACK CProxy_ISTIQuoteEvents::OnSTIQuoteSnap(const structSTIQuoteSnap& structQuoteSnap) const { 
        if (SysStringLen(structQuoteSnap.bstrUpdateTime) > 0) {
            _bstr_t updateTime(structQuoteSnap.bstrUpdateTime, false);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

OnSTIQuoteSnap方法属于事件接收器,由服务器回调,正如我们在评论中阐明的那样。因此,服务器(作为调用者)保持对structQuoteSnap结构及其所有字段的所有权。 updateTime是一个本地智能指针变量,它应该复制字符串(structQuoteSnap.bstrUpdateTime),但它不会(因为false传递给它的构造函数),所以它宁愿接管BSTR的记忆。只要updateTime超出范围,就会释放此内存。服务器对此一无所知,可能继续使用bstrUpdateTime,最终可能会尝试两次释放相同的内存。