次のシグネチャを使用する方法で、C++で記述されたCOMオブジェクトがあります。バリアントにはBSTR(VT_BYREF | VT_BSTRではなくVT_BSTRのみ)が含まれているとします。入力BSTR VARIANTでVariantChangeTypeを呼び出すことはできますか?
HRESULT myfunc(/*[in]*/ VARIANT param)
タイプを別のものに変更したいとします。 VariantChangeTypeの最初のパラメータが2番目のパラメータと同じ場合は、 "その変種はその場で変換されます。"
そこで、変換はできますか?
HRESULT myfunc(/*[in]*/ VARIANT param)
{
VariantChangeType(¶m, param, 0, VT_I4);
}
または、第2の亜種にコピーしてください。
HRESULT myfunc(/*[in]*/ VARIANT param)
{
VARIANT temp;
VariantInit(&temp);
VariantChangeType(&temp, param, 0, VT_I4);
}
私の理解では、前者がクライアントによって所有され、クライアントによって解放しなければならないBSTRを解放するであろうから、後者が必要とされることです。
いいえ、VariantChangeType()は結果を別のバリアントに格納します。第1引数として渡すもの。したがって、BSTRをリリースする理由は全くありません。 –
@HansPassant VariantChangeType()の最初のパラメーターは、2番目のパラメーターと同じにすることができます。つまり、バリアントが変換されます。だから、おそらく、私はその場所に変換するか、第二の変種に変換する方がよいでしょうか?私は明確にするために質問を更新しました。 – jveazey
FWIW、問題を示すためにGistを作成しました:https://gist.github.com/Neuroboy23/efb3d45783faf03bd87ee2a69519ce84 –