Win32 API 日本語リファレンス
ホームSystem.Com.StructuredStorage › PROPVARIANT

PROPVARIANT

構造体
サイズx64: 32 バイト / x86: 24 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
Anonymous_Anonymous_e__Union32/24+0+0型タグ(vt)と値を内包する共用体。多数のデータ型を切り替えて保持できる中核フィールド。

共用体: _Anonymous_e__Union x64 32B / x86 24B

フィールドサイズx64x86説明
Anonymous_Anonymous_e__Struct8/4+0+0型タグ(vt)と値を内包する共用体。多数のデータ型を切り替えて保持できる中核フィールド。
decValDECIMAL32/24+0+0

- bVal

VT_UI1

- blob

VT_BLOB, VT_BLOBOBJECT

- boolVal

VT_BOOL

- bstrVal

VT_BSTR

- bstrblobVal

VT_BSTR_BLOB

- cVal

VT_I1, Version 1

- cabool

VT_VECTOR | VT_BOOL

- cabstr

VT_VECTOR | VT_BSTR

- cabstrblob

VT_VECTOR | VT_BSTR_BLOB

- cac

VT_VECTOR | VT_I1, Version 1

- caclipdata

VT_VECTOR | VT_CF

- cacy

VT_VECTOR | VT_CY

- cadate

VT_VECTOR | VT_DATE

- cadbl

VT_VECTOR | VT_R8

- cafiletime

VT_VECTOR | VT_FILETIME

- caflt

VT_VECTOR | VT_R4

- cah

VT_VECTOR | VT_I8

- cai

VT_VECTOR | VT_I2

- cal

VT_VECTOR | VT_I4

- calpstr

VT_VECTOR | VT_LPSTR

- calpwstr

VT_VECTOR | VT_LPWSTR

- capropvar

VT_VECTOR | VT_VARIANT

- cascode

VT_VECTOR | VT_ERROR

- caub

VT_VECTOR | VT_UI1

- cauh

VT_VECTOR | VT_UI8

- caui

VT_VECTOR | VT_UI2

- caul

VT_VECTOR | VT_UI4

- cauuid

VT_VECTOR | VT_CLSID

- cyVal

VT_CY

- date

VT_DATE

- dblVal

VT_R8

- filetime

VT_FILETIME

- fltVal

VT_R4

- hVal

VT_I8

- iVal

VT_I2

- intVal

VT_INT, Version 1

- lVal

VT_I4

- pStorage

VT_STORAGE, VT_STORED_OBJECT

- pStream

VT_STREAM, VT_STREAMED_OBJECT

- pVersionedStream

VT_VERSIONED_STREAM

- parray

VT_ARRAY | VT_*, Version 1

- pbVal

VT_BYREF | VT_UI1, Version 1

- pboolVal

VT_BYREF | VT_BOOL, Version 1

- pbstrVal

VT_BYREF | VT_BSTR, Version 1

- pcVal

VT_BYREF | VT_I1, Version 1

- pclipdata

VT_CF

- pcyVal

VT_BYREF | VT_CY, Version 1

- pdate

VT_BYREF | VT_DATE, Version 1

- pdblVal

VT_BYREF | VT_R8, Version 1

- pdecVal

VT_BYREF | VT_DECIMAL, Version 1

- pdispVal

VT_DISPATCH

- pfltVal

VT_BYREF | VT_R4, Version 1

- piVal

VT_BYREF | VT_I2, Version 1

- pintVal

VT_BYREF | VT_INT, Version 1

- plVal

VT_BYREF | VT_I4, Version 1

- pparray

VT_BYREF | VT_ARRAY, Version 1

- ppdispVal

VT_BYREF | VT_DISPATCH, Version 1

- ppunkVal

VT_BYREF | VT_UNKNOWN, Version 1

- pscode

VT_BYREF | VT_ERROR, Version 1

- pszVal

VT_LPSTR

- puiVal

VT_BYREF | VT_UI2, Version 1

- puintVal

VT_BYREF | VT_UINT, Version 1

- pulVal

VT_BYREF | VT_UI4, Version 1

- punkVal

VT_UNKNOWN

- puuid

VT_CLSID

- pvarVal

VT_BYREF | VT_VARIANT, Version 1

- pwszVal

VT_LPWSTR

- scode

VT_ERROR

- uhVal

VT_UI8

- uiVal

VT_UI2

- uintVal

VT_UINT, Version 1

- ulVal

VT_UI4

- vt

値の型タグです。

- wReserved1

将来の使用のために予約されています。

- wReserved2

将来の使用のために予約されています。

- wReserved3

将来の使用のために予約されています。

公式ドキュメント

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

PROPVARIANT 構造体は、IPropertyStoreGetValue メソッドおよび SetValue メソッドでも使用されます。IPropertyStore は、Windows Vista において項目のプロパティをプログラムから扱う主要な手段として IPropertySetStorage を置き換えるものです。詳細については、プロパティ ハンドラーを参照してください。

メンバーは 5 つあります。最初のメンバーである値の型タグと、最後のメンバーであるプロパティの値が意味を持ちます。中間の 3 つのメンバーは将来の使用のために予約されています。

注意 この構造体の以前の定義における bool メンバーは、一部のコンパイラーが bool をキーワードとして認識するようになったため、boolVal に名前が変更されました。
注意 以下に定義する PROPVARIANT 構造体には、バージョン 1 のプロパティ セット シリアル化形式でシリアル化できる型が含まれます。バージョン 1 の形式は、バージョン 0 の形式で許可されるすべての型に加えて、いくつかの追加の型をサポートします。追加された型には、以下のコメント欄に "Version 1" と記載されています。これらの型は、バージョン 1 のプロパティ セットを意図する場合にのみ使用してください。詳細については、 プロパティ セットのシリアル化を参照してください。
PROPVARIANT 構造体は次のように定義されます。

解説(Remarks)

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

    DECIMAL       decVal;        //VT_DECIMAL

ただし、DECIMAL 構造体の値には特別な扱いが必要です。DECIMAL 構造体は PROPVARIANT 構造体全体と同じサイズであり、他のすべての型の値を保持する共用体には収まりません。そのため、DECIMAL 構造体の値は、予約済みのフィールドと vt メンバーを含む PROPVARIANT 構造体全体を占有します。ただし、DECIMAL 構造体の最初のメンバーは使用されず、そのサイズは PROPVARIANT 構造体の vt メンバーと同じです。したがって、Win32 の Propidl.h ヘッダー ファイルにおける PROPVARIANT 構造体の宣言では、decVal メンバーが PROPVARIANT 構造体の先頭に対応するように定義されています。このため、DECIMAL 構造体の値を PROPVARIANT 構造体に格納するには、他の値と同様に、値を decVal メンバーに読み込み、vt メンバーに VT_DECIMAL を設定します。

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

データ型 PROPVARIANT は、OLE2 のオートメーションの一部として定義されているデータ型 VARIANT と関連があります。次に示すように、いくつかの定義はオートメーションから再利用されています。

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 に固有の型の中には、他のデータ型の要素数付き配列 (counted array) を定義するデータ型がいくつかあります。要素数付き配列のデータ型はすべて CA という文字で始まり (たとえば CAUB)、vt の値は OR 演算子で組み合わせたもの (要素の VarType と VT_VECTOR とのビット単位のOR) になります。要素数付き配列の構造体は次の形式になります (name は、その要素数付き配列の固有の名前です)。

#define TYPEDEF_CA(type, name) 
 
    typedef struct tag ## name {\
        ULONG cElems;\
        type *pElems;\
        } name
PROPVARIANT の型 コード PROPVARIANT のメンバー 値の表現
VT_EMPTY 0 なし VT_EMPTY の型インジケーターを持つプロパティには、データが関連付けられていません。つまり、値のサイズは 0 です。
VT_NULL 1 なし NULL へのポインターのようなものです。
VT_I1 16 cVal 1 バイトの符号付き整数です。
VT_UI1 17 bVal 1 バイトの符号なし整数です。
VT_I2 2 iVal 2 バイトの符号付き整数値を表す 2 バイトです。
VT_UI2 18 uiVal 2 バイトの符号なし整数です。
VT_I4 3 lVal 4 バイトの符号付き整数値です。
VT_UI4 19 ulVal 4 バイトの符号なし整数です。
VT_INT 22 intVal 4 バイトの符号付き整数値です (VT_I4 と同等)。
VT_UINT 23 uintVal 4 バイトの符号なし整数です (VT_UI4 と同等)。
VT_I8 20 hVal 8 バイトの符号付き整数です。
VT_UI8 21 uhVal 8 バイトの符号なし整数です。
VT_R4 4 fltVal 32 ビットの IEEE 浮動小数点値です。
VT_R8 5 dblVal 64 ビットの IEEE 浮動小数点値です。
VT_BOOL 11 boolVal (以前の設計では bool) ブール値です。0 (FALSE) または -1 (TRUE) を格納する WORD です。
VT_ERROR 10 scode ステータス コードを格納する DWORD です。
VT_CY 6 cyVal 8 バイトの 2 の補数整数です (10,000 倍にスケーリングされます)。この型は一般に通貨の金額に使用されます。
VT_DATE 7 date 1899 年 12 月 31 日からの日数 (秒数ではありません) を表す 64 ビットの浮動小数点数です。たとえば、1900 年 1 月 1 日は 2.0、1900 年 1 月 2 日は 3.0 のようになります。これは VT_R8 と同じ表現で格納されます。
VT_FILETIME 64 filetime Win32 で定義されている 64 ビットの FILETIME 構造体です。すべての時刻は協定世界時 (UTC) で格納することをお勧めします。
VT_CLSID 72 puuid クラス識別子 (CLSID)、またはその他のグローバル一意識別子 (GUID) へのポインターです。
VT_CF 71 pclipdata 前述の CLIPDATA 構造体へのポインターです。
VT_BSTR 8 bstrVal null で終わる Unicode 文字列へのポインターです。文字列の直前にはバイト数を表す DWORD がありますが、bstrVal はこの DWORD の先にある文字列の最初の文字を指します。BSTR は、オートメーションの SysAllocString 呼び出しと SysFreeString 呼び出しを使用して割り当ておよび解放する必要があります。
VT_BSTR_BLOB 0xfff bstrblobVal システム専用です。
VT_BLOB 65 blob バイト数を示す DWORD と、それに続くその数のバイト単位のデータです。このバイト数には、カウント自体の長さである 4 バイトは含まれません。空の blob メンバーの場合、カウントは 0 で、その後にバイトは続きません。これは VT_BSTR の値と似ていますが、データの末尾に null バイトがあることは保証されません。
VT_BLOBOBJECT 70 blob VT_STREAMED_OBJECT に現れるものと同じ表現でシリアル化されたオブジェクトを格納する blob メンバーです。つまり、DWORD のバイト数 (このバイト数には自身のサイズは含まれません) に続いて、クラス識別子とそのクラスの初期化データが並ぶ形式です。

VT_BLOB_OBJECTVT_STREAMED_OBJECT の唯一の重要な違いは、前者には後者が持つシステム レベルのストレージのオーバーヘッドがないことです。そのため、多数の小さなオブジェクトを扱うシナリオにより適しています。

VT_LPSTR 30 pszVal システム既定のコード ページによる、null で終わる ANSI 文字列へのポインターです。
VT_LPWSTR 31 pwszVal ユーザー既定のロケールによる、null で終わる Unicode 文字列へのポインターです。
VT_UNKNOWN 13 punkVal 新規。
VT_DISPATCH 9 pdispVal 新規。
VT_STREAM 66 pStream "Contents" ストリームと同じ階層にあるストリームを表す IStream インターフェイスへのポインターです。
VT_STREAMED_OBJECT 68 pStream VT_STREAM と同様ですが、ストリームにシリアル化されたオブジェクト (CLSID とそれに続くクラスの初期化データ) が格納されていることを示します。このストリームは、プロパティ セットを格納する "Contents" ストリームと同じ階層にあります。
VT_STORAGE 67 pStorage "Contents" ストリームと同じ階層にあるストレージ オブジェクトを表す IStorage インターフェイスへのポインターです。
VT_STORED_OBJECT 69 pStorage VT_STORAGE と同様ですが、指定された IStorage に読み込み可能なオブジェクトが格納されていることを示します。
VT_VERSIONED_STREAM 73 pVersionedStream GUID のバージョンを持つストリームです。
VT_DECIMAL 14 decVal DECIMAL 構造体です。
VT_VECTOR 0x1000 ca* 型インジケーターが OR 演算子によって VT_VECTOR と組み合わされている場合、値は要素数付き配列の値のいずれかになります。この場合、要素数を示す 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_VECTORVT_BSTR_BLOBOR 演算で組み合わせることもできますが、これはシステム専用です。

VT_ARRAY 0x2000 Parray 型インジケーターが OR 演算子によって VT_ARRAY と組み合わされている場合、値は 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_VECTOROR で組み合わせることはできません。
VT_BYREF 0x4000 p* 型インジケーターが OR 演算子によって VT_BYREF と組み合わされている場合、値は参照になります。参照型は、C++ の参照型 (たとえば "int&") と同様に、データへの参照として解釈されます。

VT_BYREF は次の型と OR を使用できます。VT_I1VT_UI1VT_I2VT_UI2VT_I4VT_UI4VT_INTVT_UINTVT_R4VT_R8VT_BOOLVT_DECIMALVT_ERRORVT_CYVT_DATEVT_BSTRVT_UNKNOWNVT_DISPATCHVT_ARRAYVT_VARIANT

VT_VARIANT 12 capropvar DWORD の型インジケーターと、それに続く対応する値です。VT_VARIANTVT_VECTOR または VT_BYREF とのみ組み合わせて使用できます。
VT_TYPEMASK 0xFFF VT_VECTOR やその他の修飾子から生の VT 値を取り出すためのマスクとして使用されます。

VT_CF タグと共に格納されるクリップボード形式の識別子は、5 種類の表現のいずれかを使用します。どの表現であるかは CLIPDATA 構造体の ulClipFmt メンバーで示され、値は特定のデータ型を指す pClipData ポインターによって参照されます。

ulClipFmt の値 pClipData の値
-1L 組み込みの Windows クリップボード形式の値を格納する DWORD です。
-2L Macintosh のクリップボード形式の値を格納する DWORD です。
-3L 形式識別子 (FMTID) を格納する GUID です。これはほとんど使用されません。
任意の正の値 Windows のクリップボード形式名を格納する、null で終わる文字列です。この名前は RegisterClipboardFormat 関数に渡すのに適しています。この関数は新しいクリップボード形式を登録します。指定した名前の形式が既に登録されている場合、新しい形式は登録されず、戻り値は既存の形式を示します。これにより、複数のアプリケーションが同じ登録済みクリップボード形式を使用してデータのコピーと貼り付けを行えます。形式名の比較では大文字と小文字は区別されず、0xC000 から 0xFFFF の範囲の値で識別されます。文字列内の文字に使用されるコード ページは、コード ページ インジケーターに従います。ここでの「正の値」は、末尾の null バイトを含む文字列の長さです。登録済みクリップボード形式をクリップボードに配置する場合、またはクリップボードから取得する場合は、オブジェクトへのハンドルを提供する HGLOBAL データ型の値の形式でなければなりません。
0L データなしです (ほとんど使用されません)。

ulClipFmt メンバーの値が -1 の場合、データは組み込みの Windows 形式です。この場合、pClipData が指すバッファーの最初の DWORD は、クリップボード形式の識別子 (たとえば CF_METAFILEPICT) です。CF_METAFILEPCT の場合、その後に続くのは METAFILEPICT 構造体の変形です (DWORD ではなく WORD データ型を使用します)。つまり、このデータは次の形式になります。

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

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

登録済みクリップボード形式をクリップボードに配置する場合、またはクリップボードから取得する場合は、HGLOBAL 値の形式でなければなりません。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// PROPVARIANT  (x64 32 / x86 24 バイト)
typedef struct PROPVARIANT {
    _Anonymous_e__Union Anonymous;
} PROPVARIANT;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct PROPVARIANT
{
    public _Anonymous_e__Union Anonymous;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure PROPVARIANT
    Public Anonymous As _Anonymous_e__Union
End Structure
import ctypes
from ctypes import wintypes

class PROPVARIANT(ctypes.Structure):
    _fields_ = [
        ("Anonymous", _Anonymous_e__Union),
    ]
#[repr(C)]
pub struct PROPVARIANT {
    pub Anonymous: _Anonymous_e__Union,
}
import "golang.org/x/sys/windows"

type PROPVARIANT struct {
	Anonymous _Anonymous_e__Union
}
type
  PROPVARIANT = record
    Anonymous: _Anonymous_e__Union;
  end;
const PROPVARIANT = extern struct {
    Anonymous: _Anonymous_e__Union,
};
type
  PROPVARIANT {.bycopy.} = object
    Anonymous: _Anonymous_e__Union
struct PROPVARIANT
{
    _Anonymous_e__Union Anonymous;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; PROPVARIANT サイズ: 24 バイト(x86)
dim st, 6    ; 4byte整数×6(構造体サイズ 24 / 4 切り上げ)
; Anonymous : _Anonymous_e__Union (+0, 24byte)  varptr(st)+0 を基点に操作(24byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; PROPVARIANT サイズ: 32 バイト(x64)
dim st, 8    ; 4byte整数×8(構造体サイズ 32 / 4 切り上げ)
; Anonymous : _Anonymous_e__Union (+0, 32byte)  varptr(st)+0 を基点に操作(32byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global PROPVARIANT
    #field byte Anonymous 32
#endstruct

stdim st, PROPVARIANT        ; NSTRUCT 変数を確保
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。