0

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

1 に答える 1