PROPVARIANT

概要

PROPVARIANT 構造体は、IPropertyStorageReadMultiple()WriteMultiple() メソッドで、プロパティセットのタグ型とプロパティの値を定義するために使用されます。

また、PROPVARIANT 構造体は、IPropertyStoreGetValue()SetValue() メソッドによって使用されます。 これは、Windows Vista では、プログラムアイテムプロパティの IPropertySetStorage を置き換える主な方法として使用されます。 詳細については、Property Handlers を参照して下さい。

5 つのメンバがあります。 1 つ目のメンバが値型のタグ、最後のメンバがプロパティの値で、これらのメンバは重要です。 中央の3つのメンバは、将来の拡張のために予約されています。

注意: この構造体が以前 bool メンバと定義していた値は、一部のコンパイラで キーワードとして現在でも bool を認識するため、boolVal に変更されていまず。

注意: PROPVARIANT 構造体は、version 1 property set serialization format のシリアライズが可能な型が含まれていると定義されます。 version 1 format は、version 0 format で許可されたすべての型をサポートし、いくつかの追加の型を追加したものです。 追加の型は、コメントフィールド以下の "Version 1" に含まれています。 version 1 property set が対象の場合のみ、これらの型を使用します。 詳細については、Property Set Serialization を参照してください。

PROPVARIANT 構造体は、以下内容を定義しています。

C++


typedef struct PROPVARIANT
{
  VARTYPE vt;
  WORD    wReserved1;
  WORD    wReserved2;
  WORD    wReserved3;
	
  union {
    CHAR              cVal;
    UCHAR             bVal;
    SHORT             iVal;
    USHORT            uiVal;
    LONG              lVal;
    ULONG             ulVal;
    INT               intVal;
    UINT              uintVal;
    LARGE_INTEGER     hVal;
    ULARGE_INTEGER    uhVal;
    FLOAT             fltVal;
    DOUBLE            dblVal;
    VARIANT_BOOL      boolVal;
    SCODE             scode;
    CY                cyVal;
    DATE              date;
    FILETIME          filetime;
    CLSID*            puuid;
    CLIPDATA*         pclipdata;
    BSTR              bstrVal;
    BSTRBLOB          bstrblobVal;
    BLOB              blob;
    LPSTR             pszVal;
    LPWSTR            pwszVal;
    IUnknown*         punkVal;
    IDispatch*        pdispVal;
    IStream*          pStream;
    IStorage*         pStorage;
    LPVERSIONEDSTREAM pVersionedStream;
    LPSAFEARRAY       parray;
    CAC               cac;
    CAUB              caub;
    CAI               cai;
    CAUI              caui;
    CAL               cal;
    CAUL              caul;
    CAH               cah;
    CAUH              cauh;
    CAFLT             caflt;
    CADBL             cadbl;
    CABOOL            cabool;
    CASCODE           cascode;
    CACY              cacy;
    CADATE            cadate;
    CAFILETIME        cafiletime;
    CACLSID           cauuid;
    CACLIPDATA        caclipdata;
    CABSTR            cabstr;
    CABSTRBLOB        cabstrblob;
    CALPSTR           calpstr;
    CALPWSTR          calpwstr;
    CAPROPVARIANT     capropvar;
    CHAR*             pcVal;
    UCHAR*            pbVal;
    SHORT*            piVal;
    USHORT*           puiVal;
    LONG*             plVal;
    ULONG*            pulVal;
    INT*              pintVal;
    UINT*             puintVal;
    FLOAT*            pfltVal;
    DOUBLE*           pdblVal;
    VARIANT_BOOL*     pboolVal;
    DECIMAL*          pdecVal;
    SCODE*            pscode;
    CY*               pcyVal;
    DATE*             pdate;
    BSTR*             pbstrVal;
    IUnknown**        ppunkVal;
    IDispatch**       ppdispVal;
    LPSAFEARRAY*      pparray;
    PROPVARIANT*      pvarVal;
  };
} PROPVARIANT;

C#


[StructLayout( LayoutKind.Sequential )]
public struct PropVariant
{
  // LayoutKind.Explicit を使用する事もできますが、
  // 64bit アーキテクチャ上で IntPtr を 8バイトとして扱いたいため、CLR にアラインを任せます。
  // これは、厳密に VarEnum 値ですが、VarEnum は 4バイトを要求します。
  // ここでは、期待されるとおり 2バイトを使用します。	
  private ushort valueType;

  // パディング用のダミーフィールド。
  private ushort wReserved1;
  private ushort wReserved2;
  private ushort wReserved3;

  // x64 アーキテクチャとの互換のため、IntPtr 拡張の使用を必要とします。
  // しかしながら、BLOB 構造体は IntPtr に続く 4バイト整数を使用します。
  // そのため、valueData フィールドがほとんどのポインタ値を受け取り、
  // BLOB のポインタを取得するために追加の 4バイト整数を必要とします。
  // valueDataExt フィールドは、32ビットアーキテクチャで 8バイト値の最後の 4バイトを提供します。	
  private IntPtr valueData;
  private Int32  valueDataExt;
}
[SuppressUnmanagedCodeSecurity( )]
public static class NativeMethods
{
  public const string DllName = "propsys.dll";

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern int PSGetNameFromPropertyKey(
                                        ref  PropertyKey propkey,
    [MarshalAs( UnmanagedType.LPWStr )] out  string      ppszCanonicalName );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern int PSGetPropertyDescription(
                                           ref PropertyKey          propkey,
                                           ref Guid                 riid,
    [MarshalAs( UnmanagedType.Interface )] out IPropertyDescription ppv );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern int PSGetPropertyKeyFromName(
    [In, MarshalAs( UnmanagedType.LPWStr )]     string      pszCanonicalName,
                                            out PropertyKey propkey );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern int PSGetPropertyDescriptionListFromString(
    [In, MarshalAs( UnmanagedType.LPWStr )]      string                   pszPropList,
    [In]                                    ref  Guid                     riid,
                                            out  IPropertyDescriptionList ppv );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void InitPropVariantFromBooleanVector(
    [In, Out] bool[] prgf, uint cElems, out PropVariant ppropvar );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void InitPropVariantFromInt16Vector(
    [In, Out] Int16[] prgn, uint cElems, out PropVariant ppropvar );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void InitPropVariantFromUInt16Vector(
    [In, Out] UInt16[] prgn, uint cElems, out PropVariant ppropvar );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void InitPropVariantFromInt32Vector(
    [In, Out] Int32[] prgn, uint cElems, out PropVariant ppropvar );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void InitPropVariantFromUInt32Vector(
    [In, Out] UInt32[] prgn, uint cElems, out PropVariant ppropvar );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void InitPropVariantFromInt64Vector(
    [In, Out] Int64[] prgn, uint cElems, out PropVariant ppropvar );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void InitPropVariantFromUInt64Vector(
    [In, Out] UInt64[] prgn, uint cElems, out PropVariant ppropvar );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void InitPropVariantFromDoubleVector(
    [In, Out] double[] prgn, uint cElems, out PropVariant ppropvar );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void InitPropVariantFromFileTimeVector(
    [In, Out] System.Runtime.InteropServices.ComMediaTypes.FILETIME[] prgft,
    uint cElems, out PropVariant ppropvar );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void InitPropVariantFromStringVector(
    [In, Out] string[] prgsz, uint cElems, out PropVariant ppropvar );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern int InitPropVariantFromPropVariantVectorElem(
    [In] ref PropVariant propvarIn, uint iElem,   out PropVariant ppropvar );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern uint InitPropVariantFromFileTime( [In]
    ref System.Runtime.InteropServices.ComMediaTypes.FILETIME pftIn, out PropVariant ppropvar );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  [return: MarshalAs( UnmanagedType.I4 )]
  internal static extern int PropVariantGetElementCount( [In] ref PropVariant propVar );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void PropVariantGetBooleanElem(
    [In] ref PropVariant propVar, [In]uint iElem, [  MarshalAs( UnmanagedType.Bool )] out bool pfVal );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void PropVariantGetInt16Elem(
    [In] ref PropVariant propVar, [In] uint iElem,   out short pnVal );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void PropVariantGetUInt16Elem(
    [In] ref PropVariant propVar, [In] uint iElem,   out ushort pnVal );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void PropVariantGetInt32Elem(
    [In] ref PropVariant propVar, [In] uint iElem,   out int pnVal );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void PropVariantGetUInt32Elem(
    [In] ref PropVariant propVar, [In] uint iElem,   out uint pnVal );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void PropVariantGetInt64Elem(
    [In] ref PropVariant propVar, [In] uint iElem,   out Int64 pnVal );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void PropVariantGetUInt64Elem(
    [In] ref PropVariant propVar, [In] uint iElem,   out UInt64 pnVal );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void PropVariantGetDoubleElem(
    [In] ref PropVariant propVar, [In] uint iElem,   out double pnVal );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void PropVariantGetFileTimeElem(
    [In] ref PropVariant propVar, [In] uint iElem,
    [ MarshalAs( UnmanagedType.Struct )] out System.Runtime.InteropServices.ComMediaTypes.FILETIME pftVal );

  [DllImport( DllName, CharSet = CharSet.Unicode, SetLastError = true )]
  internal static extern void PropVariantGetStringElem(
    [In] ref PropVariant propVar, [In]  uint iElem,
    [ MarshalAs( UnmanagedType.LPWStr )] out string ppszVal );
}

メンバ

vt

値型のタグ。

wReserved1

将来の拡張のために予約。

wReserved2

将来の拡張のために予約。

wReserved3

将来の拡張のために予約。

cVal

VT_I1, Version 1

bVal

VT_UI1

iVal

VT_I2

uiVal

VT_UI2

lVal

VT_I4

ulVal

VT_UI4

intVal

VT_INT, Version 1

uintVal

VT_UINT, Version 1

hVal

VT_I8

uhVal

VT_UI8

fltVal

VT_R4

dblVal

VT_R8

boolVal

VT_BOOL

scode

VT_ERROR

cyVal

VT_CY

date

VT_DATE

filetime

VT_FILETIME

puuid

VT_CLSID

pclipdata

VT_CF

bstrVal

VT_BSTR

bstrblobVal

VT_BSTR_BLOB

blob

VT_BLOB, VT_BLOBOBJECT

pszVal

VT_LPSTR

pwszVal

VT_LPWSTR

punkVal

VT_UNKNOWN

pdispVal

VT_DISPATCH

pStream

VT_STREAM, VT_STREAMED_OBJECT

pStorage

VT_STORAGE, VT_STORED_OBJECT

pVersionedStream

VT_VERSIONED_STREAM

parray

VT_ARRAY | VT_*, Version 1

cac

VT_VECTOR | VT_I1, Version 1

caub

VT_VECTOR | VT_UI1

cai

VT_VECTOR | VT_I2

caui

VT_VECTOR | VT_UI2

cal

VT_VECTOR | VT_I4

caul

VT_VECTOR | VT_UI4

cah

VT_VECTOR | VT_I8

cauh

VT_VECTOR | VT_UI8

caflt

VT_VECTOR | VT_R4

cadbl

VT_VECTOR | VT_R8

cabool

VT_VECTOR | VT_BOOL

cascode

VT_VECTOR | VT_ERROR

cacy

VT_VECTOR | VT_CY

cadate

VT_VECTOR | VT_DATE

cafiletime

VT_VECTOR | VT_FILETIME

cauuid

VT_VECTOR | VT_CLSID

caclipdata

VT_VECTOR | VT_CF

cabstr

VT_VECTOR | VT_BSTR

cabstrblob

VT_VECTOR | VT_BSTR_BLOB

calpstr

VT_VECTOR | VT_LPSTR

capropvar

VT_VECTOR | VT_VARIANT

pcVal

VT_BYREF | VT_I1, Version 1

pbVal

VT_BYREF | VT_UI1, Version 1

piVal

VT_BYREF | VT_I2, Version 1

puiVal

VT_BYREF | VT_UI2, Version 1

plVal

VT_BYREF | VT_I4, Version 1

pulVal

VT_BYREF | VT_UI4, Version 1

pintVal

VT_BYREF | VT_INT, Version 1

puintVal

VT_BYREF | VT_UINT, Version 1

pfltVal

VT_BYREF | VT_R4, Version 1

pdblVal

VT_BYREF | VT_R8, Version 1

pboolVal

VT_BYREF | VT_R4, Version 1

pdecVal

VT_BYREF | VT_DECIMAL, Version 1

pscode

VT_BYREF | VT_ERROR, Version 1

pcyVal

VT_BYREF | VT_CY, Version 1

pdate

VT_BYREF | VT_DATE, Version 1

pbstrVal

VT_BYREF | VT_BSTR, Version 1

ppunkVal

VT_BYREF | VT_UNKNOWN, Version 1

ppdispVal

VT_BYREF | VT_DISPATCH, Version 1

pparray

VT_BYREF | VT_ARRAY, Version 1

pvarVal

VT_BYREF | VT_VARIANT, Version 1

詳細

PROPVARIANT 構造体は、VT_DECIMAL の値を保持することもできます。

DECIMAL       decVal;        //VT_DECIMAL

ですが、DECIMAL 構造体の値は、特別なハンドリングが必要となります。 DECIMAL 構造体は、PROPVARIANT 構造体の全体と同じサイズで、他のすべての型の値が保持しているユニオン内に収まりません。 さらに、DECIMAL 構造体は、予約済みフィールドと vt メンバを含む PROPVARIANT 構造を占有しています。 しかし、DECIMAL 構造体の初めのメンバは使用されず、PROPVARIANT 構造体の vt メンバのサイズと同じになります。 したがって、Win32 の Propidl.h ヘッダファイルでの PROPVARIANT 構造体の宣言は、PROPVARIANT構造体の先頭で宣言することで、 decVal メンバと定義されます。 したがって、PROPVARIANT 構造体の中に DECIMAL 構造体の値を置くことは、decVal メンバの中にこの値を読み込み、vt メンバは、他の値のように VT_DECIMAL に設定されます。

PROPVARIANT は、IPropertyStorage インタフェースを通してプロパティ値の読み取りと書き込みするのための基本的なデータ型です。

PROPVARIANT データ型は、VARIANT データ型に繋がっており、OLE2 のオートメーションの一部として定義されています。 いくつかの定義は以下の様に、オートメーションによって再利用されます。


typedef struct  tagCY {
    unsigned long      Lo;
    long               Hi;
} CY;
 
typedef struct  tagDEC {
    USHORT             wReserved;
    BYTE               scale;
    BYTE               sign;
    ULONG              Hi32;
    ULONGLONG          Lo64;
} DECIMAL;
 
typedef struct  tagSAFEARRAYBOUND {
    ULONG              cElements;
    LONG               lLbound;
} SAFEARRAYBOUND;
 
typedef struct  tagSAFEARRAY {
    USHORT             cDims;
    USHORT             fFeatures;
    ULONG              cbElements;
    ULONG              cLocks;
    PVOID              pvData;
    SAFEARRAYBOUND     rgsabound [ * ];
} SAFEARRAY;
 
typedef CY             CURRENCY;
typedef short          VARIANT_BOOL;
typedef unsigned short VARTYPE;
typedef double         DATE;
typedef OLECHAR*       BSTR;

いくつかの型が PROPVARIANT 構造体のユニオンとして、追加されます。


typedef struct  tagCLIPDATA {
    // cbSize is the size of the buffer pointed to 
    // by pClipData, plus sizeof(ulClipFmt)
    ULONG              cbSize;
    long               ulClipFmt;
    BYTE*              pClipData;
} CLIPDATA;				

ユニークな PROPVARIANT 型の間は、他のデータ型の可変長配列として定義されたいくつかのデータ型です。 このすべての可変長配列のデータ型は、CA という文字で始まり(例: CAUB) 、OR 演算子の vt 値 (要素と VT_VECTOR の OR 演算子の VarType) を持ちます。 可変長配列の構造体 (可変長配列で指定された名前) は、次の形式があります。


#define TYPEDEF_CA(type, name) 
    typedef struct tag ## name {\
        ULONG cElems;\
        type *pElems;\
    } name
	

VT_EMPTY
None // 0
プロパティが、VT_EMPTY に何のデータにも関連付けられていないことを意味する型です。 このため、この値のサイズは 0 です。
VT_NULL
None // 1
これは、ポインタが null であることと同じです。
VT_I1
cVal // 16
1 byte 符号付き整数。
VT_UI1
bVal // 17
1 byte 符号なし整数。
VT_I2
iVal // 2
2 byte 符号付き整数値を表す 2 バイト。
VT_UI2
uiVal // 18
2 byte 符号なし整数。
VT_I4
lVal // 3
4 byte 符号付き整数。
VT_UI4
ulVal	// 19
4 byte 符号なし整数。
VT_INT
intVal // 22
4 byte 符号付き整数値 ( VT_I4 と同等 )。
VT_UINT
uintVal // 23
4 byte 符号なし整数 ( VT_UI4 と同等 )。
VT_I8
hVal // 20
8 byte 符号付き整数。
VT_UI8
uhVal // 21
8 byte 符号なし整数。
VT_R4
fltVal // 4
32 bit IEEE 浮動小数ポインタ値。
VT_R8
dblVal // 5
64 bit IEEE 浮動小数ポインタ値。
VT_BOOL
boolVal (bool in earlier designs) // 11
Boolean 値。0 ( FALSE) または -1 ( TRUE ) の WORD です。
VT_ERROR
scode // 10
ステータスコードを含む DWORD
VT_CY
cyVal // 6
8 byte の 2 の補数整数 ( スケールは 10,000 )。 ※2 の補数整数 = 2進数 この型は、一般的に貨幣流通高に使用されます。
VT_DATE
date // 7
64 bit 浮動小数で、1899年12月31日からの日付を表します。(秒は換算しません) 例えば、1900年1月1日は、2.0、1900年1月2日は、3.0 という風になります。 VT_R8 と同じ表現で保存されます。
VT_FILETIME
filetime // 64
Win32 で定義されている 64 bit FILETIME 構造体。 すべての時刻は、世界協定時( UTC ) で保存することを推奨します。
VT_CLSID
puuid // 72
クラス識別子 ( CLSID ) (または、他のグローバルユニーク識別子 ( GUID ) ) へのポインタ。
VT_CF
pclipdata // 71
CLIPDATA 構造体へのポインタ。上記で説明されています。
VT_BSTR
bstrVal // 8
NULL 終端 Unicode 文字列へのポインタ。 この文字列には、バイト数を表す DWORD が前に付きますが、bstrVal は、この DWORD をパスして文字列の始めの文字を指します。 BSTR は、オートメーションの SysAllocStringSysFreeString 呼び出しを使用して配置され解放されなければなりません。
VT_BSTR_BLOB
bstrblobVal // 0xfff
システム使用のみ。
VT_BLOB
blob // 65
データのバイト数を表す DWORD 。 このバイト数は、バイトカウント自身の 4 バイト分の長さは含まれません。 空の blob メンバは、0 のカウントになり、0 バイトが確保されます。 これは、VT_BSTR の値と同じですが、データ末尾の null バイトは保障されていません。
VT_BLOBOBJECT
blob // 70
VT_STREAMED_OBJECT 出現するのと同じ表現でシリアル化されたオブジェクトの blob メンバ。 DWORD バイトカウントです。 ( バイトカウント自身のサイズは含みません。) これは、クラスの初期化データに続くクラス識別子の形式です。 VT_BLOB_OBJECTVT_STREAMED_OBJECT の唯一の大きな違いは、この型にはシステムレベルのストレージのオーバヘッドがないことと、それによって、小さなオブジェクトの数を含むシナリオに適していることです。
VT_LPSTR
pszVal // 30
システムデフォルトコードページの NULL 終端 ANSI 文字列へのポインタ。
VT_LPWSTR
pwszVal // 31
ユーザデフォルトロケールの NULL 終端 Unicode 文字列へのポインタ。
VT_UNKNOWN
punkVal // 13
新規。
VT_DISPATCH
pdispVal // 9
新規。
VT_STREAM
pStream // 66
IStream インタフェースへのポインタ。これは、"Contents" ストリームの兄弟ストリームを表します。
VT_STREAMED_OBJECT
pStream // 68
VT_STREAM の内容と同じですが、ストリームにはシリアライズされたオブジェクトが含まれており、このクラスのシリアル化されたデータが CLSID の後に続きます。 このストリームは、プロパティセットに含まれた "Contents" ストリームと兄弟です。
VT_STORAGE
pStorage // 67
"Contents" ストリームの兄弟となるストレージオブジェクトを表す IStorage へのポインタ。
VT_STORED_OBJECT
pStorage // 69
VT_STORAGE の内容と同じですが、の 読み込みオブジェクトが含まれた IStorage としてデザインされています。
VT_VERSIONED_STREAM
pVersionedStream // 73
GUID バージョンのストリーム。
VT_DECIMAL
decVal // 14
DECIMAL 構造体。
VT_VECTOR
ca* // 0x1000
このタイプインジケータは、VT_VECTOR を OR オペレータを使用して組み合わせたもので、この値は可変長配列の値の一つです。 これは、要素の DWORD 数を作成し、その後に値の繰り返しをポインタで指定します。 例えば、VT_LPSTR | VT_VECTOR というタイプインジケータは、DWORD 要素数を持ち、その後ろに LPSTR 要素の配列へのポインタが続きます。 VT_VECTOR は、OR オペレータで、以下のタイプを複合することができます。 VT_I1VT_UI1VT_I2VT_UI2VT_BOOLVT_I4VT_UI4VT_R4VT_R8VT_ERRORVT_I8VT_UI8VT_CYVT_DATEVT_FILETIMEVT_CLSIDVT_CFVT_BSTRVT_LPSTRVT_LPWSTRVT_VARIANTVT_VECTOR は、VT_BSTR_BLOB と OR オペレータを使用して複合することもできますが、これはシステム専用です。
VT_ARRAY
Parray // 0x2000
VT_ARRAY を OR オペレータを使用して複合した場合、この値は SAFEARRAY へのポインタとなります。 VT_ARRAY は、以下のタイプを OR で使用することができます。 VT_I1VT_UI1VT_I2VT_UI2VT_I4VT_UI4VT_INTVT_UINTVT_R4VT_R8VT_BOOLVT_DECIMALVT_ERRORVT_CYVT_DATEVT_BSTRVT_DISPATCHVT_UNKNOWNVT_VARIANTVT_ARRAYVT_VECTOR と共に OR で使用することができません。
VT_BYREF
p* // 0x4000
VT_BYREF を OR オペレータを使用して複合した場合、この値は参照となります。 参照型は、データへの参照と解釈され、C++ での参照型と同様になります。(例えば、 "int%amp;") VT_BYREF は、以下のタイプと OR で使用することができます。 VT_I1VT_UI1VT_I2VT_UI2VT_I4VT_UI4VT_INTVT_UINTVT_R4VT_R8VT_BOOLVT_DECIMALVT_ERRORVT_CYVT_DATEVT_BSTRVT_UNKNOWNVT_DISPATCHVT_ARRAYand VT_VARIANT
VT_VARIANT
capropvar // 12
DWORD 型とその後ろにそれに対応する値が続きます。 VT_VARIANT は、VT_VECTOR または VT_BYREF のみと共に使用することが可能です。
VT_TYPEMASK
// 0xFFF
VT_VECTOR とその他の修飾子から VT 値を抜き出すためのマスクとして使用します。

クリップボードフォーマット識別子。 VT_CF タグと共に格納します。 5つの表現のうちの一つを使用します。 特定のデータタイプへの pClipData ポインタを使用する CLIPDATA 構造体の ulClipFmt メンバを識別します。

ulClipFmt value
pClipData の値。
-1L
ビルトイン Windows クリップボードフォーマット値が含まれる DWORD
-2L
Macintosh クリップボードフォーマット値が含まれる DWORD
-3L
フォーマット識別子 (FMTID) が含まれる GUID 。 これは稀に使用されます。
any positive value
Windows クリップボードフォーマット名が含まれた NULL 終端文字列。RegisterClipboardForma 関数を渡すために適したものの1つです。 この関数は、新しいクリップボードフォーマットを登録します。 既に存在する名前のフォーマットを登録しようとした場合、新しいフォーマットは登録されず、既存のフォーマット識別子の値が返されます。 このことは、1 つ以上のアプリケーションがデータコピー&ペーストを行うために、同じクリップボードフォーマットを登録するために使用することができます。 フォーマット名の比較には大文字小文字を区別せず、0xC000 から 0xFFFF の範囲の値によって識別されます。 文字列のキャラクタが使用するコードページは、コードページインジケータで指定されているものとなります。 この"positive value (正の値) " (文字列の長さ)には、末尾の null が含まれます。 クリップボードフォーマットが、クリップボードに配置されているか、クリップボードから取得されるかした場合、これらは、オブジェクトのハンドルが提供された HGLOBAL データタイプ値の形式でなければなりません。
0L
データなし。(滅多に使用されません)

ulClipFmt メンバの値が -1 の場合、このデータは、ビルトイン Windows フォーマットの形式です。 この場合 pClipData で示されたバッファの、1つ目の DWORD は、クリップボードフォーマット識別子で、例えば CF_METAFILEPICT です。 CF_METAFILEPCT の場合、次に METAFILEPICT 構造体のバリエーション ( WORD データ型ではなく、WORD を使用します。) が続きます。 このデータは以下の形式となります。


struct PACKEDMETA
{
    WORD mm;
    WORD xExt;
    WORD yExt;
    WORD reserved;
};				
			

METAFILEPICT 構造体のあとは、メタファイルデータとなり、これは SetMetaFileBitsEx() 関数に渡されるのに最適なデータです。 この関数は、メモリベースで作成し、指定したデータを Windows フォーマットメタファイル形式にします。 この関数は、Windows の 16 ビットバージョン互換で提供されます。 Win32 ベースのアプリケーションでは、SetEnhMetaFileBits() 関数を使用してください。 この関数は、指定された拡張フォーマットメタファイルの内容を取得し、それらをバッファ内にコピーします。 関数が成功した場合で、バッファポインタが null だった場合、戻り値として拡張メタファイルのサイズがバイト単位で返されます。 関数が成功した場合で、バッファポインタが有効なポインタであった場合、戻り値として、バッファにコピーされたバイトサイズが返されます。 関数が失敗した場合、0 が返されます。

必要環境

クライアント Windows 2000 Professional [desktop apps | Windows Store apps]
サーバー Windows 2000 Server [desktop apps | Windows Store apps]
ヘッダ Propidl.h

参照

公式の情報は aa380072 を参照して下さい。