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