2 * Copyright 2002 Ove Kaaven
3 * Copyright 2004 Francois Gouget
4 * Copyright 2005 Juan Lang
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
27 * Windows SDK braindamage alert
29 * PID_DICTIONARY and PID_CODEPAGE are defined by msidefs.h too
30 * PID_SECURITY is defined in msidefs.h with a different value!
31 * So these need to be undefined first.
33 cpp_quote
("#ifdef PID_DICTIONARY")
34 cpp_quote
("#undef PID_DICTIONARY")
37 cpp_quote
("#ifdef PID_CODEPAGE")
38 cpp_quote
("#undef PID_CODEPAGE")
41 cpp_quote
("#ifdef PID_SECURITY")
42 cpp_quote
("#undef PID_SECURITY")
45 /******************** Property Storage ********************/
47 interface IEnumSTATPROPSTG
;
48 interface IEnumSTATPROPSETSTG
;
52 uuid(00000138-0000-0000-C000
-000000000046),
53 pointer_default(unique)
55 interface IPropertyStorage
: IUnknown
57 typedef [unique] IPropertyStorage
*LPPROPERTYSTORAGE
;
59 const DWORD PROPSETFLAG_DEFAULT
= 0;
60 const DWORD PROPSETFLAG_NONSIMPLE
= 1;
61 const DWORD PROPSETFLAG_ANSI
= 2;
62 const DWORD PROPSETFLAG_UNBUFFERED
= 4;
63 const DWORD PROPSETFLAG_CASE_SENSITIVE
= 8;
65 const DWORD PROPSET_BEHAVIOR_CASE_SENSITIVE
= 1;
67 const PROPID PID_DICTIONARY
= 0x00000000;
68 const PROPID PID_CODEPAGE
= 0x00000001;
69 const PROPID PID_FIRST_USABLE
= 0x00000002;
70 const PROPID PID_FIRST_NAME_DEFAULT
= 0x00000fff;
71 const PROPID PID_LOCALE
= 0x80000000;
72 const PROPID PID_MODIFY_TIME
= 0x80000001;
73 const PROPID PID_SECURITY
= 0x80000002;
74 const PROPID PID_BEHAVIOR
= 0x80000003;
75 const PROPID PID_ILLEGAL
= 0xffffffff;
76 const PROPID PID_MIN_READONLY
= 0x80000000;
77 const PROPID PID_MAX_READONLY
= 0xbfffffff;
79 typedef struct tagPROPVARIANT PROPVARIANT
;
81 #define TYPEDEF_CA
(type
, name
) \
82 typedef struct tag##name
{ \
88 TYPEDEF_CA
(char, CAC
);
89 TYPEDEF_CA
(unsigned char, CAUB
);
90 TYPEDEF_CA
(short, CAI
);
91 TYPEDEF_CA
(USHORT
, CAUI
);
92 TYPEDEF_CA
(long, CAL
);
93 TYPEDEF_CA
(ULONG
, CAUL
);
94 TYPEDEF_CA
(float, CAFLT
);
95 TYPEDEF_CA
(double, CADBL
);
97 TYPEDEF_CA
(DATE
, CADATE
);
98 TYPEDEF_CA
(BSTR, CABSTR
);
99 TYPEDEF_CA
(BSTRBLOB
, CABSTRBLOB
);
100 TYPEDEF_CA
(VARIANT_BOOL, CABOOL
);
101 TYPEDEF_CA
(SCODE
, CASCODE
);
102 TYPEDEF_CA
(PROPVARIANT
, CAPROPVARIANT
);
103 TYPEDEF_CA
(LARGE_INTEGER
, CAH
);
104 TYPEDEF_CA
(ULARGE_INTEGER
, CAUH
);
105 TYPEDEF_CA
(LPSTR
, CALPSTR
);
106 TYPEDEF_CA
(LPWSTR
, CALPWSTR
);
107 TYPEDEF_CA
(FILETIME
, CAFILETIME
);
108 TYPEDEF_CA
(CLIPDATA
, CACLIPDATA
);
109 TYPEDEF_CA
(CLSID
, CACLSID
);
111 struct tagPROPVARIANT
{
116 [switch_is(vt
& 0x1fff)] union {
117 [case(VT_EMPTY
, VT_NULL
)] ;
118 [case(VT_I1
)] char cVal
;
119 [case(VT_UI1
)] UCHAR bVal
;
120 [case(VT_I2
)] short iVal
;
121 [case(VT_UI2
)] USHORT uiVal
;
122 [case(VT_BOOL
)] VARIANT_BOOL boolVal
;
123 #if
0 /* illegal in C++ */
124 [case(VT_ILLEGAL
)] _VARIANT_BOOL bool
;
126 [case(VT_I4
)] long lVal
;
127 [case(VT_UI4
)] ULONG ulVal
;
128 [case(VT_R4
)] float fltVal
;
129 [case(VT_ERROR
)] SCODE scode
;
130 [case(VT_I8
)] LARGE_INTEGER hVal
;
131 [case(VT_UI8
)] ULARGE_INTEGER uhVal
;
132 [case(VT_R8
)] double dblVal
;
133 [case(VT_CY
)] CY cyVal
;
134 [case(VT_DATE
)] DATE date
;
135 [case(VT_FILETIME
)] FILETIME filetime
;
136 [case(VT_CLSID
)] CLSID
*puuid
;
137 [case(VT_BLOB
, VT_BLOB_OBJECT
)] BLOB blob
;
138 [case(VT_CF
)] CLIPDATA
*pclipdata
;
139 [case(VT_STREAM
, VT_STREAMED_OBJECT
)] IStream
*pStream
;
140 [case(VT_STORAGE
, VT_STORED_OBJECT
)] IStorage
*pStorage
;
141 [case(VT_BSTR
)] BSTR bstrVal
;
142 [case(VT_BSTR_BLOB
)] BSTRBLOB bstrblobVal
;
143 [case(VT_LPSTR
)] LPSTR pszVal
;
144 [case(VT_LPWSTR
)] LPWSTR pwszVal
;
145 [case(VT_UNKNOWN
)] IUnknown
*punkVal
;
146 [case(VT_DISPATCH
)] IDispatch
*pdispVal
;
147 [case(VT_I1|VT_VECTOR
)] CAC cac
;
148 [case(VT_UI1|VT_VECTOR
)] CAUB caub
;
149 [case(VT_I2|VT_VECTOR
)] CAI cai
;
150 [case(VT_UI2|VT_VECTOR
)] CAUI caui
;
151 [case(VT_BOOL|VT_VECTOR
)] CABOOL cabool
;
152 [case(VT_I4|VT_VECTOR
)] CAL cal
;
153 [case(VT_UI4|VT_VECTOR
)] CAUL caul
;
154 [case(VT_R4|VT_VECTOR
)] CAFLT caflt
;
155 [case(VT_ERROR|VT_VECTOR
)] CASCODE cascode
;
156 [case(VT_I8|VT_VECTOR
)] CAH cah
;
157 [case(VT_UI8|VT_VECTOR
)] CAUH cauh
;
158 [case(VT_R8|VT_VECTOR
)] CADBL cadbl
;
159 [case(VT_CY|VT_VECTOR
)] CACY cacy
;
160 [case(VT_DATE|VT_VECTOR
)] CADATE cadate
;
161 [case(VT_FILETIME|VT_VECTOR
)] CAFILETIME cafiletime
;
162 [case(VT_CLSID|VT_VECTOR
)] CACLSID cauuid
;
163 [case(VT_CF|VT_VECTOR
)] CACLIPDATA caclipdata
;
164 [case(VT_BSTR|VT_VECTOR
)] CABSTR cabstr
;
165 [case(VT_BSTR_BLOB|VT_VECTOR
)] CABSTRBLOB cabstrblob
;
166 [case(VT_LPSTR|VT_VECTOR
)] CALPSTR calpstr
;
167 [case(VT_LPWSTR|VT_VECTOR
)] CALPWSTR calpwstr
;
168 [case(VT_VARIANT|VT_VECTOR
)] CAPROPVARIANT capropvar
;
169 [case(VT_ARRAY|VT_I1
,
184 VT_ARRAY|VT_DISPATCH
,
187 VT_ARRAY|VT_VARIANT
)] LPSAFEARRAY parray
;
188 [case(VT_BYREF|VT_I1
)] CHAR *pcVal
;
189 [case(VT_BYREF|VT_UI1
)] UCHAR
*pbVal
;
190 [case(VT_BYREF|VT_I2
)] SHORT *piVal
;
191 [case(VT_BYREF|VT_UI2
)] USHORT
*puiVal
;
192 [case(VT_BYREF|VT_I4
)] LONG *plVal
;
193 [case(VT_BYREF|VT_UI4
)] ULONG
*pulVal
;
194 [case(VT_BYREF|VT_INT
)] INT *pintVal
;
195 [case(VT_BYREF|VT_UINT
)] UINT
*puintVal
;
196 [case(VT_BYREF|VT_R4
)] FLOAT *pfltVal
;
197 [case(VT_BYREF|VT_R8
)] DOUBLE *pdblVal
;
198 [case(VT_BYREF|VT_BOOL
)] VARIANT_BOOL *pboolVal
;
199 [case(VT_BYREF|VT_DECIMAL
)] DECIMAL
*pdecVal
;
200 [case(VT_BYREF|VT_ERROR
)] SCODE
*pscode
;
201 [case(VT_BYREF|VT_CY
)] CY
*pcyVal
;
202 [case(VT_BYREF|VT_DATE
)] DATE
*pdate
;
203 [case(VT_BYREF|VT_BSTR
)] BSTR *pbstrVal
;
204 [case(VT_BYREF|VT_UNKNOWN
)] IUnknown
**ppunkVal
;
205 [case(VT_BYREF|VT_DISPATCH
)] IDispatch
**ppdispVal
;
206 [case(VT_BYREF|VT_ARRAY
)] LPSAFEARRAY
*pparray
;
207 [case(VT_BYREF|VT_VARIANT
)] PROPVARIANT
*pvarVal
;
211 typedef struct tagPROPVARIANT
*LPPROPVARIANT
;
214 typedef const PROPVARIANT
* REFPROPVARIANT
;
216 cpp_quote
("#ifndef _REFPROPVARIANT_DEFINED")
217 cpp_quote
("#define _REFPROPVARIANT_DEFINED")
218 cpp_quote
("#ifdef __cplusplus")
219 cpp_quote
("#define REFPROPVARIANT const PROPVARIANT &")
221 cpp_quote
("#define REFPROPVARIANT const PROPVARIANT * __MIDL_CONST")
225 cpp_quote
("#define PIDDI_THUMBNAIL 0x00000002L /* VT_BLOB */")
227 cpp_quote
("#define PIDSI_TITLE 0x00000002L /* VT_LPSTR */")
228 cpp_quote
("#define PIDSI_SUBJECT 0x00000003L /* VT_LPSTR */")
229 cpp_quote
("#define PIDSI_AUTHOR 0x00000004L /* VT_LPSTR */")
230 cpp_quote
("#define PIDSI_KEYWORDS 0x00000005L /* VT_LPSTR */")
231 cpp_quote
("#define PIDSI_COMMENTS 0x00000006L /* VT_LPSTR */")
232 cpp_quote
("#define PIDSI_TEMPLATE 0x00000007L /* VT_LPSTR */")
233 cpp_quote
("#define PIDSI_LASTAUTHOR 0x00000008L /* VT_LPSTR */")
234 cpp_quote
("#define PIDSI_REVNUMBER 0x00000009L /* VT_LPSTR */")
235 cpp_quote
("#define PIDSI_EDITTIME 0x0000000AL /* VT_FILETIME (UTC) */")
236 cpp_quote
("#define PIDSI_LASTPRINTED 0x0000000BL /* VT_FILETIME (UTC) */")
237 cpp_quote
("#define PIDSI_CREATE_DTM 0x0000000CL /* VT_FILETIME (UTC) */")
238 cpp_quote
("#define PIDSI_LASTSAVE_DTM 0x0000000DL /* VT_FILETIME (UTC) */")
239 cpp_quote
("#define PIDSI_PAGECOUNT 0x0000000EL /* VT_I4 */")
240 cpp_quote
("#define PIDSI_WORDCOUNT 0x0000000FL /* VT_I4 */")
241 cpp_quote
("#define PIDSI_CHARCOUNT 0x00000010L /* VT_I4 */")
242 cpp_quote
("#define PIDSI_THUMBNAIL 0x00000011L /* VT_CF */")
243 cpp_quote
("#define PIDSI_APPNAME 0x00000012L /* VT_LPSTR */")
244 cpp_quote
("#define PIDSI_DOC_SECURITY 0x00000013L /* VT_I4 */")
246 cpp_quote
("#define PIDDSI_CATEGORY 0x00000002L /* VT_LPSTR */")
247 cpp_quote
("#define PIDDSI_PRESFORMAT 0x00000003L /* VT_LPSTR */")
248 cpp_quote
("#define PIDDSI_BYTECOUNT 0x00000004L /* VT_I4 */")
249 cpp_quote
("#define PIDDSI_LINECOUNT 0x00000005L /* VT_I4 */")
250 cpp_quote
("#define PIDDSI_PARCOUNT 0x00000006L /* VT_I4 */")
251 cpp_quote
("#define PIDDSI_SLIDECOUNT 0x00000007L /* VT_I4 */")
252 cpp_quote
("#define PIDDSI_NOTECOUNT 0x00000008L /* VT_I4 */")
253 cpp_quote
("#define PIDDSI_HIDDENCOUNT 0x00000009L /* VT_I4 */")
254 cpp_quote
("#define PIDDSI_MMCLIPCOUNT 0x0000000AL /* VT_I4 */")
255 cpp_quote
("#define PIDDSI_SCALE 0x0000000BL /* VT_BOOL */")
256 cpp_quote
("#define PIDDSI_HEADINGPAIR 0x0000000CL /* VT_VARIANT|VT_VECTOR */")
257 cpp_quote
("#define PIDDSI_DOCPARTS 0x0000000DL /* VT_LPSTR|VT_VECTOR */")
258 cpp_quote
("#define PIDDSI_MANAGER 0x0000000EL /* VT_LPSTR */")
259 cpp_quote
("#define PIDDSI_COMPANY 0x0000000FL /* VT_LPSTR */")
260 cpp_quote
("#define PIDDSI_LINKSDIRTY 0x00000010L /* VT_B0OL */")
262 const ULONG PRSPEC_INVALID
= 0xffffffff;
263 const ULONG PRSPEC_LPWSTR
= 0;
264 const ULONG PRSPEC_PROPID
= 1;
266 typedef struct tagPROPSPEC
{
268 [switch_is(ulKind
)] union {
269 [case(PRSPEC_PROPID
)] PROPID propid
;
270 [case(PRSPEC_LPWSTR
)] LPOLESTR lpwstr
;
275 typedef struct tagSTATPROPSTG
{
281 cpp_quote
("/* Macros for dwOSVersion member of STATPROPSETSTG */")
282 cpp_quote
("#define PROPSETHDR_OSVER_KIND(dwOSVer) HIWORD((dwOSVer))")
283 cpp_quote
("#define PROPSETHDR_OSVER_MAJOR(dwOSVer) LOBYTE(LOWORD((dwOSVer)))")
284 cpp_quote
("#define PROPSETHDR_OSVER_MINOR(dwOSVer) HIBYTE(LOWORD((dwOSVer)))")
285 cpp_quote
("#define PROPSETHDR_OSVERSION_UNKNOWN 0xffffffff")
287 typedef struct tagSTATPROPSETSTG
{
297 HRESULT ReadMultiple
(
299 [in, size_is(cpspec
)] const PROPSPEC rgpspec
[],
300 [out, size_is(cpspec
)] PROPVARIANT rgpropvar
[]);
302 HRESULT WriteMultiple
(
304 [in, size_is(cpspec
)] const PROPSPEC rgpspec
[],
305 [in, size_is(cpspec
)] const PROPVARIANT rgpropvar
[],
306 [in] PROPID propidNameFirst
);
308 HRESULT DeleteMultiple
(
310 [in, size_is(cpspec
)] const PROPSPEC rgpspec
[]);
312 HRESULT ReadPropertyNames
(
314 [in, size_is(cpropid
)] const PROPID rgpropid
[],
315 [out, size_is(cpropid
)] LPOLESTR rglpwstrName
[]);
317 HRESULT WritePropertyNames
(
319 [in, size_is(cpropid
)] const PROPID rgpropid
[],
320 [in, size_is(cpropid
)] const LPOLESTR rglpwstrName
[]);
322 HRESULT DeletePropertyNames
(
324 [in, size_is(cpropid
)] const PROPID rgpropid
[]);
327 [in] DWORD grfCommitFlags
);
332 [out] IEnumSTATPROPSTG
**ppenum
);
335 [in] const FILETIME
*pctime
,
336 [in] const FILETIME
*patime
,
337 [in] const FILETIME
*pmtime
);
340 [in] REFCLSID clsid
);
343 [out] STATPROPSETSTG
*statpsstg
);
348 uuid(0000013A
-0000-0000-C000
-000000000046),
349 pointer_default(unique)
351 interface IPropertySetStorage
: IUnknown
353 typedef [unique] IPropertySetStorage
*LPPROPERTYSETSTORAGE
;
356 [in] REFFMTID rfmtid
,
357 [in, unique] const CLSID
*pclsid
,
360 [out] IPropertyStorage
**ppprstg
);
363 [in] REFFMTID rfmtid
,
365 [out] IPropertyStorage
**ppprstg
);
368 [in] REFFMTID rfmtid
);
371 [out] IEnumSTATPROPSETSTG
**ppenum
);
376 uuid(00000139-0000-0000-C000
-000000000046),
377 pointer_default(unique)
379 interface IEnumSTATPROPSTG
: IUnknown
381 typedef [unique] IEnumSTATPROPSTG
*LPENUMSTATPROPSTG
;
386 [out, size_is(celt
), length_is(*pceltFetched
)]
388 [out] ULONG
*pceltFetched
);
393 [out, size_is(celt
), length_is(*pceltFetched
)]
395 [out] ULONG
*pceltFetched
);
403 [out] IEnumSTATPROPSTG
**ppenum
);
408 uuid(0000013B
-0000-0000-C000
-000000000046),
409 pointer_default(unique)
411 interface IEnumSTATPROPSETSTG
: IUnknown
413 typedef [unique] IEnumSTATPROPSETSTG
*LPENUMSTATPROPSETSTG
;
418 [out, size_is(celt
), length_is(*pceltFetched
)]
419 STATPROPSETSTG
*rgelt
,
420 [out] ULONG
*pceltFetched
);
425 [out, size_is(celt
), length_is(*pceltFetched
)]
426 STATPROPSETSTG
*rgelt
,
427 [out] ULONG
*pceltFetched
);
435 [out] IEnumSTATPROPSETSTG
**ppenum
);
438 typedef struct SERIALIZEDPROPERTYVALUE
{
441 } SERIALIZEDPROPERTYVALUE
;
443 cpp_quote
("HRESULT WINAPI FreePropVariantArray(ULONG,PROPVARIANT*);")
444 cpp_quote
("HRESULT WINAPI PropVariantClear(PROPVARIANT*);")
445 cpp_quote
("HRESULT WINAPI PropVariantCopy(PROPVARIANT*,const PROPVARIANT*);")
447 cpp_quote
("#define _PROPVARIANT_INIT_DEFINED_")
448 cpp_quote
("#define PropVariantInit(p) memset((p), 0, sizeof(PROPVARIANT))")
450 cpp_quote
("#ifndef _STGCREATEPROPSTG_DEFINED_")
451 cpp_quote
("#define _STGCREATEPROPSTG_DEFINED_")
452 cpp_quote
("HRESULT WINAPI StgCreatePropStg(IUnknown *, REFFMTID, const CLSID *, DWORD, DWORD, IPropertyStorage **);")
453 cpp_quote
("HRESULT WINAPI StgOpenPropStg(IUnknown *, REFFMTID, DWORD, DWORD, IPropertyStorage **);")
454 cpp_quote
("HRESULT WINAPI StgCreatePropSetStg(IStorage *, DWORD, IPropertySetStorage **);")
455 cpp_quote
("#define CCH_MAX_PROPSTG_NAME 31")
456 cpp_quote
("HRESULT WINAPI FmtIdToPropStgName(const FMTID *, LPOLESTR);")
457 cpp_quote
("HRESULT WINAPI PropStgNameToFmtId(const LPOLESTR, FMTID *);")
458 cpp_quote
("#endif /* _STGCREATEPROPSTG_DEFINED_ */")