私の答えも遅いです。署名があるとしますHRESULT PutDescription (BSTR NewDescription);
。その場合、次のようにします
_bstr_t NewAdvice = L"Great advice!";
HRESULT hr1 = PutDescription(NewAdvice.GetBSTR());
COMの規則により、関数PutDescription
は渡されたを変更または破棄することさえ許可されていませんBSTR
。
反対の場合は、関数を使用しHRESULT GetDescription (BSTR *pActualDescription);
て処女を渡します。_bstr_t
GetAddress()
_bstr_t GetAdvice;
HRESULT hr2 = GetDescription(GetAdvice.GetAddress());
この関数GetAddress()
は、既存の文字列を解放し、新しく割り当てられた文字列のアドレスを返します。したがって、コンテンツを含むを渡すと_bstr_t
、このコンテンツは解放され、失われます。_bstr_t
同じを共有するすべてのsに同じことが起こりBSTR
ます。しかし、これは愚かなことだと思います。コンテンツを変更することになっている関数にコンテンツを含む引数を渡すのはなぜですか?
_bstr_t GetAdvice = L"This content will not survive the next function call!";
HRESULT hr = GetDescription(GetAdvice.GetAddress());
_bstr_t
本物のモロンは、生に割り当てられたを渡すことさえできBSTR
ます:
BSTR Bst = ::SysAllocString(L"Who would do that?");
_bstr_t GetDescr;
GetDescr.Attach(Bst);//GetDescr wraps Bst, no copying!
HRESULT hr = GetDescription(GetDescr.GetAddress());
その場合GetDescr
、期待値を取得しますが、の内容Bst
は予測できません。