gpt4 book ai didi

c++ - 将 BSTR 字符串传递给 _bstr_t 或 CComBSTR 构造函数时出现访问冲突

转载 作者:行者123 更新时间:2023-11-28 07:28:48 24 4
gpt4 key购买 nike

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

我试图将空化的 BSTR 显式地放入 _bstr_t 构造函数,这工作正常:

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

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

但是对于从 COM 服务器传递的 BSTR,这不起作用 - 当字符串为空或 null(或者可能已损坏?)时,会发生访问冲突异常

我发现这个解决方法工作正常:

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);
}
}
}

最佳答案

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

关于c++ - 将 BSTR 字符串传递给 _bstr_t 或 CComBSTR 构造函数时出现访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18171921/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com