PROPVARIANT
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Anonymous | _Anonymous_e__Union | 32/24 | +0 | +0 | 型タグ(vt)と値を内包する共用体。多数のデータ型を切り替えて保持できる中核フィールド。 |
共用体: _Anonymous_e__Union x64 32B / x86 24B
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Anonymous | _Anonymous_e__Struct | 8/4 | +0 | +0 | 型タグ(vt)と値を内包する共用体。多数のデータ型を切り替えて保持できる中核フィールド。 |
| decVal | DECIMAL | 32/24 | +0 | +0 | - bVal- blobVT_BLOB, VT_BLOBOBJECT - boolVal- bstrVal- bstrblobVal- cValVT_I1, Version 1 - cabool- cabstr- cabstrblob- cac- caclipdata- cacy- cadate- cadbl- cafiletime- caflt- cah- cai- cal- calpstr- calpwstr- capropvar- cascode- caub- cauh- caui- caul- cauuid- cyVal- date- dblVal- filetime- fltVal- hVal- iVal- intValVT_INT, Version 1 - lVal- pStorage- pStream- pVersionedStream- parrayVT_ARRAY | VT_*, Version 1 - pbVal- pboolVal- pbstrVal- pcVal- pclipdata- pcyVal- pdate- pdblVal- pdecValVT_BYREF | VT_DECIMAL, Version 1 - pdispVal- pfltVal- piVal- pintVal- plVal- pparrayVT_BYREF | VT_ARRAY, Version 1 - ppdispValVT_BYREF | VT_DISPATCH, Version 1 - ppunkValVT_BYREF | VT_UNKNOWN, Version 1 - pscodeVT_BYREF | VT_ERROR, Version 1 - pszVal- puiVal- puintVal- pulVal- punkVal- puuid- pvarValVT_BYREF | VT_VARIANT, Version 1 - pwszVal- scode- uhVal- uiVal- uintValVT_UINT, Version 1 - ulVal- vt値の型タグです。 - wReserved1将来の使用のために予約されています。 - wReserved2将来の使用のために予約されています。 - wReserved3将来の使用のために予約されています。 |
公式ドキュメント
PROPVARIANT 構造体は、 IPropertyStorage の ReadMultiple メソッドおよび WriteMultiple メソッドで、プロパティ セット内のプロパティの型タグと値を定義するために使用されます。
PROPVARIANT 構造体は、IPropertyStore の GetValue メソッドおよび SetValue メソッドでも使用されます。IPropertyStore は、Windows Vista において項目のプロパティをプログラムから扱う主要な手段として IPropertySetStorage を置き換えるものです。詳細については、プロパティ ハンドラーを参照してください。
メンバーは 5 つあります。最初のメンバーである値の型タグと、最後のメンバーであるプロパティの値が意味を持ちます。中間の 3 つのメンバーは将来の使用のために予約されています。
解説(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_OBJECT と VT_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_I1、VT_UI1、VT_I2、VT_UI2、VT_BOOL、VT_I4、VT_UI4、VT_R4、VT_R8、VT_ERROR、VT_I8、VT_UI8、VT_CY、VT_DATE、VT_FILETIME、VT_CLSID、VT_CF、VT_BSTR、VT_LPSTR、VT_LPWSTR、VT_VARIANT。 VT_VECTOR は VT_BSTR_BLOB と OR 演算で組み合わせることもできますが、これはシステム専用です。 |
| VT_ARRAY | 0x2000 | Parray | 型インジケーターが OR 演算子によって VT_ARRAY と組み合わされている場合、値は SAFEARRAY へのポインターです。VT_ARRAY は次のデータ型と OR を使用できます。VT_I1、VT_UI1、VT_I2、VT_UI2、VT_I4、VT_UI4、VT_INT、VT_UINT、VT_R4、VT_R8、VT_BOOL、VT_DECIMAL、VT_ERROR、VT_CY、VT_DATE、VT_BSTR、VT_DISPATCH、VT_UNKNOWN、VT_VARIANT。VT_ARRAY は VT_VECTOR と OR で組み合わせることはできません。 |
| VT_BYREF | 0x4000 | p* | 型インジケーターが OR 演算子によって VT_BYREF と組み合わされている場合、値は参照になります。参照型は、C++ の参照型 (たとえば "int&") と同様に、データへの参照として解釈されます。
VT_BYREF は次の型と OR を使用できます。VT_I1、VT_UI1、VT_I2、VT_UI2、VT_I4、VT_UI4、VT_INT、VT_UINT、VT_R4、VT_R8、VT_BOOL、VT_DECIMAL、VT_ERROR、VT_CY、VT_DATE、VT_BSTR、VT_UNKNOWN、VT_DISPATCH、VT_ARRAY、VT_VARIANT。 |
| VT_VARIANT | 12 | capropvar | DWORD の型インジケーターと、それに続く対応する値です。VT_VARIANT は VT_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 公式リファレンス: 英語 (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 Structureimport 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__Unionstruct 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 非対応)。必要に応じ手動でアクセス。