Bagikan melalui


Struktur PROPVARIANT (propidlbase.h)

Struktur PROPVARIANT digunakan dalam metode ReadMultiple dan WriteMultiple dari IPropertyStorage untuk menentukan tag jenis dan nilai properti dalam kumpulan properti.

Struktur PROPVARIANT juga digunakan oleh metode GetValue dan SetValue dari IPropertyStore, yang menggantikan IPropertySetStorage sebagai cara utama untuk memprogram properti item di Windows Vista. Untuk informasi selengkapnya, lihat Penangan Properti.

Ada lima anggota. Anggota pertama, tag jenis nilai, dan anggota terakhir, nilai properti, signifikan. Tiga anggota tengah dicadangkan untuk digunakan di masa mendatang.

Catatan Anggota bool dalam definisi sebelumnya dari struktur ini telah diganti namanya menjadi boolVal, karena beberapa pengkompilasi sekarang mengenali bool sebagai kata kunci.
 
Catatan Struktur PROPVARIANT , yang ditentukan di bawah ini, mencakup jenis yang dapat diserialisasikan dalam format serialisasi set properti versi 1. Format versi 1 mendukung semua jenis yang diizinkan dalam format versi 0 ditambah beberapa jenis tambahan. Jenis yang ditambahkan termasuk "Versi 1" di bidang komentar di bawah ini. Gunakan jenis ini hanya jika set properti versi 1 dimaksudkan. Untuk informasi selengkapnya, lihat Serialisasi Set Properti.
 
Struktur PROPVARIANT didefinisikan sebagai berikut:

Sintaks

typedef struct tagPROPVARIANT {
  union {
    typedef struct {
      VARTYPE      vt;
      PROPVAR_PAD1 wReserved1;
      PROPVAR_PAD2 wReserved2;
      PROPVAR_PAD3 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;
        VARIANT_BOOL      __OBSOLETE__VARIANT_BOOL;
        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;
      };
    } tag_inner_PROPVARIANT, PROPVARIANT, *LPPROPVARIANT;
    DECIMAL decVal;
  };
} PROPVARIANT, *LPPROPVARIANT;

Anggota

tag_inner_PROPVARIANT

tag_inner_PROPVARIANT.vt

tag_inner_PROPVARIANT.wReserved1

tag_inner_PROPVARIANT.wReserved2

tag_inner_PROPVARIANT.wReserved3

tag_inner_PROPVARIANT.cVal

tag_inner_PROPVARIANT.bVal

tag_inner_PROPVARIANT.iVal

tag_inner_PROPVARIANT.uiVal

tag_inner_PROPVARIANT.lVal

tag_inner_PROPVARIANT.ulVal

tag_inner_PROPVARIANT.intVal

tag_inner_PROPVARIANT.uintVal

tag_inner_PROPVARIANT.hVal

tag_inner_PROPVARIANT.uhVal

tag_inner_PROPVARIANT.fltVal

tag_inner_PROPVARIANT.dblVal

tag_inner_PROPVARIANT.boolVal

tag_inner_PROPVARIANT.__OBSOLETE__VARIANT_BOOL

tag_inner_PROPVARIANT.scode

tag_inner_PROPVARIANT.cyVal

tag_inner_PROPVARIANT.date

tag_inner_PROPVARIANT.filetime

tag_inner_PROPVARIANT.puuid

tag_inner_PROPVARIANT.pclipdata

tag_inner_PROPVARIANT.bstrVal

tag_inner_PROPVARIANT.bstrblobVal

tag_inner_PROPVARIANT.blob

tag_inner_PROPVARIANT.pszVal

tag_inner_PROPVARIANT.pwszVal

tag_inner_PROPVARIANT.punkVal

tag_inner_PROPVARIANT.pdispVal

tag_inner_PROPVARIANT.pStream

tag_inner_PROPVARIANT.pStorage

tag_inner_PROPVARIANT.pVersionedStream

tag_inner_PROPVARIANT.parray

tag_inner_PROPVARIANT.cac

tag_inner_PROPVARIANT.caub

tag_inner_PROPVARIANT.cai

tag_inner_PROPVARIANT.caui

tag_inner_PROPVARIANT.cal

tag_inner_PROPVARIANT.caul

tag_inner_PROPVARIANT.cah

tag_inner_PROPVARIANT.cauh

tag_inner_PROPVARIANT.caflt

tag_inner_PROPVARIANT.cadbl

tag_inner_PROPVARIANT.cabool

tag_inner_PROPVARIANT.cascode

tag_inner_PROPVARIANT.cacy

tag_inner_PROPVARIANT.cadate

tag_inner_PROPVARIANT.cafiletime

tag_inner_PROPVARIANT.cauuid

tag_inner_PROPVARIANT.caclipdata

tag_inner_PROPVARIANT.cabstr

tag_inner_PROPVARIANT.cabstrblob

tag_inner_PROPVARIANT.calpstr

tag_inner_PROPVARIANT.calpwstr

tag_inner_PROPVARIANT.capropvar

tag_inner_PROPVARIANT.pcVal

tag_inner_PROPVARIANT.pbVal

tag_inner_PROPVARIANT.piVal

tag_inner_PROPVARIANT.puiVal

tag_inner_PROPVARIANT.plVal

tag_inner_PROPVARIANT.pulVal

tag_inner_PROPVARIANT.pintVal

tag_inner_PROPVARIANT.puintVal

tag_inner_PROPVARIANT.pfltVal

tag_inner_PROPVARIANT.pdblVal

tag_inner_PROPVARIANT.pboolVal

tag_inner_PROPVARIANT.pdecVal

tag_inner_PROPVARIANT.pscode

tag_inner_PROPVARIANT.pcyVal

tag_inner_PROPVARIANT.pdate

tag_inner_PROPVARIANT.pbstrVal

tag_inner_PROPVARIANT.ppunkVal

tag_inner_PROPVARIANT.ppdispVal

tag_inner_PROPVARIANT.pparray

tag_inner_PROPVARIANT.pvarVal

decVal

Keterangan

Struktur PROPVARIANT juga dapat menyimpan nilai VT_DECIMAL:

    DECIMAL       decVal;        //VT_DECIMAL

Namun, nilai struktur DESIMAL membutuhkan penanganan khusus. Struktur DESIMAL berukuran sama dengan seluruh struktur PROPVARIANT dan tidak cocok dengan penyatuan yang menyimpan semua jenis nilai lainnya. Sebaliknya, nilai struktur DESIMAL menempati seluruh struktur PROPVARIANT , termasuk bidang yang dipesan dan anggota vt . Namun, anggota pertama struktur DESIMAL tidak digunakan dan berukuran sama dengan anggota vt struktur PROPVARIANT . Oleh karena itu, deklarasi struktur PROPVARIANT dalam file header Propidl.h Dari Win32 mendefinisikan anggota decVal sedih sehingga sesuai dengan awal struktur PROPVARIANT . Oleh karena itu, untuk menempatkan nilai struktur DESIMAL ke dalam struktur PROPVARIANT , nilai harus dimuat ke dalam anggota decVal dan anggota vt diatur ke VT_DECIMAL, sama seperti nilai lainnya.

PROPVARIANT adalah jenis data mendasar di mana nilai properti dibaca dan ditulis melalui antarmuka IPropertyStorage .

Jenis data PROPVARIANT terkait dengan VARIAN jenis data, yang didefinisikan sebagai bagian dari Automation di OLE2. Beberapa definisi digunakan kembali dari Automation, sebagai berikut:

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;

Selain itu, beberapa jenis unik untuk struktur 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;

Di antara jenis PROPVARIANT yang unik adalah beberapa jenis data yang menentukan array terhitung dari jenis data lainnya. Jenis data dari semua array yang dihitung dimulai dengan huruf CA, misalnya CAUB, dan memiliki nilai vt operator OR (VarType elemen dan operator OR dengan VT_VECTOR). Struktur array yang dihitung memiliki formulir berikut (di mana nama adalah nama spesifik dari array yang dihitung).

#define TYPEDEF_CA(type, name) 
 
    typedef struct tag ## name {\
        ULONG cElems;\
        type *pElems;\
        } name
Jenis propvariant Kode Anggota propvariant Representasi nilai
VT_EMPTY 0 Tidak ada Properti dengan indikator jenis VT_EMPTY tidak memiliki data yang terkait dengannya; yaitu, ukuran nilainya adalah nol.
VT_NULL 1 Tidak ada Ini seperti penunjuk ke NULL.
VT_I1 16 cVal Bilangan bulat bertanda tangan 1-byte.
VT_UI1 17 bVal Bilangan bulat yang tidak ditandatangani 1-byte.
VT_I2 2 iVal Dua byte yang mewakili nilai bilangan bulat bertanda 2 byte.
VT_UI2 18 uiVal Bilangan bulat yang tidak ditandatangani 2-byte.
VT_I4 3 lVal Nilai bilangan bulat bertanda tangan 4-byte.
VT_UI4 19 ulVal Bilangan bulat yang tidak ditandatangani 4-byte.
VT_INT 22 intVal Nilai bilangan bulat bertanda tangan 4 byte (setara dengan VT_I4).
VT_UINT 23 uintVal Bilangan bulat tidak bertanda 4 byte (setara dengan VT_UI4).
VT_I8 20 hVal Bilangan bulat bertanda tangan 8-byte.
VT_UI8 21 uhVal Bilangan bulat yang tidak ditandatangani 8-byte.
VT_R4 4 fltVal Nilai titik float IEEE 32-bit.
VT_R8 5 dblVal Nilai titik float IEEE 64-bit.
VT_BOOL 11 boolVal (bool dalam desain sebelumnya) Nilai Boolean, WORD yang berisi 0 (FALSE) atau -1 (TRUE).
VT_ERROR 10 scode DWORD yang berisi kode status.
VT_CY 6 cyVal Bilangan bulat pelengkap 8-byte dua (diskalakan sebesar 10.000). Jenis ini umumnya digunakan untuk jumlah mata uang.
VT_DATE 7 date Angka titik mengambang 64-bit yang menunjukkan jumlah hari (bukan detik) sejak 31 Desember 1899. Misalnya, 1 Januari 1900, adalah 2,0, 2 Januari 1900, adalah 3,0, dan sebagainya). Ini disimpan dalam representasi yang sama dengan VT_R8.
VT_FILETIME 64 waktu file Struktur FILETIME 64-bit seperti yang didefinisikan oleh Win32. Disarankan agar setiap saat disimpan dalam Universal Coordinate Time (UTC).
VT_CLSID 72 puuid Penunjuk ke pengidentifikasi kelas (CLSID) (atau pengidentifikasi unik global lainnya (GUID)).
VT_CF 71 pclipdata Penunjuk ke struktur CLIPDATA , dijelaskan di atas.
VT_BSTR 8 bstrVal Penunjuk ke string Unicode yang dihentikan null. String segera didahului oleh DWORD yang mewakili jumlah byte, tetapi titik bstrVal melewati DWORD ini ke karakter pertama string. BSTRharus dialokasikan dan dikosongkan menggunakan panggilan Automation SysAllocString dan SysFreeString .
VT_BSTR_BLOB 0xfff bstrblobVal Untuk penggunaan sistem saja.
VT_BLOB 65 blob Jumlah DWORD byte, diikuti oleh banyak byte data. Jumlah byte tidak menyertakan empat byte untuk panjang hitungan itu sendiri; anggota blob kosong akan memiliki hitungan nol, diikuti oleh nol byte. Ini mirip dengan nilai VT_BSTR, tetapi tidak menjamin byte null di akhir data.
VT_BLOBOBJECT 70 blob Anggota blob yang berisi objek berseri dalam representasi yang sama yang akan muncul di VT_STREAMED_OBJECT. Artinya, jumlah byte DWORD (di mana jumlah byte tidak menyertakan ukuran dirinya sendiri) yang dalam format pengidentifikasi kelas diikuti dengan data inisialisasi untuk kelas tersebut.

Satu-satunya perbedaan signifikan antara VT_BLOB_OBJECT dan VT_STREAMED_OBJECT adalah bahwa yang pertama tidak memiliki overhead penyimpanan tingkat sistem yang akan dimiliki yang terakhir, dan karenanya lebih cocok untuk skenario yang melibatkan jumlah objek kecil.

VT_LPSTR 30 pszVal Penunjuk ke string ANSI yang dihentikan null di halaman kode default sistem.
VT_LPWSTR 31 pwszVal Penunjuk ke string Unicode yang dihentikan null di lokal default pengguna.
VT_UNKNOWN 13 punkVal Baru.
VT_DISPATCH 9 pdispVal Baru.
VT_STREAM 66 pStream Penunjuk ke antarmuka IStream yang mewakili aliran yang merupakan saudara kandung dari aliran "Konten".
VT_STREAMED_OBJECT 68 pStream Seperti dalam VT_STREAM, tetapi menunjukkan bahwa aliran berisi objek berseri, yang merupakan CLSID diikuti dengan data inisialisasi untuk kelas . Aliran adalah saudara kandung dari aliran "Konten" yang berisi kumpulan properti.
VT_STORAGE 67 pStorage Penunjuk ke antarmuka IStorage , mewakili objek penyimpanan yang merupakan saudara kandung dari aliran "Konten".
VT_STORED_OBJECT 69 pStorage Seperti dalam VT_STORAGE, tetapi menunjukkan bahwa IStorage yang ditunjuk berisi objek yang dapat dimuat.
VT_VERSIONED_STREAM 73 pVersionedStream Streaming dengan versi GUID.
VT_DECIMAL 14 decVal Struktur DESIMAL .
VT_VECTOR 0x1000 Ca* Jika indikator jenis dikombinasikan dengan VT_VECTOR dengan menggunakan operator OR , nilainya adalah salah satu nilai array yang dihitung. Ini membuat jumlah elemen DWORD , diikuti dengan penunjuk ke pengulangan nilai yang ditentukan.

Misalnya, indikator jenis VT_LPSTR|VT_VECTOR memiliki jumlah elemen DWORD , diikuti dengan penunjuk ke array elemen LPSTR .

VT_VECTOR dapat digabungkan oleh operator OR dengan jenis berikut: 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, dan VT_VARIANT. VT_VECTOR juga dapat digabungkan dengan operasi OR dengan VT_BSTR_BLOB, namun hanya untuk penggunaan sistem.

VT_ARRAY 0x2000 Parray Jika indikator jenis dikombinasikan dengan VT_ARRAY oleh operator OR , nilainya adalah pointer ke SAFEARRAY. VT_ARRAY dapat menggunakan OR dengan jenis data berikut: 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, dan VT_VARIANT. VT_ARRAY tidak dapat menggunakan OR dengan VT_VECTOR.
VT_BYREF 0x4000 P* Jika indikator jenis dikombinasikan dengan VT_BYREF oleh operator OR , nilainya adalah referensi. Jenis referensi ditafsirkan sebagai referensi ke data, mirip dengan jenis referensi di C++ (misalnya, "int&").

VT_BYREF dapat menggunakan OR dengan jenis berikut: 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, dan VT_VARIANT.

VT_VARIANT 12 capropvar Indikator jenis DWORD diikuti oleh nilai yang sesuai. VT_VARIANT hanya dapat digunakan dengan VT_VECTOR atau VT_BYREF.
VT_TYPEMASK 0xFFF   Digunakan sebagai masker untuk VT_VECTOR dan pengubah lainnya untuk mengekstrak nilai VT mentah.
 

Pengidentifikasi format Clipboard, disimpan dengan tag VT_CF, menggunakan salah satu dari lima representasi, yang diidentifikasi dalam anggota ulClipFmt struktur CLIPDATA menggunakan penunjuk pClipData ke jenis data tertentu.

Nilai ulClipFmt nilai pClipData
-1L DWORD yang berisi nilai format clipboard Windows bawaan.
-2L DWORD yang berisi nilai format clipboard Macintosh.
-3L GUID yang berisi pengidentifikasi format (FMTID). Ini jarang digunakan.
nilai positif apa pun String null-terminated yang berisi nama format clipboard Windows, yang cocok untuk diteruskan ke fungsi RegisterClipboardFormat . Fungsi ini mendaftarkan format clipboard baru. Jika format terdaftar dengan nama yang ditentukan sudah ada, format baru tidak terdaftar dan nilai yang dikembalikan mengidentifikasi format yang ada. Ini memungkinkan lebih dari satu aplikasi untuk menyalin dan menempelkan data menggunakan format clipboard terdaftar yang sama. Perbandingan nama format tidak peka huruf besar/kecil dan diidentifikasi oleh nilai dalam rentang dari 0xC000 hingga 0xFFFF. Halaman kode yang digunakan untuk karakter dalam string sesuai dengan indikator halaman kode. "Nilai positif" di sini adalah panjang string, termasuk byte null di akhir. Ketika mendaftarkan format clipboard ditempatkan pada atau diambil dari clipboard, format tersebut harus dalam bentuk nilai jenis data HGLOBAL , yang menyediakan handel ke objek.
0L Tidak ada data (jarang digunakan).
 

Jika nilai anggota ulClipFmt adalah -1, data dalam bentuk format Windows bawaan. Dalam hal ini, DWORD pertama dari buffer yang ditunjukkan oleh pClipData adalah pengidentifikasi format clipboard, misalnya CF_METAFILEPICT. Dalam kasus CF_METAFILEPCT, apa berikut ini adalah variasi pada struktur METAFILEPICT (menggunakan WORD, bukan jenis data DWORD ). Artinya, data ini dalam bentuk berikut:

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

Setelah struktur METAFILEPICT adalah data metafile, cocok untuk diteruskan ke fungsi SetMetaFileBitsEx . Fungsi ini membuat metafile format Windows berbasis memori dari data yang disediakan. Fungsi ini disediakan untuk kompatibilitas dengan Windows versi 16-bit. Aplikasi berbasis Win32 harus menggunakan fungsi SetEnhMetaFileBits . Fungsi ini mengambil konten metafile format yang disempurnakan yang ditentukan dan menyalinnya ke dalam buffer. Jika fungsi berhasil dan penunjuk buffer adalah NULL, nilai yang dikembalikan adalah ukuran metafile yang ditingkatkan dalam byte. Jika fungsi berhasil dan penunjuk buffer adalah penunjuk yang valid, nilai yang dikembalikan adalah jumlah byte yang disalin ke buffer. Jika fungsi gagal, nilai yang dikembalikan adalah nol.

Ketika mendaftarkan format clipboard ditempatkan pada atau diambil dari clipboard, mereka harus dalam bentuk nilai HGLOBAL .

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows 2000 Professional [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows 2000 Server [aplikasi desktop | Aplikasi UWP]
Header propidlbase.h (termasuk Propidl.h)