0

我有从 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);
        }
    }
}
4

1 回答 1

1

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

于 2013-08-12T04:03:54.907 回答