VARIANT型について Part.3 【Visual C++】
・VariantClear 関数
確保したリソースを解放し、VT_EMPTY を設定し、初期化します。
Wine Cross Reference[wine/dlls/oleaut32/variant.c] の抜粋
上のソースコードをみると、BSTR 等の確保したものをここでは解放してくれています。
最後に、VARTYPE に、VT_EMPTY (0 で初期化)を代入しています。
そうすると、VariantClear 関数を使用した後は、そのバリアント変数を使うときは、VariantInit 関数は使わなくてよいみたいです。
●VariantClear 関数使用後の VARIANT の主要変数の中身
下のソースを実行してみると ...
[A] の部分のVARIANT の主要変数の中身
当然、VARTYPE 及び intVal に設定した数値が入っています。
次に、VariantClear 関数処理後は ...
[B] の部分のVARIANT の主要変数の中身
VARTYPE に、VT_EMPTY (0 で初期化)をが代入されています。
ここでは、メモリを確保する BSTR 等は使用していないので、出力していませんが、それも解放されるのでしょう。
通常の int タイプ等の変数は、そのままで放置されています。
●参考
バリアント型 (Variant) の操作関数
< 前へ 次へ >
653 HRESULT WINAPI VariantClear(VARIANTARG* pVarg)
654 {
655 HRESULT hres;
656
657 TRACE("(%p->(%s%s))\n", pVarg, debugstr_VT(pVarg), debugstr_VF(pVarg));
658
659 hres = VARIANT_ValidateType(V_VT(pVarg));
660
661 if (SUCCEEDED(hres))
662 {
663 if (!V_ISBYREF(pVarg))
664 {
665 if (V_ISARRAY(pVarg) || V_VT(pVarg) == VT_SAFEARRAY)
666 {
667 hres = SafeArrayDestroy(V_ARRAY(pVarg));
668 }
669 else if (V_VT(pVarg) == VT_BSTR)
670 {
671 SysFreeString(V_BSTR(pVarg));
672 }
673 else if (V_VT(pVarg) == VT_RECORD)
674 {
675 struct __tagBRECORD* pBr = &V_UNION(pVarg,brecVal);
676 if (pBr->pRecInfo)
677 {
678 IRecordInfo_RecordClear(pBr->pRecInfo, pBr->pvRecord);
679 IRecordInfo_Release(pBr->pRecInfo);
680 }
681 }
682 else if (V_VT(pVarg) == VT_DISPATCH ||
683 V_VT(pVarg) == VT_UNKNOWN)
684 {
685 if (V_UNKNOWN(pVarg))
686 IUnknown_Release(V_UNKNOWN(pVarg));
687 }
688 }
689 V_VT(pVarg) = VT_EMPTY;
690 }
691 return hres;
692 }
上のソースコードをみると、BSTR 等の確保したものをここでは解放してくれています。
最後に、VARTYPE に、VT_EMPTY (0 で初期化)を代入しています。
そうすると、VariantClear 関数を使用した後は、そのバリアント変数を使うときは、VariantInit 関数は使わなくてよいみたいです。
●VariantClear 関数使用後の VARIANT の主要変数の中身
下のソースを実行してみると ...
VARIANT vt;
::VariantInit(&vt);
// int 型の変数に 500 を代入
vt.vt = VT_INT;
vt.intVal = 500;
// [A] ここでの出力
::VariantClear(&vt);
// [B] ここでの出力
[A] の部分のVARIANT の主要変数の中身
VARTYPE vt = 22
LONGLONG llVal = 18041912069980660
LONG lVal = 500
BYTE bVal = *
SHORT iVal = 500
FLOAT fltVal = 7.00649e-043
DOUBLE dblVal = 1.79093e-307
VARIANT_BOOL boolVal = 500
SCODE scode = 500
CHAR cVal = *
USHORT uiVal = 500
ULONG ulVal = 500
ULONGLONG ullVal = 18041912069980660
INT intVal = 500
UINT uintVal = 500
当然、VARTYPE 及び intVal に設定した数値が入っています。
次に、VariantClear 関数処理後は ...
[B] の部分のVARIANT の主要変数の中身
VARTYPE vt = 0
LONGLONG llVal = 18041912069980660
LONG lVal = 500
BYTE bVal = *
SHORT iVal = 500
FLOAT fltVal = 7.00649e-043
DOUBLE dblVal = 1.79093e-307
VARIANT_BOOL boolVal = 500
SCODE scode = 500
CHAR cVal = *
USHORT uiVal = 500
ULONG ulVal = 500
ULONGLONG ullVal = 18041912069980660
INT intVal = 500
UINT uintVal = 500
VARTYPE に、VT_EMPTY (0 で初期化)をが代入されています。
ここでは、メモリを確保する BSTR 等は使用していないので、出力していませんが、それも解放されるのでしょう。
通常の int タイプ等の変数は、そのままで放置されています。
●参考
バリアント型 (Variant) の操作関数
スポンサーサイト