FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

VARIANT型について Part.3 【Visual C++】

< 前へ 次へ >


・VariantClear 関数
確保したリソースを解放し、VT_EMPTY を設定し、初期化します。

Wine Cross Reference[wine/dlls/oleaut32/variant.c] の抜粋
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) の操作関数
< 前へ 次へ >

スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

カテゴリ
月別アーカイブ
最新記事
最新コメント
最新トラックバック
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。