「VARIANT型」の編集履歴(バックアップ)一覧はこちら
「VARIANT型」(2009/02/06 (金) 17:08:22) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
***関連ヘッダーファイル
-OAIdl.h
-OleAuto.h &space(10) (OAIdl.hをインクルド)
-ole2.h &space(16) (OleAuto.hをインクルド)
----
***メンバと弁別子との対応表
|CENTER:BGCOLOR(yellow):型|CENTER:BGCOLOR(yellow):メンバ|CENTER:BGCOLOR(yellow):弁別子|CENTER:BGCOLOR(yellow):値|CENTER:BGCOLOR(yellow):備考|
|LONGLONG |llVal |VT_I8 |0x0014||
|LONG |lVal |VT_I4 |0x0003||
|BYTE |bVal |VT_UI1 |0x0011||
|SHORT |iVal |VT_I2 |0x0002||
|FLOAT |fltVal |VT_R4 |0x0004||
|DOUBLE |dblVal |VT_R8 |0x0005||
|VARIAT_BOOL |boolVal |VT_BOOL |0x000b||
|SCODE |scode |VT_ERROR |0x000a||
|CY |cyVal |VT_CY |0x0006||
|DATE |date |VT_DATE |0x0007||
|BSTR |bstrVal |VT_BSTR |0x0008||
|IUnknown * |punkVal |VT_UNKNOWN |0x000d||
|IDispatch * |pdispVal |VT_DISPATCH |0x0009||
|SAFEARRAY * |parray |VT_ARRAY |0x2000||
|BYTE * |pbVal |VT_BYREF│VT_UI1 |0x4011||
|SHORT * |piVal |VT_BYREF│VT_I2 |0x4002||
|LONG * |plVal |VT_BYREF│VT_I4 |0x4003||
|LONGLONG * |pllVal |VT_BYREF│VT_I8 |0x4014||
|FLOAT * |pfltVal |VT_BYREF│VT_R4 |0x4004||
|DOUBLE * |pdblVal |VT_BYREF│VT_R8 |0x4005||
|VARIANT_BOOL *|pboolVal |VT_BYREF│VT_BOOL |0x400b||
|SCODE * |pscode |VT_BYREF│VT_ERROR |0x400a||
|CY * |pcyVal |VT_BYREF│VT_CY |0x4006||
|DATE * |pdate |VT_BYREF│VT_DATE |0x4007||
|BSTR * |pbstrVal |VT_BYREF│VT_BSTR |0x4008||
|IUnknown ** |ppunkVal |VT_BYREF│VT_UNKNOWN |0x400d||
|IDispatch ** |ppdispVal|VT_BYREF│VT_DISPATCH |0x4009||
|SAFEARRAY ** |pparray |VT_BYREF│VT_ARRAY |0x6000||
|VARIANT * |pvarVal |VT_BYREF│VT_VARIANT |0x400c||
|PVOID |byref |VT_BYREF(Generic ByRef)|0x4000||
|CHAR |cVal |VT_I1 |0x0010||
|USHORT |uiVal |VT_UI2 |0x0012||
|ULONG |ulVal |VT_UI4 |0x0013||
|ULONGLONG |ullVal |VT_UI8 |0x0015||
|INT |intVal |VT_INT |0x0016||
|UINT |uintVal |VT_UINT |0x0017||
|DECIMAL * |pdecVal |VT_BYREF│VT_DECIMAL |0x400e||
|CHAR * |pcVal |VT_BYREF│VT_I1 |0x4010||
|USHORT * |puiVal |VT_BYREF│VT_UI2 |0x4012||
|ULONG * |pulVal |VT_BYREF│VT_UI4 |0x4013||
|ULONGLONG * |pullVal |VT_BYREF│VT_UI8 |0x4015||
|INT * |pintVal |VT_BYREF│VT_INT |0x4016||
|UINT * |puintVal |VT_BYREF│VT_UINT |0x4017||
----
***VT列挙型
enum VARENUM
{
VT_EMPTY = 0,
VT_NULL = 1,
VT_I2 = 2,
VT_I4 = 3,
VT_R4 = 4,
VT_R8 = 5,
VT_CY = 6,
VT_DATE = 7,
VT_BSTR = 8,
VT_DISPATCH = 9,
VT_ERROR = 10,
VT_BOOL = 11,
VT_VARIANT = 12,
VT_UNKNOWN = 13,
VT_DECIMAL = 14,
VT_I1 = 16,
VT_UI1 = 17,
VT_UI2 = 18,
VT_UI4 = 19,
VT_I8 = 20,
VT_UI8 = 21,
VT_INT = 22,
VT_UINT = 23,
VT_VOID = 24,
VT_HRESULT = 25,
VT_PTR = 26,
VT_SAFEARRAY = 27,
VT_CARRAY = 28,
VT_USERDEFINED = 29,
VT_LPSTR = 30,
VT_LPWSTR = 31,
VT_RECORD = 36,
VT_INT_PTR = 37,
VT_UINT_PTR = 38,
VT_FILETIME = 64,
VT_BLOB = 65,
VT_STREAM = 66,
VT_STORAGE = 67,
VT_STREAMED_OBJECT = 68,
VT_STORED_OBJECT = 69,
VT_BLOB_OBJECT = 70,
VT_CF = 71,
VT_CLSID = 72,
VT_VERSIONED_STREAM = 73,
VT_BSTR_BLOB = 0xfff,
VT_VECTOR = 0x1000,
VT_ARRAY = 0x2000,
VT_BYREF = 0x4000,
VT_RESERVED = 0x8000,
VT_ILLEGAL = 0xffff,
VT_ILLEGALMASKED = 0xfff,
VT_TYPEMASK = 0xfff
} ;
----
***VARIANT型の解放について
内部で解放が必要な型が使われている場合(SAFEARRAYやBSTRなど)、
>VariantClear()
を使って解放を行う。
VariantClear()は使われている型に従って、内部でメモリの解放を
してくれる。
SAFEARRAY配列のなかで解放が必要な型などを使っている場合も、
きちんと追って解放してくれるらしい。
----
***VARIANT型のコピー
>VariantCopy(*dst,*src)
を使ってコピーすることが可能だが、&b(){VariantInit()}を使って
きちんと初期化しないと値が不定になるので注意。
&color(red){vtメンバがコピーされないっぽい。}
----
***型変換
>VariantChangeType(*dst,*src,flg,type)
を使うことで型変換をすることが可能。
もちろん&b(){*dst=*src}とすることもできる。
一番使うのではないかと思われるのが &b(){VT_DATE ⇒ VT_BSTR}ではないだろうか。
VT_DATEがdouble型な上、一体どういう値なのか良く分からない(調べていない)ので
この関数で型変換してしまったほうがいいだろう。
ちなみにVT_DATEのときの値はtime_tとは異なるのは確か。
***関連ヘッダーファイル
-OAIdl.h
-OleAuto.h &space(10) (OAIdl.hをインクルド)
-ole2.h &space(16) (OleAuto.hをインクルド)
----
***メンバと弁別子との対応表
|CENTER:BGCOLOR(yellow):型|CENTER:BGCOLOR(yellow):メンバ|CENTER:BGCOLOR(yellow):弁別子|CENTER:BGCOLOR(yellow):値|CENTER:BGCOLOR(yellow):typedef|CENTER:BGCOLOR(yellow):備考|
|LONGLONG |llVal |VT_I8 |0x0014|__int64||
|LONG |lVal |VT_I4 |0x0003|long||
|BYTE |bVal |VT_UI1 |0x0011|unsigned char||
|SHORT |iVal |VT_I2 |0x0002|short||
|FLOAT |fltVal |VT_R4 |0x0004|float||
|DOUBLE |dblVal |VT_R8 |0x0005|double||
|VARIAT_BOOL |boolVal |VT_BOOL |0x000b|short|0==FALSE,-1==TRUE|
|SCODE |scode |VT_ERROR |0x000a|LONG||
|CY |cyVal |VT_CY |0x0006||通貨型?|
|DATE |date |VT_DATE |0x0007|double||
|BSTR |bstrVal |VT_BSTR |0x0008|OLECHAR*||
|IUnknown * |punkVal |VT_UNKNOWN |0x000d|||
|IDispatch * |pdispVal |VT_DISPATCH |0x0009|||
|SAFEARRAY * |parray |VT_ARRAY |0x2000|||
|BYTE * |pbVal |VT_BYREF│VT_UI1 |0x4011|||
|SHORT * |piVal |VT_BYREF│VT_I2 |0x4002|||
|LONG * |plVal |VT_BYREF│VT_I4 |0x4003|||
|LONGLONG * |pllVal |VT_BYREF│VT_I8 |0x4014|||
|FLOAT * |pfltVal |VT_BYREF│VT_R4 |0x4004|||
|DOUBLE * |pdblVal |VT_BYREF│VT_R8 |0x4005|||
|VARIANT_BOOL *|pboolVal |VT_BYREF│VT_BOOL |0x400b|||
|SCODE * |pscode |VT_BYREF│VT_ERROR |0x400a|||
|CY * |pcyVal |VT_BYREF│VT_CY |0x4006|||
|DATE * |pdate |VT_BYREF│VT_DATE |0x4007|||
|BSTR * |pbstrVal |VT_BYREF│VT_BSTR |0x4008|||
|IUnknown ** |ppunkVal |VT_BYREF│VT_UNKNOWN |0x400d|||
|IDispatch ** |ppdispVal|VT_BYREF│VT_DISPATCH |0x4009|||
|SAFEARRAY ** |pparray |VT_BYREF│VT_ARRAY |0x6000|||
|VARIANT * |pvarVal |VT_BYREF│VT_VARIANT |0x400c|||
|PVOID |byref |VT_BYREF(Generic ByRef)|0x4000|||
|CHAR |cVal |VT_I1 |0x0010|||
|USHORT |uiVal |VT_UI2 |0x0012|||
|ULONG |ulVal |VT_UI4 |0x0013|||
|ULONGLONG |ullVal |VT_UI8 |0x0015|||
|INT |intVal |VT_INT |0x0016|||
|UINT |uintVal |VT_UINT |0x0017|||
|DECIMAL * |pdecVal |VT_BYREF│VT_DECIMAL |0x400e|||
|CHAR * |pcVal |VT_BYREF│VT_I1 |0x4010|||
|USHORT * |puiVal |VT_BYREF│VT_UI2 |0x4012|||
|ULONG * |pulVal |VT_BYREF│VT_UI4 |0x4013|||
|ULONGLONG * |pullVal |VT_BYREF│VT_UI8 |0x4015|||
|INT * |pintVal |VT_BYREF│VT_INT |0x4016|||
|UINT * |puintVal |VT_BYREF│VT_UINT |0x4017|||
----
***VT列挙型
enum VARENUM
{
VT_EMPTY = 0,
VT_NULL = 1,
VT_I2 = 2,
VT_I4 = 3,
VT_R4 = 4,
VT_R8 = 5,
VT_CY = 6,
VT_DATE = 7,
VT_BSTR = 8,
VT_DISPATCH = 9,
VT_ERROR = 10,
VT_BOOL = 11,
VT_VARIANT = 12,
VT_UNKNOWN = 13,
VT_DECIMAL = 14,
VT_I1 = 16,
VT_UI1 = 17,
VT_UI2 = 18,
VT_UI4 = 19,
VT_I8 = 20,
VT_UI8 = 21,
VT_INT = 22,
VT_UINT = 23,
VT_VOID = 24,
VT_HRESULT = 25,
VT_PTR = 26,
VT_SAFEARRAY = 27,
VT_CARRAY = 28,
VT_USERDEFINED = 29,
VT_LPSTR = 30,
VT_LPWSTR = 31,
VT_RECORD = 36,
VT_INT_PTR = 37,
VT_UINT_PTR = 38,
VT_FILETIME = 64,
VT_BLOB = 65,
VT_STREAM = 66,
VT_STORAGE = 67,
VT_STREAMED_OBJECT = 68,
VT_STORED_OBJECT = 69,
VT_BLOB_OBJECT = 70,
VT_CF = 71,
VT_CLSID = 72,
VT_VERSIONED_STREAM = 73,
VT_BSTR_BLOB = 0xfff,
VT_VECTOR = 0x1000,
VT_ARRAY = 0x2000,
VT_BYREF = 0x4000,
VT_RESERVED = 0x8000,
VT_ILLEGAL = 0xffff,
VT_ILLEGALMASKED = 0xfff,
VT_TYPEMASK = 0xfff
} ;
----
***VARIANT型の解放について
内部で解放が必要な型が使われている場合(SAFEARRAYやBSTRなど)、
>VariantClear()
を使って解放を行う。
VariantClear()は使われている型に従って、内部でメモリの解放を
してくれる。
SAFEARRAY配列のなかで解放が必要な型などを使っている場合も、
きちんと追って解放してくれるらしい。
----
***VARIANT型のコピー
>VariantCopy(*dst,*src)
を使ってコピーすることが可能だが、&b(){VariantInit()}を使って
きちんと初期化しないと値が不定になるので注意。
&color(red){vtメンバがコピーされないっぽい。}
----
***型変換
>VariantChangeType(*dst,*src,flg,type)
を使うことで型変換をすることが可能。
もちろん&b(){*dst=*src}とすることもできる。
一番使うのではないかと思われるのが &b(){VT_DATE ⇒ VT_BSTR}ではないだろうか。
VT_DATEがdouble型な上、一体どういう値なのか良く分からない(調べていない)ので
この関数で型変換してしまったほうがいいだろう。
ちなみにVT_DATEのときの値はtime_tとは異なるのは確か。