COM サーバーから渡される BSTR 文字列があります。この文字列を _bstr_t (または CComBSTR) コンストラクターに入れると、アクセス違反が発生します。この例外を調べたところ、この例外は BSTR が空 (または null) の場合にのみ発生することがわかりました。
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);
}
}
}