propsys: Implement prop variant integer conversions with tests.
[wine] / include / objidl.idl
1 /*
2  * Copyright 2002 Ove Kaaven
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #ifndef DO_NO_IMPORTS
20 import "unknwn.idl";
21 #endif
22
23 interface IStream;
24 interface IEnumString;
25 interface IRunningObjectTable;
26 interface IMoniker;
27 interface IAdviseSink;
28 interface IAsyncManager;
29 interface ISynchronize;
30
31 typedef struct _COSERVERINFO {
32   DWORD dwReserved1;
33   LPWSTR pwszName;
34   COAUTHINFO *pAuthInfo;
35   DWORD dwReserved2;
36 } COSERVERINFO;
37
38 /******************** Fundamentals ********************/
39
40 [
41   local,
42   object,
43   uuid(00000003-0000-0000-C000-000000000046)
44 ]
45 interface IMarshal : IUnknown
46 {
47   typedef [unique] IMarshal *LPMARSHAL;
48
49   HRESULT GetUnmarshalClass(
50     [in] REFIID riid,
51     [in, unique] void *pv,
52     [in] DWORD dwDestContext,
53     [in, unique] void *pvDestContext,
54     [in] DWORD mshlflags,
55     [out] CLSID *pCid);
56
57   HRESULT GetMarshalSizeMax(
58     [in] REFIID riid,
59     [in, unique] void *pv,
60     [in] DWORD dwDestContext,
61     [in, unique] void *pvDestContext,
62     [in] DWORD mshlflags,
63     [out] DWORD *pSize);
64
65   HRESULT MarshalInterface(
66     [in, unique] IStream *pStm,
67     [in] REFIID riid,
68     [in, unique] void *pv,
69     [in] DWORD dwDestContext,
70     [in, unique] void *pvDestContext,
71     [in] DWORD mshlflags);
72
73   HRESULT UnmarshalInterface(
74     [in, unique] IStream *pStm,
75     [in] REFIID riid,
76     [out] void **ppv);
77
78   HRESULT ReleaseMarshalData(
79     [in, unique] IStream *pStm);
80
81   HRESULT DisconnectObject(
82     [in] DWORD dwReserved);
83 }
84
85 [
86     local,
87     object,
88     uuid(000001cf-0000-0000-C000-000000000046)
89 ]
90 interface IMarshal2 : IMarshal
91 {
92     typedef [unique] IMarshal2 *LPMARSHAL2;
93 }
94
95 [
96   local,
97   object,
98   uuid(00000018-0000-0000-C000-000000000046)
99 ]
100 interface IStdMarshalInfo : IUnknown
101 {
102   typedef [unique] IStdMarshalInfo *LPSTDMARSHALINFO;
103
104   HRESULT GetClassForHandler(
105     [in] DWORD dwDestContext,
106     [in, unique] void *pvDestContext,
107     [out] CLSID *pClsid);
108 }
109
110 [
111   local,
112   object,
113   uuid(00000019-0000-0000-C000-000000000046)
114 ]
115 interface IExternalConnection : IUnknown
116 {
117   typedef [unique] IExternalConnection *LPEXTERNALCONNECTION;
118
119   typedef enum tagEXTCONN {
120     EXTCONN_STRONG   = 0x0001,
121     EXTCONN_WEAK     = 0x0002,
122     EXTCONN_CALLABLE = 0x0004
123   } EXTCONN;
124
125   DWORD AddConnection(
126     [in] DWORD extconn,
127     [in] DWORD reserved);
128
129   DWORD ReleaseConnection(
130     [in] DWORD extconn,
131     [in] DWORD reserved,
132     [in] BOOL fLastReleaseCloses);
133 }
134
135 [
136   local,
137   object,
138   uuid(00000020-0000-0000-C000-000000000046)
139 ]
140 interface IMultiQI : IUnknown
141 {
142   typedef [unique] IMultiQI *LPMULTIQI;
143
144   typedef struct tagMULTI_QI {
145     const IID *pIID;
146     IUnknown *pItf;
147     HRESULT hr;
148   } MULTI_QI;
149
150   HRESULT QueryMultipleInterfaces(
151     [in] ULONG cMQIs,
152     [in, out] MULTI_QI *pMQIs);
153 }
154
155 [
156   local,
157   object,
158   uuid(00000002-0000-0000-C000-000000000046)
159 ]
160 interface IMalloc : IUnknown
161 {
162   typedef [unique] IMalloc *LPMALLOC;
163
164   LPVOID Alloc(
165     [in] ULONG cb);
166
167   LPVOID Realloc(
168     [in] LPVOID pv,
169     [in] ULONG cb);
170
171   void Free(
172     [in] LPVOID pv);
173
174   ULONG GetSize(
175     [in] LPVOID pv);
176
177   int DidAlloc(LPVOID pv);
178
179   void HeapMinimize();
180 }
181
182 [
183   local,
184   object,
185   uuid(0000001d-0000-0000-C000-000000000046)
186 ]
187 interface IMallocSpy : IUnknown
188 {
189   typedef [unique] IMallocSpy *LPMALLOCSPY;
190
191   ULONG PreAlloc(
192     [in] ULONG cbRequest);
193
194   LPVOID PostAlloc(
195     [in] LPVOID pActual);
196
197   LPVOID PreFree(
198     [in] LPVOID pRequest,
199     [in] BOOL fSpyed);
200
201   void PostFree(
202     [in] BOOL fSpyed);
203
204   ULONG PreRealloc(
205     [in] LPVOID pRequest,
206     [in] ULONG cbRequest,
207     [out] LPVOID *ppNewRequest,
208     [in] BOOL fSpyed);
209
210   LPVOID PostRealloc(
211     [in] LPVOID pActual,
212     [in] BOOL fSpyed);
213
214   LPVOID PreGetSize(
215     [in] LPVOID pRequest,
216     [in] BOOL fSpyed);
217
218   ULONG PostGetSize(
219     [in] ULONG cbActual,
220     [in] BOOL fSpyed);
221
222   LPVOID PreDidAlloc(
223     [in] LPVOID pRequest,
224     [in] BOOL fSpyed);
225
226   int PostDidAlloc(
227     [in] LPVOID pRequest,
228     [in] BOOL fSpyed,
229     [in] int fActual);
230
231   void PreHeapMinimize();
232
233   void PostHeapMinimize();
234 }
235
236 [
237   local,
238   object,
239   uuid(00000021-0000-0000-C000-000000000046)
240 ]
241 interface IInternalUnknown : IUnknown
242 {
243   HRESULT QueryInternalInterface(
244     [in] REFIID riid,
245     [out] void **ppv);
246 }
247
248 [
249   object,
250   uuid(00000100-0000-0000-C000-000000000046),
251   pointer_default(unique)
252 ]
253 interface IEnumUnknown : IUnknown
254 {
255   typedef [unique] IEnumUnknown *LPENUMUNKNOWN;
256
257   [local]
258   HRESULT Next(
259     [in] ULONG celt,
260     [out] IUnknown **rgelt,
261     [out] ULONG *pceltFetched);
262
263   [call_as(Next)]
264   HRESULT RemoteNext(
265     [in] ULONG celt,
266     [out, size_is(celt), length_is(*pceltFetched)]
267     IUnknown **rgelt,
268     [out] ULONG *pceltFetched);
269
270   HRESULT Skip(
271     [in] ULONG celt);
272
273   HRESULT Reset();
274
275   HRESULT Clone(
276     [out] IEnumUnknown **ppenum);
277 }
278
279 [
280   object,
281   uuid(00000022-0000-0000-C000-000000000046),
282   version(1.0),
283   pointer_default(unique)
284 ]
285 interface ISurrogate : IUnknown
286 {
287   typedef [unique] ISurrogate *LPSURROGATE;
288
289   HRESULT LoadDllServer(
290     [in] REFCLSID Clsid);
291   HRESULT FreeSurrogate();
292 }
293
294 [
295   local,
296   object,
297   uuid(00000146-0000-0000-C000-000000000046)
298 ]
299 interface IGlobalInterfaceTable : IUnknown
300 {
301   typedef [unique] IGlobalInterfaceTable *LPGLOBALINTERFACETABLE;
302
303   HRESULT RegisterInterfaceInGlobal(
304     [in] IUnknown *pUnk,
305     [in] REFIID riid,
306     [out] DWORD *pdwCookie);
307
308   HRESULT RevokeInterfaceFromGlobal(
309     [in] DWORD dwCookie);
310
311   HRESULT GetInterfaceFromGlobal(
312     [in] DWORD dwCookie,
313     [in] REFIID riid,
314     [out, iid_is(riid)] void **ppv);
315 }
316
317 /******************** Monikers ********************/
318
319 [
320   object,
321   uuid(0000000e-0000-0000-C000-000000000046),
322   pointer_default(unique)
323 ]
324 interface IBindCtx : IUnknown
325 {
326   typedef [unique] IBindCtx *LPBINDCTX;
327   typedef [unique] IBindCtx *LPBC;
328
329   typedef struct tagBIND_OPTS {
330     DWORD cbStruct;
331     DWORD grfFlags;
332     DWORD grfMode;
333     DWORD dwTickCountDeadline;
334   } BIND_OPTS, *LPBIND_OPTS;
335
336   /* FIXME: C++ crap */
337   typedef struct tagBIND_OPTS2 {
338     DWORD cbStruct;
339     DWORD grfFlags;
340     DWORD grfMode;
341     DWORD dwTickCountDeadline;
342     DWORD dwTrackFlags;
343     DWORD dwClassContext;
344     LCID  locale;
345     COSERVERINFO *pServerInfo;
346   } BIND_OPTS2, *LPBIND_OPTS2;
347
348   typedef struct tagBIND_OPTS3 {
349     DWORD cbStruct;
350     DWORD grfFlags;
351     DWORD grfMode;
352     DWORD dwTickCountDeadline;
353     DWORD dwTrackFlags;
354     DWORD dwClassContext;
355     LCID  locale;
356     COSERVERINFO *pServerInfo;
357     HWND hwnd;
358   } BIND_OPTS3, *LPBIND_OPTS3;
359
360   typedef enum tagBIND_FLAGS {
361     BIND_MAYBOTHERUSER   = 1,
362     BIND_JUSTTESTEXISTENCE = 2
363   } BIND_FLAGS;
364
365   HRESULT RegisterObjectBound(
366     [in, unique] IUnknown *punk);
367
368   HRESULT RevokeObjectBound(
369     [in, unique] IUnknown *punk);
370
371   HRESULT ReleaseBoundObjects();
372
373   [local]
374   HRESULT SetBindOptions(
375     [in] BIND_OPTS *pbindopts);
376
377   [call_as(SetBindOptions)]
378   HRESULT RemoteSetBindOptions(
379     [in] BIND_OPTS2 *pbindopts);
380
381   [local]
382   HRESULT GetBindOptions(
383     [in, out] BIND_OPTS *pbindopts);
384
385   [call_as(GetBindOptions)]
386   HRESULT RemoteGetBindOptions(
387     [in, out] BIND_OPTS2 *pbindopts);
388
389   HRESULT GetRunningObjectTable(
390     [out] IRunningObjectTable **pprot);
391
392   HRESULT RegisterObjectParam(
393     [in] LPOLESTR pszKey,
394     [in, unique] IUnknown *punk);
395
396   HRESULT GetObjectParam(
397     [in] LPOLESTR pszKey,
398     [out] IUnknown **ppunk);
399
400   HRESULT EnumObjectParam(
401     [out] IEnumString **ppenum);
402
403   HRESULT RevokeObjectParam(
404     [in] LPOLESTR pszKey);
405 }
406
407 [
408   object,
409   uuid(00000102-0000-0000-C000-000000000046),
410   pointer_default(unique)
411 ]
412 interface IEnumMoniker : IUnknown
413 {
414   typedef [unique] IEnumMoniker *LPENUMMONIKER;
415
416   [local]
417   HRESULT Next(
418     [in] ULONG celt,
419     [out, size_is(celt), length_is(*pceltFetched)]
420     IMoniker **rgelt,
421     [out] ULONG *pceltFetched);
422
423   [call_as(Next)]
424   HRESULT RemoteNext(
425     [in] ULONG celt,
426     [out, size_is(celt), length_is(*pceltFetched)]
427     IMoniker **rgelt,
428     [out] ULONG *pceltFetched);
429
430   HRESULT Skip(
431     [in] ULONG celt);
432
433   HRESULT Reset();
434
435   HRESULT Clone(
436     [out] IEnumMoniker **ppenum);
437 }
438
439 [
440   object,
441   uuid(00000126-0000-0000-C000-000000000046)
442 ]
443 interface IRunnableObject : IUnknown
444 {
445   typedef [unique] IRunnableObject *LPRUNNABLEOBJECT;
446
447   HRESULT GetRunningClass(
448     [out] LPCLSID lpClsid);
449
450   HRESULT Run(
451     [in] LPBINDCTX pbc);
452
453   [local]
454   BOOL IsRunning();
455
456   [call_as(IsRunning)]
457   HRESULT RemoteIsRunning();
458
459   HRESULT LockRunning(
460     [in] BOOL fLock,
461     [in] BOOL fLastUnlockCloses);
462
463   HRESULT SetContainedObject(
464     [in] BOOL fContained);
465 }
466
467 /* GetObject is defined in wingdi.h as WINELIB_NAME_AW(GetObject),
468  * which resolves to a compilation failure if WINE_NO_UNICODE_MACROS is defined,
469  * but GetObject is used as a valid method name below, so we have
470  * to undefine it in that case */
471 cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
472 cpp_quote("#undef GetObject")
473 cpp_quote("#endif")
474
475 [
476   object,
477   uuid(00000010-0000-0000-C000-000000000046)
478 ]
479 interface IRunningObjectTable : IUnknown
480 {
481   typedef [unique] IRunningObjectTable *LPRUNNINGOBJECTTABLE;
482
483   HRESULT Register(
484     [in] DWORD grfFlags,
485     [in, unique] IUnknown *punkObject,
486     [in, unique] IMoniker *pmkObjectName,
487     [out] DWORD *pdwRegister);
488
489   HRESULT Revoke(
490     [in] DWORD dwRegister);
491
492   HRESULT IsRunning(
493     [in, unique] IMoniker *pmkObjectName);
494
495   HRESULT GetObject(
496     [in, unique] IMoniker *pmkObjectName,
497     [out] IUnknown **ppunkObject);
498
499   HRESULT NoteChangeTime(
500     [in] DWORD dwRegister,
501     [in] FILETIME *pfiletime);
502
503   HRESULT GetTimeOfLastChange(
504     [in, unique] IMoniker *pmkObjectName,
505     [out] FILETIME *pfiletime);
506
507   HRESULT EnumRunning(
508     [out] IEnumMoniker **ppenumMoniker);
509 }
510
511 [
512   object,
513   uuid(0000010c-0000-0000-C000-000000000046)
514 ]
515 interface IPersist : IUnknown
516 {
517   typedef [unique] IPersist *LPPERSIST;
518
519   HRESULT GetClassID(
520     [out] CLSID *pClassID);
521 }
522
523 [
524   object,
525   uuid(00000109-0000-0000-C000-000000000046),
526   pointer_default(unique)
527 ]
528 interface IPersistStream : IPersist
529 {
530   typedef [unique] IPersistStream *LPPERSISTSTREAM;
531
532   HRESULT IsDirty();
533
534   HRESULT Load(
535     [in, unique] IStream *pStm);
536
537   HRESULT Save(
538     [in, unique] IStream *pStm,
539     [in] BOOL fClearDirty);
540
541   HRESULT GetSizeMax(
542     [out] ULARGE_INTEGER *pcbSize);
543 }
544
545 [
546   object,
547   uuid(0000000f-0000-0000-C000-000000000046),
548   pointer_default(unique)
549 ]
550 interface IMoniker : IPersistStream
551 {
552   typedef [unique] IMoniker *LPMONIKER;
553
554   typedef enum tagMKSYS {
555     MKSYS_NONE             = 0,
556     MKSYS_GENERICCOMPOSITE = 1,
557     MKSYS_FILEMONIKER      = 2,
558     MKSYS_ANTIMONIKER      = 3,
559     MKSYS_ITEMMONIKER      = 4,
560     MKSYS_POINTERMONIKER   = 5,
561     /* MKSYS_URLMONIKER       = 6, */ /* defined in urlmon.idl */
562     MKSYS_CLASSMONIKER     = 7
563   } MKSYS;
564
565   typedef [v1_enum] enum tagMKREDUCE {
566     MKRREDUCE_ONE         = 3 << 16,
567     MKRREDUCE_TOUSER      = 2 << 16,
568     MKRREDUCE_THROUGHUSER = 1 << 16,
569     MKRREDUCE_ALL         = 0
570   } MKRREDUCE;
571
572   [local]
573   HRESULT BindToObject(
574     [in, unique] IBindCtx *pbc,
575     [in, unique] IMoniker *pmkToLeft,
576     [in] REFIID riidResult,
577     [out, iid_is(riidResult)] void **ppvResult);
578
579   [call_as(BindToObject)]
580   HRESULT RemoteBindToObject(
581     [in, unique] IBindCtx *pbc,
582     [in, unique] IMoniker *pmkToLeft,
583     [in] REFIID riidResult,
584     [out, iid_is(riidResult)] IUnknown **ppvResult);
585
586   [local]
587   HRESULT BindToStorage(
588     [in, unique] IBindCtx *pbc,
589     [in, unique] IMoniker *pmkToLeft,
590     [in] REFIID riid,
591     [out, iid_is(riid)] void **ppvObj);
592
593   [call_as(BindToStorage)]
594   HRESULT RemoteBindToStorage(
595     [in, unique] IBindCtx *pbc,
596     [in, unique] IMoniker *pmkToLeft,
597     [in] REFIID riid,
598     [out, iid_is(riid)] IUnknown **ppvObj);
599
600   HRESULT Reduce(
601     [in, unique] IBindCtx *pbc,
602     [in] DWORD dwReduceHowFar,
603     [in, out, unique] IMoniker **ppmkToLeft,
604     [out] IMoniker **ppmkReduced);
605
606   HRESULT ComposeWith(
607     [in, unique] IMoniker *pmkRight,
608     [in] BOOL fOnlyIfNotGeneric,
609     [out] IMoniker **ppmkComposite);
610
611   HRESULT Enum(
612     [in] BOOL fForward,
613     [out] IEnumMoniker **ppenumMoniker);
614
615   HRESULT IsEqual(
616     [in, unique] IMoniker *pmkOtherMoniker);
617
618   HRESULT Hash(
619     [out] DWORD *pdwHash);
620
621   HRESULT IsRunning(
622     [in, unique] IBindCtx *pbc,
623     [in, unique] IMoniker *pmkToLeft,
624     [in, unique] IMoniker *pmkNewlyRunning);
625
626   HRESULT GetTimeOfLastChange(
627     [in, unique] IBindCtx *pbc,
628     [in, unique] IMoniker *pmkToLeft,
629     [out] FILETIME *pFileTime);
630
631   HRESULT Inverse(
632     [out] IMoniker **ppmk);
633
634   HRESULT CommonPrefixWith(
635     [in, unique] IMoniker *pmkOther,
636     [out] IMoniker **ppmkPrefix);
637
638   HRESULT RelativePathTo(
639     [in, unique] IMoniker *pmkOther,
640     [out] IMoniker **ppmkRelPath);
641
642   HRESULT GetDisplayName(
643     [in, unique] IBindCtx *pbc,
644     [in, unique] IMoniker *pmkToLeft,
645     [out] LPOLESTR *ppszDisplayName);
646
647   HRESULT ParseDisplayName(
648     [in, unique] IBindCtx *pbc,
649     [in, unique] IMoniker *pmkToLeft,
650     [in] LPOLESTR pszDisplayName,
651     [out] ULONG *pchEaten,
652     [out] IMoniker **ppmkOut);
653
654   HRESULT IsSystemMoniker(
655     [out] DWORD *pdwMksys);
656 }
657
658 [
659   object,
660   uuid(f29f6bc0-5021-11ce-aa15-00006901293f),
661   pointer_default(unique)
662 ]
663 interface IROTData : IUnknown
664 {
665   HRESULT GetComparisonData(
666     [out, size_is(cbMax)] byte *pbData,
667     [in] ULONG cbMax,
668     [out] ULONG *pcbData);
669 }
670
671 [
672   object,
673   uuid(00000101-0000-0000-C000-000000000046),
674   pointer_default(unique)
675 ]
676 interface IEnumString : IUnknown
677 {
678   typedef [unique] IEnumString *LPENUMSTRING;
679
680   [local]
681   HRESULT Next(
682     [in] ULONG celt,
683     [out, size_is(celt), length_is(*pceltFetched)]
684     LPOLESTR *rgelt,
685     [out] ULONG *pceltFetched);
686
687   [call_as(Next)]
688   HRESULT RemoteNext(
689     [in] ULONG celt,
690     [out, size_is(celt), length_is(*pceltFetched)]
691     LPOLESTR *rgelt,
692     [out] ULONG *pceltFetched);
693
694   HRESULT Skip(
695     [in] ULONG celt);
696
697   HRESULT Reset();
698
699   HRESULT Clone(
700     [out] IEnumString **ppenum);
701 }
702
703 [
704   object,
705   uuid(00000140-0000-0000-C000-000000000046)
706 ]
707 interface IClassActivator : IUnknown
708 {
709   HRESULT GetClassObject(
710     [in] REFCLSID rclsid,
711     [in] DWORD dwClassContext,
712     [in] LCID locale,
713     [in] REFIID riid,
714     [out, iid_is(riid)] void **ppv);
715 }
716
717 /******************** Storage ********************/
718
719 [
720   object,
721   uuid(0c733a30-2a1c-11ce-ade5-00aa0044773d),
722   pointer_default(unique)
723 ]
724 interface ISequentialStream : IUnknown
725 {
726   [local]
727   HRESULT Read(
728     [out, size_is(cb), length_is(*pcbRead)]
729     void *pv,
730     [in] ULONG cb,
731     [out] ULONG *pcbRead);
732
733   [call_as(Read)]
734   HRESULT RemoteRead(
735     [out, size_is(cb), length_is(*pcbRead)]
736     byte *pv,
737     [in] ULONG cb,
738     [out] ULONG *pcbRead);
739
740   [local]
741   HRESULT Write(
742     [in, size_is(cb)] const void *pv,
743     [in] ULONG cb,
744     [out] ULONG *pcbWritten);
745
746   [call_as(Write)]
747   HRESULT RemoteWrite(
748     [in, size_is(cb)] const byte *pv,
749     [in] ULONG cb,
750     [out] ULONG *pcbWritten);
751 }
752
753 [
754   object,
755   uuid(0000000c-0000-0000-C000-000000000046),
756   pointer_default(unique)
757 ]
758 interface IStream : ISequentialStream
759 {
760   typedef [unique] IStream *LPSTREAM;
761
762   typedef struct tagSTATSTG {
763     LPOLESTR pwcsName;
764     DWORD type;
765     ULARGE_INTEGER cbSize;
766     FILETIME mtime;
767     FILETIME ctime;
768     FILETIME atime;
769     DWORD grfMode;
770     DWORD grfLocksSupported;
771     CLSID clsid;
772     DWORD grfStateBits;
773     DWORD reserved;
774   } STATSTG;
775
776   typedef enum tagSTGTY {
777     STGTY_STORAGE   = 1,
778     STGTY_STREAM    = 2,
779     STGTY_LOCKBYTES = 3,
780     STGTY_PROPERTY  = 4
781   } STGTY;
782
783   typedef enum tagSTREAM_SEEK {
784     STREAM_SEEK_SET = 0,
785     STREAM_SEEK_CUR = 1,
786     STREAM_SEEK_END = 2
787   } STREAM_SEEK;
788
789   /* these are defined in Linux's fcntl.h,
790    * undefine them to avoid conflicts */
791   cpp_quote("#undef LOCK_MAND")
792   cpp_quote("#undef LOCK_READ")
793   cpp_quote("#undef LOCK_WRITE")
794   cpp_quote("#undef LOCK_RW")
795
796   typedef enum tagLOCKTYPE {
797     LOCK_WRITE      = 1,
798     LOCK_EXCLUSIVE  = 2,
799     LOCK_ONLYONCE   = 4
800   } LOCKTYPE;
801
802   [local]
803   HRESULT Seek(
804     [in] LARGE_INTEGER dlibMove,
805     [in] DWORD dwOrigin,
806     [out] ULARGE_INTEGER *plibNewPosition);
807
808   [call_as(Seek)]
809   HRESULT RemoteSeek(
810     [in] LARGE_INTEGER dlibMove,
811     [in] DWORD dwOrigin,
812     [out] ULARGE_INTEGER *plibNewPosition);
813
814   HRESULT SetSize(
815     [in] ULARGE_INTEGER libNewSize);
816
817   [local]
818   HRESULT CopyTo(
819     [in, unique] IStream *pstm,
820     [in] ULARGE_INTEGER cb,
821     [out] ULARGE_INTEGER *pcbRead,
822     [out] ULARGE_INTEGER *pcbWritten);
823
824   [call_as(CopyTo)]
825   HRESULT RemoteCopyTo(
826     [in, unique] IStream *pstm,
827     [in] ULARGE_INTEGER cb,
828     [out] ULARGE_INTEGER *pcbRead,
829     [out] ULARGE_INTEGER *pcbWritten);
830
831   HRESULT Commit(
832     [in] DWORD grfCommitFlags);
833
834   HRESULT Revert();
835
836   HRESULT LockRegion(
837     [in] ULARGE_INTEGER libOffset,
838     [in] ULARGE_INTEGER cb,
839     [in] DWORD dwLockType);
840
841   HRESULT UnlockRegion(
842     [in] ULARGE_INTEGER libOffset,
843     [in] ULARGE_INTEGER cb,
844     [in] DWORD dwLockType);
845
846   HRESULT Stat(
847     [out] STATSTG *pstatstg,
848     [in] DWORD grfStatFlag);
849
850   HRESULT Clone(
851     [out] IStream **ppstm);
852 }
853
854 [
855   object,
856   uuid(0000000d-0000-0000-C000-000000000046),
857   pointer_default(unique)
858 ]
859 interface IEnumSTATSTG : IUnknown
860 {
861   typedef [unique] IEnumSTATSTG *LPENUMSTATSTG;
862
863   [local]
864   HRESULT Next(
865     [in] ULONG celt,
866     [out, size_is(celt), length_is(*pceltFetched)]
867     STATSTG *rgelt,
868     [out] ULONG *pceltFetched);
869
870   [call_as(Next)]
871   HRESULT RemoteNext(
872     [in] ULONG celt,
873     [out, size_is(celt), length_is(*pceltFetched)]
874     STATSTG *rgelt,
875     [out] ULONG *pceltFetched);
876
877   HRESULT Skip(
878     [in] ULONG celt);
879
880   HRESULT Reset();
881
882   HRESULT Clone(
883     [out] IEnumSTATSTG **ppenum);
884 }
885
886 [
887   object,
888   uuid(0000000b-0000-0000-C000-000000000046),
889   pointer_default(unique)
890 ]
891 interface IStorage : IUnknown
892 {
893   typedef [unique] IStorage *LPSTORAGE;
894
895   typedef struct tagRemSNB {
896     unsigned long ulCntStr;
897     unsigned long ulCntChar;
898     [size_is(ulCntChar)] OLECHAR rgString[];
899   } RemSNB;
900
901   typedef [unique] RemSNB *wireSNB;
902   typedef [wire_marshal(wireSNB)] OLECHAR **SNB;
903
904   HRESULT CreateStream(
905     [in] LPCOLESTR pwcsName,
906     [in] DWORD grfMode,
907     [in] DWORD reserved1,
908     [in] DWORD reserved2,
909     [out] IStream **ppstm);
910
911   [local]
912   HRESULT OpenStream(
913     [in] LPCOLESTR pwcsName,
914     [in, unique] void *reserved1,
915     [in] DWORD grfMode,
916     [in] DWORD reserved2,
917     [out] IStream **ppstm);
918
919   [call_as(OpenStream)]
920   HRESULT RemoteOpenStream(
921     [in] LPCOLESTR pwcsName,
922     [in] unsigned long cbReserved1,
923     [in, unique, size_is(cbReserved1)] byte *reserved1,
924     [in] DWORD grfMode,
925     [in] DWORD reserved2,
926     [out] IStream **ppstm);
927
928   HRESULT CreateStorage(
929     [in] LPCOLESTR pwcsName,
930     [in] DWORD grfMode,
931     [in] DWORD dwStgFmt,
932     [in] DWORD reserved2,
933     [out] IStorage **ppstg);
934
935   HRESULT OpenStorage(
936     [in, unique] LPCOLESTR pwcsName,
937     [in, unique] IStorage *pstgPriority,
938     [in] DWORD grfMode,
939     [in, unique] SNB snbExclude,
940     [in] DWORD reserved,
941     [out] IStorage **ppstg);
942
943   HRESULT CopyTo(
944     [in] DWORD ciidExclude,
945     [in, unique, size_is(ciidExclude)] const IID *rgiidExclude,
946     [in, unique] SNB snbExclude,
947     [in, unique] IStorage *pstgDest);
948
949   HRESULT MoveElementTo(
950     [in] LPCOLESTR pwcsName,
951     [in, unique] IStorage *pstgDest,
952     [in] LPCOLESTR pwcsNewName,
953     [in] DWORD grfFlags);
954
955   HRESULT Commit(
956     [in] DWORD grfCommitFlags);
957
958   HRESULT Revert();
959
960   [local]
961   HRESULT EnumElements(
962     [in] DWORD reserved1,
963     [in, unique, size_is(1)] void *reserved2,
964     [in] DWORD reserved3,
965     [out] IEnumSTATSTG **ppenum);
966
967   [call_as(EnumElements)]
968   HRESULT RemoteEnumElements(
969     [in] DWORD reserved1,
970     [in] unsigned long cbReserved2,
971     [in, unique, size_is(cbReserved2)] byte *reserved2,
972     [in] DWORD reserved3,
973     [out] IEnumSTATSTG **ppenum);
974
975   HRESULT DestroyElement(
976     [in] LPCOLESTR pwcsName);
977
978   HRESULT RenameElement(
979     [in] LPCOLESTR pwcsOldName,
980     [in] LPCOLESTR pwcsNewName);
981
982   HRESULT SetElementTimes(
983     [in, unique] LPCOLESTR pwcsName,
984     [in, unique] const FILETIME *pctime,
985     [in, unique] const FILETIME *patime,
986     [in, unique] const FILETIME *pmtime);
987
988   HRESULT SetClass(
989     [in] REFCLSID clsid);
990
991   HRESULT SetStateBits(
992     [in] DWORD grfStateBits,
993     [in] DWORD grfMask);
994
995   HRESULT Stat(
996     [out] STATSTG *pstatstg,
997     [in] DWORD grfStatFlag);
998 }
999
1000 [
1001   object,
1002   uuid(0000010b-0000-0000-C000-000000000046),
1003   pointer_default(unique)
1004 ]
1005 interface IPersistFile : IPersist
1006 {
1007   typedef [unique] IPersistFile *LPPERSISTFILE;
1008
1009   HRESULT IsDirty();
1010
1011   HRESULT Load(
1012     [in] LPCOLESTR pszFileName,
1013     [in] DWORD dwMode);
1014
1015   HRESULT Save(
1016     [in, unique] LPCOLESTR pszFileName,
1017     [in] BOOL fRemember);
1018
1019   HRESULT SaveCompleted(
1020     [in, unique] LPCOLESTR pszFileName);
1021
1022   HRESULT GetCurFile(
1023     [out] LPOLESTR *ppszFileName);
1024 }
1025
1026 [
1027   object,
1028   uuid(0000010a-0000-0000-C000-000000000046),
1029   pointer_default(unique)
1030 ]
1031 interface IPersistStorage : IPersist
1032 {
1033   typedef [unique] IPersistStorage *LPPERSISTSTORAGE;
1034
1035   HRESULT IsDirty();
1036
1037   HRESULT InitNew(
1038     [in, unique] IStorage *pStg);
1039
1040   HRESULT Load(
1041     [in, unique] IStorage *pStg);
1042
1043   HRESULT Save(
1044     [in, unique] IStorage *pStgSave,
1045     [in] BOOL fSameAsLoad);
1046
1047   HRESULT SaveCompleted(
1048     [in, unique] IStorage *pStgNew);
1049
1050   HRESULT HandsOffStorage();
1051 }
1052
1053 [
1054   object,
1055   uuid(00000012-0000-0000-C000-000000000046),
1056   pointer_default(unique)
1057 ]
1058 interface IRootStorage : IUnknown
1059 {
1060   typedef [unique] IRootStorage *LPROOTSTORAGE;
1061
1062   HRESULT SwitchToFile(
1063     [in] LPOLESTR pszFile);
1064 }
1065
1066 [
1067   object,
1068   uuid(0000000a-0000-0000-C000-000000000046),
1069   pointer_default(unique)
1070 ]
1071 interface ILockBytes : IUnknown
1072 {
1073   typedef [unique] ILockBytes *LPLOCKBYTES;
1074
1075   [local]
1076   HRESULT ReadAt(
1077     [in] ULARGE_INTEGER ulOffset,
1078     [out, size_is(cb), length_is(*pcbRead)]
1079     void *pv,
1080     [in] ULONG cb,
1081     [out] ULONG *pcbRead);
1082
1083   [call_as(ReadAt)]
1084   HRESULT RemoteReadAt(
1085     [in] ULARGE_INTEGER ulOffset,
1086     [out, size_is(cb), length_is(*pcbRead)]
1087     byte *pv,
1088     [in] ULONG cb,
1089     [out] ULONG *pcbRead);
1090
1091   [local]
1092   HRESULT WriteAt(
1093     [in] ULARGE_INTEGER ulOffset,
1094     [in, size_is(cb)] const void *pv,
1095     [in] ULONG cb,
1096     [out] ULONG *pcbWritten);
1097
1098   [call_as(WriteAt)]
1099   HRESULT RemoteWriteAt(
1100     [in] ULARGE_INTEGER ulOffset,
1101     [in, size_is(cb)] const byte *pv,
1102     [in] ULONG cb,
1103     [out] ULONG *pcbWritten);
1104
1105   HRESULT Flush();
1106
1107   HRESULT SetSize(
1108     [in] ULARGE_INTEGER cb);
1109
1110   HRESULT LockRegion(
1111     [in] ULARGE_INTEGER libOffset,
1112     [in] ULARGE_INTEGER cb,
1113     [in] DWORD dwLockType);
1114
1115   HRESULT UnlockRegion(
1116     [in] ULARGE_INTEGER libOffset,
1117     [in] ULARGE_INTEGER cb,
1118     [in] DWORD dwLockType);
1119
1120   HRESULT Stat(
1121     [out] STATSTG *pstatstg,
1122     [in] DWORD grfStatFlag);
1123 }
1124
1125 [
1126   object,
1127   uuid(99caf010-415e-11cf-8814-00aa00b569f5),
1128   pointer_default(unique)
1129 ]
1130 interface IFillLockBytes : IUnknown
1131 {
1132   [local]
1133   HRESULT FillAppend(
1134     [in, size_is(cb)] const void *pv,
1135     [in] ULONG cb,
1136     [out] ULONG *pcbWritten);
1137
1138   [call_as(FillAppend)]
1139   HRESULT RemoteFillAppend(
1140     [in, size_is(cb)] const byte *pv,
1141     [in] ULONG cb,
1142     [out] ULONG *pcbWritten);
1143
1144   [local]
1145   HRESULT FillAt(
1146     [in] ULARGE_INTEGER ulOffset,
1147     [in, size_is(cb)] const void *pv,
1148     [in] ULONG cb,
1149     [out] ULONG *pcbWritten);
1150
1151   [call_as(FillAt)]
1152   HRESULT RemoteFillAt(
1153     [in] ULARGE_INTEGER ulOffset,
1154     [in, size_is(cb)] const byte *pv,
1155     [in] ULONG cb,
1156     [out] ULONG *pcbWritten);
1157
1158   HRESULT SetFillSize(
1159     [in] ULARGE_INTEGER ulSize);
1160
1161   HRESULT Terminate(
1162     [in] BOOL bCanceled);
1163 }
1164
1165 [
1166   object,
1167   uuid(a9d758a0-4617-11cf-95fc-00aa00680db4),
1168   pointer_default(unique)
1169 ]
1170 interface IProgressNotify : IUnknown
1171 {
1172   HRESULT OnProgress(
1173     [in] DWORD dwProgressCurrent,
1174     [in] DWORD dwProgressMaximum,
1175     [in] BOOL fAccurate,
1176     [in] BOOL fOwner);
1177 }
1178
1179 [
1180   local,
1181   object,
1182   uuid(0e6d4d90-6738-11cf-9608-00aa00680db4),
1183   pointer_default(unique)
1184 ]
1185 interface ILayoutStorage : IUnknown
1186 {
1187   typedef struct tagStorageLayout {
1188     DWORD LayoutType;
1189     OLECHAR *pwcsElementName;
1190     LARGE_INTEGER cOffset;
1191     LARGE_INTEGER cBytes;
1192   } StorageLayout;
1193
1194   HRESULT LayoutScript(
1195     [in] StorageLayout *pStorageLayout,
1196     [in] DWORD nEntries,
1197     [in] DWORD glfInterleavedFlag);
1198
1199   HRESULT BeginMonitor();
1200
1201   HRESULT EndMonitor();
1202
1203   HRESULT ReLayoutDocfile(
1204     [in] OLECHAR *pwcsNewDfName);
1205
1206   HRESULT ReLayoutDocfileOnILockBytes(
1207     [in] ILockBytes *pILockBytes);
1208 }
1209
1210 [
1211     object,
1212     uuid(30f3d47a-6447-11d1-8e3c-00c04fb9386d)
1213 ]
1214 interface IBlockingLock : IUnknown
1215 {
1216     HRESULT Lock(
1217         [in] DWORD dwTimeout);
1218
1219     HRESULT Unlock();
1220 }
1221
1222
1223 [
1224     object,
1225     uuid(bc0bf6ae-8878-11d1-83e9-00c04fc2c6d4)
1226 ]
1227 interface ITimeAndNoticeControl : IUnknown
1228 {
1229     HRESULT SuppressChanges(
1230         [in] DWORD res1,
1231         [in] DWORD res2);
1232
1233 }
1234
1235
1236
1237 [
1238     object,
1239     uuid(8d19c834-8879-11d1-83e9-00c04fc2c6d4)
1240 ]
1241 interface IOplockStorage: IUnknown
1242 {
1243     HRESULT CreateStorageEx(
1244         [in] LPCWSTR pwcsName,
1245         [in] DWORD grfMode,
1246         [in] DWORD stgfmt,
1247         [in] DWORD grfAttrs,
1248         [in] REFIID riid,
1249         [out, iid_is(riid)] void **ppstgOpen);
1250
1251     HRESULT OpenStorageEx(
1252         [in] LPCWSTR pwcsName,
1253         [in] DWORD grfMode,
1254         [in] DWORD stgfmt,
1255         [in] DWORD grfAttrs,
1256         [in] REFIID riid,
1257         [out, iid_is(riid)] void **ppstgOpen);
1258 }
1259
1260 /******************** Data Object ********************/
1261
1262 [
1263   object,
1264   uuid(00000103-0000-0000-C000-000000000046),
1265   pointer_default(unique)
1266 ]
1267 interface IEnumFORMATETC : IUnknown
1268 {
1269   typedef [unique] IEnumFORMATETC *LPENUMFORMATETC;
1270
1271   typedef struct tagDVTARGETDEVICE {
1272     DWORD tdSize;
1273     WORD tdDriverNameOffset;
1274     WORD tdDeviceNameOffset;
1275     WORD tdPortNameOffset;
1276     WORD tdExtDevmodeOffset;
1277     [size_is(tdSize - sizeof(DWORD) - 4*sizeof(WORD))]
1278     BYTE tdData[];
1279   } DVTARGETDEVICE;
1280
1281   typedef CLIPFORMAT *LPCLIPFORMAT;
1282
1283   typedef struct tagFORMATETC {
1284     CLIPFORMAT cfFormat;
1285     [unique] DVTARGETDEVICE *ptd;
1286     DWORD dwAspect;
1287     LONG lindex;
1288     DWORD tymed;
1289   } FORMATETC, *LPFORMATETC;
1290
1291   [local]
1292   HRESULT Next(
1293     [in] ULONG celt,
1294     [out, size_is(celt), length_is(*pceltFetched)]
1295     FORMATETC *rgelt,
1296     [out] ULONG *pceltFetched);
1297
1298   [call_as(Next)]
1299   HRESULT RemoteNext(
1300     [in] ULONG celt,
1301     [out, size_is(celt), length_is(*pceltFetched)]
1302     FORMATETC *rgelt,
1303     [out] ULONG *pceltFetched);
1304
1305   HRESULT Skip(
1306     [in] ULONG celt);
1307
1308   HRESULT Reset();
1309
1310   HRESULT Clone(
1311     [out] IEnumFORMATETC **ppenum);
1312 }
1313
1314 [
1315   object,
1316   uuid(00000105-0000-0000-C000-000000000046),
1317   pointer_default(unique)
1318 ]
1319 interface IEnumSTATDATA : IUnknown
1320 {
1321   typedef [unique] IEnumSTATDATA *LPENUMSTATDATA;
1322
1323   typedef enum tagADVF {
1324     ADVF_NODATA            = 1,
1325     ADVF_PRIMEFIRST        = 2,
1326     ADVF_ONLYONCE          = 4,
1327     ADVF_DATAONSTOP        = 64,
1328     ADVFCACHE_NOHANDLER    = 8,
1329     ADVFCACHE_FORCEBUILTIN = 16,
1330     ADVFCACHE_ONSAVE       = 32
1331   } ADVF;
1332
1333   typedef struct tagSTATDATA
1334   {
1335     FORMATETC formatetc;
1336     DWORD advf;
1337     [unique] IAdviseSink *pAdvSink;
1338     DWORD dwConnection;
1339   } STATDATA, *LPSTATDATA;
1340
1341   [local]
1342   HRESULT Next(
1343     [in] ULONG celt,
1344     [out, size_is(celt), length_is(*pceltFetched)]
1345     STATDATA *rgelt,
1346     [out] ULONG *pceltFetched);
1347
1348   [call_as(Next)]
1349   HRESULT RemoteNext(
1350     [in] ULONG celt,
1351     [out, size_is(celt), length_is(*pceltFetched)]
1352     STATDATA *rgelt,
1353     [out] ULONG *pceltFetched);
1354
1355   HRESULT Skip(
1356     [in] ULONG celt);
1357
1358   HRESULT Reset();
1359
1360   HRESULT Clone(
1361     [out] IEnumSTATDATA **ppenum);
1362 }
1363
1364 [
1365   object,
1366   uuid(0000010f-0000-0000-C000-000000000046),
1367   pointer_default(unique)
1368 ]
1369 interface IAdviseSink : IUnknown
1370 {
1371   typedef IAdviseSink *LPADVISESINK;
1372
1373   typedef [v1_enum] enum tagTYMED {
1374     TYMED_HGLOBAL  = 1,
1375     TYMED_FILE     = 2,
1376     TYMED_ISTREAM  = 4,
1377     TYMED_ISTORAGE = 8,
1378     TYMED_GDI      = 16,
1379     TYMED_MFPICT   = 32,
1380     TYMED_ENHMF    = 64,
1381     TYMED_NULL     = 0
1382   } TYMED;
1383
1384   typedef struct tagRemSTGMEDIUM {
1385     DWORD tymed;
1386     DWORD dwHandleType;
1387     unsigned long pData;
1388     unsigned long pUnkForRelease;
1389     unsigned long cbData;
1390     [size_is(cbData)] byte data[];
1391   } RemSTGMEDIUM;
1392
1393   typedef struct tagSTGMEDIUM {
1394     DWORD tymed;
1395     [switch_is(tymed)] union {
1396     [case(TYMED_GDI)]      HBITMAP hBitmap;
1397     [case(TYMED_MFPICT)]   HMETAFILEPICT hMetaFilePict;
1398     [case(TYMED_ENHMF)]    HENHMETAFILE hEnhMetaFile;
1399     [case(TYMED_HGLOBAL)]  HGLOBAL hGlobal;
1400     [case(TYMED_FILE)]     LPOLESTR lpszFileName;
1401     [case(TYMED_ISTREAM)]  IStream *pstm;
1402     [case(TYMED_ISTORAGE)] IStorage *pstg;
1403     [default]              ;
1404     } DUMMYUNIONNAME;
1405     [unique] IUnknown *pUnkForRelease;
1406   } uSTGMEDIUM;
1407
1408 /* copied from wingdi.h */
1409 #define OBJ_PEN             1
1410 #define OBJ_BRUSH           2
1411 #define OBJ_DC              3
1412 #define OBJ_METADC          4
1413 #define OBJ_PAL             5
1414 #define OBJ_FONT            6
1415 #define OBJ_BITMAP          7
1416 #define OBJ_REGION          8
1417 #define OBJ_METAFILE        9
1418 #define OBJ_MEMDC           10
1419 #define OBJ_EXTPEN          11
1420 #define OBJ_ENHMETADC       12
1421 #define OBJ_ENHMETAFILE     13
1422
1423   typedef union _GDI_OBJECT switch(DWORD ObjectType) u {
1424     case OBJ_BITMAP: wireHBITMAP hBitmap;
1425     case OBJ_PAL:    wireHPALETTE hPalette;
1426     default:         wireHGLOBAL hGeneric;
1427   } GDI_OBJECT;
1428
1429   typedef struct _userSTGMEDIUM {
1430     union switch(DWORD tymed) u {
1431     case TYMED_NULL:     ;
1432     case TYMED_MFPICT:   wireHMETAFILEPICT hMetaFilePict;
1433     case TYMED_ENHMF:    wireHENHMETAFILE hHEnhMetaFile;
1434     case TYMED_GDI:      GDI_OBJECT *hGdiHandle;
1435     case TYMED_HGLOBAL:  wireHGLOBAL hGlobal;
1436     case TYMED_FILE:     LPOLESTR lpszFileName;
1437     case TYMED_ISTREAM:  BYTE_BLOB *pstm;
1438     case TYMED_ISTORAGE: BYTE_BLOB *pstg;
1439     } DUMMYUNIONNAME;
1440     IUnknown *pUnkForRelease;
1441   } userSTGMEDIUM;
1442
1443   typedef [unique] userSTGMEDIUM *wireSTGMEDIUM;
1444   typedef [wire_marshal(wireSTGMEDIUM)] uSTGMEDIUM STGMEDIUM;
1445
1446   typedef [unique] userSTGMEDIUM *wireASYNC_STGMEDIUM;
1447   typedef [wire_marshal(wireASYNC_STGMEDIUM)] STGMEDIUM ASYNC_STGMEDIUM;
1448
1449   typedef STGMEDIUM *LPSTGMEDIUM;
1450
1451   typedef struct _userFLAG_STGMEDIUM {
1452     long ContextFlags;
1453     long fPassOwnership;
1454     userSTGMEDIUM Stgmed;
1455   } userFLAG_STGMEDIUM;
1456
1457   typedef [unique] userFLAG_STGMEDIUM *wireFLAG_STGMEDIUM;
1458
1459   typedef [wire_marshal(wireFLAG_STGMEDIUM)] struct _FLAG_STGMEDIUM {
1460     long ContextFlags;
1461     long fPassOwnership;
1462     STGMEDIUM Stgmed;
1463   } FLAG_STGMEDIUM;
1464
1465   [local]
1466   void OnDataChange(
1467     [in, unique] FORMATETC *pFormatetc,
1468     [in, unique] STGMEDIUM *pStgmed);
1469
1470   [call_as(OnDataChange)]
1471   HRESULT  RemoteOnDataChange(
1472     [in, unique] FORMATETC *pFormatetc,
1473     [in, unique] ASYNC_STGMEDIUM *pStgmed);
1474
1475   [local]
1476   void OnViewChange(
1477     [in] DWORD dwAspect,
1478     [in] LONG lindex);
1479
1480   [call_as(OnViewChange)]
1481   HRESULT RemoteOnViewChange(
1482     [in] DWORD dwAspect,
1483     [in] LONG lindex);
1484
1485   [local]
1486   void OnRename(
1487     [in] IMoniker *pmk);
1488
1489   [call_as(OnRename)]
1490   HRESULT RemoteOnRename(
1491     [in] IMoniker *pmk);
1492
1493   [local]
1494   void OnSave();
1495
1496   [call_as(OnSave)]
1497   HRESULT RemoteOnSave();
1498
1499   [local]
1500   void OnClose();
1501
1502   [call_as(OnClose)]
1503   HRESULT RemoteOnClose();
1504 }
1505
1506 [
1507   object,
1508   uuid(00000125-0000-0000-C000-000000000046),
1509   pointer_default(unique)
1510 ]
1511 interface IAdviseSink2 : IAdviseSink
1512 {
1513   typedef [unique] IAdviseSink2 *LPADVISESINK2;
1514
1515   [local]
1516   void OnLinkSrcChange(
1517     [in, unique] IMoniker *pmk);
1518
1519   [call_as(OnLinkSrcChange)]
1520   HRESULT RemoteOnLinkSrcChange(
1521     [in, unique] IMoniker *pmk);
1522 }
1523
1524 [
1525   object,
1526   uuid(0000010e-0000-0000-C000-000000000046),
1527   pointer_default(unique)
1528 ]
1529 interface IDataObject : IUnknown
1530 {
1531   typedef [unique] IDataObject *LPDATAOBJECT;
1532
1533   typedef enum tagDATADIR {
1534     DATADIR_GET = 1,
1535     DATADIR_SET = 2
1536   } DATADIR;
1537
1538   [local]
1539   HRESULT GetData(
1540     [in, unique] FORMATETC *pformatetcIn,
1541     [out] STGMEDIUM *pmedium);
1542
1543   [call_as(GetData)]
1544   HRESULT RemoteGetData(
1545     [in, unique] FORMATETC *pformatetcIn,
1546     [out] STGMEDIUM *pRemoteMedium);
1547
1548   [local]
1549   HRESULT GetDataHere(
1550     [in, unique] FORMATETC *pformatetc,
1551     [in, out] STGMEDIUM *pmedium);
1552
1553   [call_as(GetDataHere)]
1554   HRESULT RemoteGetDataHere(
1555     [in, unique] FORMATETC *pformatetc,
1556     [in, out] STGMEDIUM *pRemoteMedium);
1557
1558   HRESULT QueryGetData(
1559     [in, unique] FORMATETC *pformatetc);
1560
1561   HRESULT GetCanonicalFormatEtc(
1562     [in, unique] FORMATETC *pformatectIn,
1563     [out] FORMATETC *pformatetcOut);
1564
1565   [local]
1566   HRESULT SetData(
1567     [in, unique] FORMATETC *pformatetc,
1568     [in, unique] STGMEDIUM *pmedium,
1569     [in] BOOL fRelease);
1570
1571   [call_as(SetData)]
1572   HRESULT RemoteSetData(
1573     [in, unique] FORMATETC *pformatetc,
1574     [in, unique] FLAG_STGMEDIUM *pmedium,
1575     [in] BOOL fRelease);
1576
1577   HRESULT EnumFormatEtc(
1578     [in] DWORD dwDirection,
1579     [out] IEnumFORMATETC **ppenumFormatEtc);
1580
1581   HRESULT DAdvise(
1582     [in] FORMATETC *pformatetc,
1583     [in] DWORD advf,
1584     [in, unique] IAdviseSink *pAdvSink,
1585     [out] DWORD *pdwConnection);
1586
1587   HRESULT DUnadvise(
1588     [in] DWORD dwConnection);
1589
1590   HRESULT EnumDAdvise(
1591     [out] IEnumSTATDATA **ppenumAdvise);
1592 }
1593
1594 [
1595   local,
1596   object,
1597   uuid(00000110-0000-0000-C000-000000000046)
1598 ]
1599 interface IDataAdviseHolder : IUnknown
1600 {
1601   typedef [unique] IDataAdviseHolder *LPDATAADVISEHOLDER;
1602
1603   HRESULT Advise(
1604     [in, unique] IDataObject *pDataObject,
1605     [in, unique] FORMATETC *pFetc,
1606     [in] DWORD advf,
1607     [in, unique] IAdviseSink *pAdvise,
1608     [out] DWORD *pdwConnection);
1609
1610   HRESULT Unadvise(
1611     [in] DWORD dwConnection);
1612
1613   HRESULT EnumAdvise(
1614     [out] IEnumSTATDATA **ppenumAdvise);
1615
1616   HRESULT SendOnDataChange(
1617     [in, unique] IDataObject *pDataObject,
1618     [in] DWORD dwReserved,
1619     [in] DWORD advf);
1620 }
1621
1622 /******************** Remoting ********************/
1623
1624 [
1625   local,
1626   object,
1627   uuid(00000016-0000-0000-C000-000000000046)
1628 ]
1629 interface IMessageFilter : IUnknown
1630 {
1631   typedef [unique] IMessageFilter *LPMESSAGEFILTER;
1632
1633   typedef enum tagCALLTYPE {
1634     CALLTYPE_TOPLEVEL = 1,
1635     CALLTYPE_NESTED   = 2,
1636     CALLTYPE_ASYNC    = 3,
1637     CALLTYPE_TOPLEVEL_CALLPENDING = 4,
1638     CALLTYPE_ASYNC_CALLPENDING    = 5
1639   } CALLTYPE;
1640
1641   typedef enum tagSERVERCALL {
1642     SERVERCALL_ISHANDLED  = 0,
1643     SERVERCALL_REJECTED   = 1,
1644     SERVERCALL_RETRYLATER = 2
1645   } SERVERCALL;
1646
1647   typedef enum tagPENDINGTYPE {
1648     PENDINGTYPE_TOPLEVEL = 1,
1649     PENDINGTYPE_NESTED   = 2
1650   } PENDINGTYPE;
1651
1652   typedef enum tagPENDINGMSG {
1653     PENDINGMSG_CANCELCALL     = 0,
1654     PENDINGMSG_WAITNOPROCESS  = 1,
1655     PENDINGMSG_WAITDEFPROCESS = 2
1656   } PENDINGMSG;
1657
1658   typedef struct tagINTERFACEINFO {
1659     IUnknown *pUnk;
1660     IID iid;
1661     WORD wMethod;
1662   } INTERFACEINFO, *LPINTERFACEINFO;
1663
1664   DWORD HandleInComingCall(
1665     [in] DWORD dwCallType,
1666     [in] HTASK htaskCaller,
1667     [in] DWORD dwTickCount,
1668     [in] LPINTERFACEINFO lpInterfaceInfo);
1669
1670   DWORD RetryRejectedCall(
1671     [in] HTASK htaskCallee,
1672     [in] DWORD dwTickCount,
1673     [in] DWORD dwRejectType);
1674
1675   DWORD MessagePending(
1676     [in] HTASK htaskCallee,
1677     [in] DWORD dwTickCount,
1678     [in] DWORD dwPendingType);
1679 }
1680
1681 [
1682   local,
1683   object,
1684   uuid(D5F56B60-593B-101A-B569-08002B2DBF7A)
1685 ]
1686 interface IRpcChannelBuffer : IUnknown
1687 {
1688   typedef [unique] IRpcChannelBuffer *LPRPCCHANNELBUFFER;
1689
1690   typedef unsigned long RPCOLEDATAREP;
1691
1692   typedef struct tagRPCOLEMESSAGE {
1693     void *reserved1;
1694     RPCOLEDATAREP dataRepresentation;
1695     void *Buffer;
1696     ULONG cbBuffer;
1697     ULONG iMethod;
1698     void *reserved2[5];
1699     ULONG rpcFlags;
1700   } RPCOLEMESSAGE;
1701
1702   typedef RPCOLEMESSAGE *PRPCOLEMESSAGE;
1703
1704   HRESULT GetBuffer(
1705     [in] RPCOLEMESSAGE *pMessage,
1706     [in] REFIID riid);
1707
1708   HRESULT SendReceive(
1709     [in,out] RPCOLEMESSAGE *pMessage,
1710     [out] ULONG *pStatus);
1711
1712   HRESULT FreeBuffer(
1713     [in] RPCOLEMESSAGE *pMessage);
1714
1715   HRESULT GetDestCtx(
1716     [out] DWORD *pdwDestContext,
1717     [out] void **ppvDestContext);
1718
1719   HRESULT IsConnected();
1720 }
1721
1722 [
1723   local,
1724   object,
1725   uuid(594f31d0-7f19-11d0-b194-00a0c90dc8bf)
1726 ]
1727 interface IRpcChannelBuffer2 : IRpcChannelBuffer
1728 {
1729   typedef [unique] IRpcChannelBuffer2 *LPRPCCHANNELBUFFER2;
1730
1731   HRESULT GetProtocolVersion(
1732     [in,out] DWORD *pdwVersion);
1733 }
1734
1735 [
1736   local,
1737   object,
1738   uuid(25B15600-0115-11d0-BF0D-00AA00B8DFD2)
1739 ]
1740 interface IRpcChannelBuffer3 : IRpcChannelBuffer2
1741 {
1742   typedef [unique] IRpcChannelBuffer3 *LPRPCCHANNELBUFFER3;
1743
1744   HRESULT Send(
1745     [in,out] RPCOLEMESSAGE *pMsg,
1746     [out] ULONG *pulStatus);
1747
1748   HRESULT Receive(
1749     [in,out] RPCOLEMESSAGE *pMsg,
1750     [in] ULONG ulSize,
1751     [out] ULONG *pulStatus);
1752
1753   HRESULT Cancel(
1754     [in] RPCOLEMESSAGE *pMsg);
1755
1756   HRESULT GetCallContext(
1757     [in] RPCOLEMESSAGE *pMsg,
1758     [in] REFIID riid,
1759     [out] void **pInterface);
1760
1761   HRESULT GetDestCtxEx(
1762     [in] RPCOLEMESSAGE *pMsg,
1763     [out] DWORD *pdwDestContext,
1764     [out] void **ppvDestContext);
1765
1766   HRESULT GetState(
1767     [in] RPCOLEMESSAGE *pMsg,
1768     [out] DWORD *pState);
1769
1770   HRESULT RegisterAsync(
1771     [in] RPCOLEMESSAGE *pMsg,
1772     [in] IAsyncManager *pAsyncMgr);
1773 }
1774
1775 [
1776     local,
1777     object,
1778     uuid(a5029fb6-3c34-11d1-9c99-00c04fb998aa),
1779     pointer_default(unique)
1780 ]
1781 interface IAsyncRpcChannelBuffer : IRpcChannelBuffer2
1782 {
1783     HRESULT Send(
1784         [in, out] RPCOLEMESSAGE *pMsg,
1785         [in] ISynchronize *pSync,
1786         [out] ULONG *pulStatus);
1787
1788     HRESULT Receive(
1789         [in, out] RPCOLEMESSAGE *pMsg,
1790         [out] ULONG *pulStatus);
1791
1792     HRESULT GetDestCtxEx(
1793         [in] RPCOLEMESSAGE *pMsg,
1794         [out] DWORD *pdwDestContext,
1795         [out] void **ppvDestContext);
1796 }
1797
1798 [
1799     local,
1800     object,
1801     uuid(58a08519-24c8-4935-b482-3fd823333a4f)
1802 ]
1803 interface IRpcSyntaxNegotiate : IUnknown
1804 {
1805     HRESULT NegotiateSyntax(
1806         [in, out] RPCOLEMESSAGE *pMsg);
1807 }
1808
1809 [
1810   local,
1811   object,
1812   uuid(D5F56A34-593B-101A-B569-08002B2DBF7A)
1813 ]
1814 interface IRpcProxyBuffer : IUnknown
1815 {
1816   typedef [unique] IRpcProxyBuffer *LPRPCPROXYBUFFER;
1817
1818   HRESULT Connect(
1819     [in, unique] IRpcChannelBuffer *pRpcChannelBuffer);
1820
1821   void Disconnect();
1822 }
1823
1824 [
1825   local,
1826   object,
1827   uuid(D5F56AFC-593B-101A-B569-08002B2DBF7A)
1828 ]
1829 interface IRpcStubBuffer : IUnknown
1830 {
1831   typedef [unique] IRpcStubBuffer *LPRPCSTUBBUFFER;
1832
1833   HRESULT Connect(
1834     [in] IUnknown *pUnkServer);
1835
1836   void Disconnect();
1837
1838   HRESULT Invoke(
1839     [in] RPCOLEMESSAGE *_prpcmsg,
1840     [in] IRpcChannelBuffer *_pRpcChannelBuffer);
1841
1842   IRpcStubBuffer *IsIIDSupported(
1843     [in] REFIID riid);
1844
1845   ULONG CountRefs();
1846
1847   HRESULT DebugServerQueryInterface(
1848     void **ppv);
1849
1850   void DebugServerRelease(
1851     void *pv);
1852 }
1853
1854 [
1855   local,
1856   object,
1857   uuid(D5F569D0-593B-101A-B569-08002B2DBF7A)
1858 ]
1859 interface IPSFactoryBuffer : IUnknown
1860 {
1861   typedef [unique] IPSFactoryBuffer *LPPSFACTORYBUFFER;
1862
1863   HRESULT CreateProxy(
1864     [in] IUnknown *pUnkOuter,
1865     [in] REFIID riid,
1866     [out] IRpcProxyBuffer **ppProxy,
1867     [out] void **ppv);
1868
1869   HRESULT CreateStub(
1870     [in] REFIID riid,
1871     [in, unique] IUnknown *pUnkServer,
1872     [out] IRpcStubBuffer **ppStub);
1873 }
1874
1875 [
1876   local,
1877   object,
1878   uuid(1008c4a0-7613-11cf-9af1-0020af6e72f4)
1879 ]
1880 interface IChannelHook : IUnknown
1881 {
1882   typedef [unique] IChannelHook *LPCHANNELHOOK;
1883
1884   typedef struct SChannelHookCallInfo {
1885     IID iid;
1886     DWORD cbSize;
1887     GUID uCausality;
1888     DWORD dwServerPid;
1889     DWORD iMethod;
1890     void *pObject;
1891   } SChannelHookCallInfo;
1892
1893   void ClientGetSize(
1894     [in] REFGUID uExtent,
1895     [in] REFIID riid,
1896     [out] ULONG *pDataSize);
1897
1898   void ClientFillBuffer(
1899     [in] REFGUID uExtent,
1900     [in] REFIID riid,
1901     [in, out] ULONG *pDataSize,
1902     [in] void *pDataBuffer);
1903
1904   void ClientNotify(
1905     [in] REFGUID uExtent,
1906     [in] REFIID riid,
1907     [in] ULONG cbDataSize,
1908     [in] void *pDataBuffer,
1909     [in] DWORD lDataRep,
1910     [in] HRESULT hrFault);
1911
1912   void ServerNotify(
1913     [in] REFGUID uExtent,
1914     [in] REFIID riid,
1915     [in] ULONG cbDataSize,
1916     [in] void *pDataBuffer,
1917     [in] DWORD lDataRep);
1918
1919   void ServerGetSize(
1920     [in] REFGUID uExtent,
1921     [in] REFIID riid,
1922     [in] HRESULT hrFault,
1923     [out] ULONG *pDataSize);
1924
1925   void ServerFillBuffer(
1926     [in] REFGUID uExtent,
1927     [in] REFIID riid,
1928     [in, out] ULONG *pDataSize,
1929     [in] void *pDataBuffer,
1930     [in] HRESULT hrFault );
1931 }
1932
1933 extern const FMTID FMTID_SummaryInformation;
1934 extern const FMTID FMTID_DocSummaryInformation;
1935 extern const FMTID FMTID_UserDefinedProperties;
1936
1937
1938 /******************** Connection Points ********************/
1939 /* FIXME */
1940
1941 /******************** DCOM ********************/
1942
1943 [
1944   local,
1945   object,
1946   uuid(0000013D-0000-0000-C000-000000000046)
1947 ]
1948 interface IClientSecurity : IUnknown
1949 {
1950   typedef struct tagSOLE_AUTHENTICATION_SERVICE {
1951     DWORD dwAuthnSvc;
1952     DWORD dwAuthzSvc;
1953     OLECHAR *pPrincipalName;
1954     HRESULT hr;
1955   } SOLE_AUTHENTICATION_SERVICE;
1956
1957   typedef SOLE_AUTHENTICATION_SERVICE *PSOLE_AUTHENTICATION_SERVICE;
1958
1959   typedef struct tagSOLE_AUTHENTICATION_INFO {
1960     DWORD dwAuthnSvc;
1961     DWORD dwAuthzSvc;
1962     void *pAuthInfo;
1963   } SOLE_AUTHENTICATION_INFO;
1964
1965   const OLECHAR *COLE_DEFAULT_PRINCIPAL = (OLECHAR*) -1;
1966   const void *COLE_DEFAULT_AUTHINFO = (void*) -1;
1967
1968   typedef struct tagSOLE_AUTHENTICATION_LIST {
1969     DWORD cAuthInfo;
1970     SOLE_AUTHENTICATION_INFO *aAuthInfo;
1971   } SOLE_AUTHENTICATION_LIST;
1972
1973   typedef enum tagEOLE_AUTHENTICATION_CAPABILITIES {
1974     EOAC_NONE               = 0x0,
1975     EOAC_MUTUAL_AUTH        = 0x1,
1976     EOAC_SECURE_REFS        = 0x2, /* CoInitializeSecurity only */
1977     EOAC_ACCESS_CONTROL     = 0x4, /* CoInitializeSecurity only */
1978     EOAC_APPID              = 0x8, /* CoInitializeSecurity only */
1979     EOAC_DYNAMIC            = 0x10, /* CoInitializeSecurity only */
1980     EOAC_STATIC_CLOAKING    = 0x20,
1981     EOAC_DYNAMIC_CLOAKING   = 0x40,
1982     EOAC_ANY_AUTHORITY      = 0x80,
1983     EOAC_MAKE_FULLSIC       = 0x100,
1984     EOAC_REQUIRE_FULLSIC    = 0x200, /* CoInitializeSecurity only */
1985     EOAC_AUTO_IMPERSONATE   = 0x400, /* CoInitializeSecurity only */
1986     EOAC_DEFAULT            = 0x800,
1987     EOAC_DISABLE_AAA        = 0x1000, /* CoInitializeSecurity only */
1988     EOAC_NO_CUSTOM_MARSHAL  = 0x2000, /* CoInitializeSecurity only */
1989   } EOLE_AUTHENTICATION_CAPABILITIES;
1990
1991   HRESULT QueryBlanket(
1992     [in] IUnknown *pProxy,
1993     [out] DWORD *pAuthnSvc,
1994     [out] DWORD *pAuthzSvc,
1995     [out] OLECHAR **pServerPrincName,
1996     [out] DWORD *pAuthnLevel,
1997     [out] DWORD *pImpLevel,
1998     [out] void **pAuthInfo,
1999     [out] DWORD *pCapabilities);
2000
2001   HRESULT SetBlanket(
2002     [in] IUnknown *pProxy,
2003     [in] DWORD AuthnSvc,
2004     [in] DWORD AuthzSvc,
2005     [in] OLECHAR *pServerPrincName,
2006     [in] DWORD AuthnLevel,
2007     [in] DWORD ImpLevel,
2008     [in] void *pAuthInfo,
2009     [in] DWORD Capabilities);
2010
2011   HRESULT CopyProxy(
2012     [in] IUnknown *pProxy,
2013     [out] IUnknown **ppCopy);
2014 }
2015
2016 [
2017   local,
2018   object,
2019   uuid(0000013E-0000-0000-C000-000000000046)
2020 ]
2021 interface IServerSecurity : IUnknown
2022 {
2023   HRESULT QueryBlanket(
2024     [out] DWORD *pAuthnSvc,
2025     [out] DWORD *pAuthzSvc,
2026     [out] OLECHAR **pServerPrincName,
2027     [out] DWORD *pAuthnLevel,
2028     [out] DWORD *pImpLevel,
2029     [out] void **pPrivs,
2030     [out] DWORD *pCapabilities);
2031
2032   HRESULT ImpersonateClient();
2033
2034   HRESULT RevertToSelf();
2035
2036   BOOL IsImpersonating();
2037 }
2038
2039 [
2040   local,
2041   object,
2042   uuid(00000024-0000-0000-C000-000000000046)
2043 ]
2044 interface IAsyncSetup : IUnknown
2045 {
2046   HRESULT GetAsyncManager(
2047     [in] REFIID riid,
2048     [in] IUnknown *pOuter,
2049     [in] DWORD dwFlags,
2050     [out] IUnknown **ppInner,
2051     [out] IAsyncManager **ppAsyncMgr);
2052 }
2053
2054 [
2055     object,
2056     uuid(0e6d4d92-6738-11cf-9608-00aa00680db4)
2057 ]
2058 interface IDirectWriterLock : IUnknown
2059 {
2060     HRESULT WaitForWriteAccess(
2061         [in] DWORD dwTimeout);
2062
2063     HRESULT ReleaseWriteAccess();
2064
2065     HRESULT HaveWriteAccess();
2066 }
2067
2068 [
2069     object,
2070     uuid(00000030-0000-0000-C000-000000000046)
2071 ]
2072
2073 interface ISynchronize : IUnknown
2074 {
2075     HRESULT Wait(
2076         [in] DWORD dwFlags,
2077         [in] DWORD dwMilliseconds);
2078
2079     HRESULT Signal();
2080
2081     HRESULT Reset();
2082 }
2083
2084
2085 [
2086     local,
2087     object,
2088     uuid(00000031-0000-0000-C000-000000000046)
2089 ]
2090 interface ISynchronizeHandle : IUnknown
2091 {
2092     HRESULT GetHandle(
2093         [out] HANDLE *ph);
2094 }
2095
2096
2097 [
2098     local,
2099     object,
2100     uuid(00000032-0000-0000-C000-000000000046)
2101 ]
2102 interface ISynchronizeEvent : ISynchronizeHandle
2103 {
2104     HRESULT SetEventHandle(
2105         [in] HANDLE *ph);
2106 }
2107
2108
2109 [
2110     local,
2111     object,
2112     uuid(00000033-0000-0000-C000-000000000046)
2113 ]
2114 interface ISynchronizeContainer : IUnknown
2115 {
2116     HRESULT AddSynchronize(
2117         [in] ISynchronize *pSync);
2118
2119     HRESULT WaitMultiple(
2120         [in] DWORD dwFlags,
2121         [in] DWORD dwTimeOut,
2122         [out] ISynchronize **ppSync);
2123 }
2124
2125 [
2126     local,
2127     object,
2128     uuid(00000025-0000-0000-C000-000000000046)
2129 ]
2130 interface ISynchronizeMutex : ISynchronize
2131 {
2132     HRESULT ReleaseMutex();
2133 }
2134
2135 [
2136     local,
2137     object,
2138     uuid(00000029-0000-0000-C000-000000000046)
2139 ]
2140
2141 interface ICancelMethodCalls : IUnknown
2142 {
2143     typedef [unique] ICancelMethodCalls *LPCANCELMETHODCALLS;
2144
2145     HRESULT Cancel(
2146         [in] ULONG ulSeconds);
2147
2148     HRESULT TestCancel();
2149 }
2150
2151 [
2152   local,
2153   object,
2154   uuid(0000002A-0000-0000-C000-000000000046)
2155 ]
2156 interface IAsyncManager : IUnknown
2157 {
2158   typedef enum tagDCOM_CALL_STATE {
2159     DCOM_NONE          = 0,
2160     DCOM_CALL_COMPLETE = 1,
2161     DCOM_CALL_CANCELED = 2
2162   } DCOM_CALL_STATE;
2163
2164   HRESULT CompleteCall(
2165     [in] HRESULT Result);
2166
2167   HRESULT GetCallContext(
2168     [in] REFIID riid,
2169     [out] void **pInterface);
2170
2171   HRESULT GetState(
2172     [out] ULONG *pulStateFlags);
2173 }
2174
2175 [
2176     local,
2177     object,
2178     uuid(1c733a30-2a1c-11ce-ade5-00aa0044773d),
2179     pointer_default(unique)
2180 ]
2181 interface ICallFactory : IUnknown
2182 {
2183     HRESULT CreateCall(
2184         [in] REFIID riid,
2185         [in] IUnknown *pCtrlUnk,
2186         [in] REFIID riid2,
2187         [out, iid_is(riid2)] IUnknown **ppv);
2188 }
2189
2190 [
2191     local,
2192     object,
2193     uuid(00000144-0000-0000-C000-000000000046)
2194 ]
2195 interface IRpcOptions : IUnknown
2196 {
2197     HRESULT Set(
2198         [in] IUnknown *pPrx,
2199         [in] DWORD dwProperty,
2200         [in] ULONG_PTR dwValue);
2201
2202     HRESULT Query(
2203         [in] IUnknown *pPrx,
2204         [in] DWORD dwProperty,
2205         [out] ULONG_PTR *pdwValue);
2206 }
2207
2208 enum {
2209    COMBND_RPCTIMEOUT = 1,
2210    COMBND_SERVER_LOCALITY = 2
2211 };  
2212
2213 enum {
2214    SERVER_LOCALITY_PROCESS_LOCAL = 0,
2215    SERVER_LOCALITY_MACHINE_LOCAL = 1,
2216    SERVER_LOCALITY_REMOTE = 2
2217 };
2218
2219 [
2220     local,
2221     object,
2222     uuid(00000149-0000-0000-C000-000000000046),
2223     pointer_default(unique)
2224 ]
2225 interface IRpcHelper : IUnknown
2226 {
2227     HRESULT GetDCOMProtocolVersion(
2228         [out] DWORD *pComVersion);
2229
2230     HRESULT GetIIDFromOBJREF(
2231         [in] void *pObjRef,
2232         [out] IID **piid);
2233 }
2234
2235 [
2236     local,
2237     object,
2238     uuid(eb0cb9e8-7996-11d2-872e-0000f8080859)
2239 ]
2240 interface IReleaseMarshalBuffers : IUnknown
2241 {
2242     HRESULT ReleaseMarshalBuffer(
2243         [in] RPCOLEMESSAGE *pMsg,
2244         [in] DWORD dwFlags,
2245         [in, unique] IUnknown *pChnl);
2246 }
2247
2248 [
2249     local,
2250     object,
2251     uuid(0000002B-0000-0000-C000-000000000046)
2252 ]
2253 interface IWaitMultiple : IUnknown
2254 {
2255     HRESULT WaitMultiple(
2256         [in] DWORD timeout,
2257         [out] ISynchronize **pSync);
2258     HRESULT AddSynchronize(
2259         [in] ISynchronize *pSync);
2260 }
2261
2262
2263 [
2264     object,
2265     uuid(00000026-0000-0000-C000-000000000046)
2266 ]
2267 interface IUrlMon : IUnknown
2268 {
2269     HRESULT AsyncGetClassBits(
2270         [in] REFCLSID rclsid,
2271         [in, unique] LPCWSTR pszTYPE,
2272         [in, unique] LPCWSTR pszExt,
2273         [in] DWORD dwFileVersionMS,
2274         [in] DWORD dwFileVersionLS,
2275         [in, unique] LPCWSTR pszCodeBase,
2276         [in] IBindCtx *pbc,
2277         [in] DWORD dwClassContext,
2278         [in] REFIID riid,
2279         [in] DWORD flags);
2280 }
2281
2282 [
2283     local,
2284     object,
2285     uuid(00000145-0000-0000-C000-000000000046)
2286 ]
2287 interface IForegroundTransfer : IUnknown
2288 {
2289     HRESULT AllowForegroundTransfer(
2290         [in] void *lpvReserved);
2291 }
2292
2293 [
2294     local,
2295     object,
2296     uuid(00000147-0000-0000-C000-000000000046)
2297 ]
2298 interface IAddrTrackingControl : IUnknown
2299 {
2300     typedef [unique] IAddrTrackingControl *LPADDRTRACKINGCONTROL;
2301
2302     HRESULT EnableCOMDynamicAddrTracking();
2303     HRESULT DisableCOMDynamicAddrTracking();
2304 }
2305
2306 [
2307     local,
2308     object,
2309     uuid(00000148-0000-0000-C000-000000000046)
2310 ]
2311 interface IAddrExclusionControl : IUnknown
2312 {
2313     typedef [unique] IAddrExclusionControl *LPADDREXCLUSIONCONTROL;
2314
2315     HRESULT GetCurrentAddrExclusionList(
2316         [in] REFIID riid,
2317         [out, iid_is(riid)] void **ppEnumerator);
2318     HRESULT UpdateAddrExclusionList(
2319         [in] IUnknown *pEnumerator);
2320 }
2321
2322 typedef enum _APTTYPE {
2323     APTTYPE_CURRENT = -1,
2324     APTTYPE_STA     = 0,
2325     APTTYPE_MTA     = 1,
2326     APTTYPE_NA      = 2,
2327     APTTYPE_MAINSTA = 3
2328 } APTTYPE;
2329
2330 typedef enum _THDTYPE {
2331     THDTYPE_BLOCKMESSAGES   = 0,
2332     THDTYPE_PROCESSMESSAGES = 1
2333 } THDTYPE;
2334
2335 [
2336     local,
2337     object,
2338     uuid(000001ce-0000-0000-C000-000000000046),
2339     pointer_default(unique)
2340 ]
2341 interface IComThreadingInfo : IUnknown
2342 {
2343     HRESULT GetCurrentApartmentType(
2344         [out] APTTYPE *pAptType);
2345     HRESULT GetCurrentThreadType(
2346         [out] THDTYPE *pThreadType);
2347     HRESULT GetCurrentLogicalThreadId(
2348         [out] GUID *pguidLogicalThreadId);
2349     HRESULT SetCurrentLogicalThreadId(
2350         [in] REFGUID rguid);
2351 }
2352
2353
2354 [
2355     object,
2356     pointer_default(unique),
2357     uuid(72380d55-8d2b-43a3-8513-2b6ef31434e9)
2358 ]
2359 interface IProcessInitControl : IUnknown
2360 {
2361     HRESULT ResetInitializerTimeout(
2362         [in] DWORD dwSecondsRemaining);
2363 }
2364
2365 [
2366     local,
2367     object,
2368     uuid(00000034-0000-0000-C000-000000000046),
2369     pointer_default(unique)
2370 ]
2371 interface IInitializeSpy : IUnknown
2372 {
2373     typedef [unique] IInitializeSpy *LPINITIALIZESPY;
2374
2375     HRESULT PreInitialize(
2376         [in] DWORD dwCoInit,
2377         [in] DWORD dwCurThreadAptRefs);
2378
2379     HRESULT PostInitialize(
2380         [in] HRESULT hrCoInit,
2381         [in] DWORD dwCoInit,
2382         [in] DWORD dwNewThreadAptRefs);
2383
2384     HRESULT PreUninitialize(
2385         [in] DWORD dwCurThreadAptRefs);
2386
2387     HRESULT PostUninitialize(
2388         [in] DWORD dwNewThreadAptRefs);
2389 }
2390
2391 [
2392     object,
2393     uuid(969dc708-5c76-11d1-8d86-0000f804b057)
2394 ]
2395 interface IThumbnailExtractor : IUnknown
2396 {
2397     HRESULT ExtractThumbnail(
2398         [in] IStorage *pStg,
2399         [in] ULONG ulLength,
2400         [in] ULONG ulHeight,
2401         [out] ULONG *pulOutputLength,
2402         [out] ULONG *pulOutputHeight,
2403         [out] HBITMAP *phOutputBitmap);
2404
2405
2406     HRESULT OnFileUpdated(
2407         [in] IStorage *pStg);
2408 }
2409
2410
2411 cpp_quote("#ifdef USE_COM_CONTEXT_DEF")
2412
2413 typedef DWORD CPFLAGS;
2414
2415 typedef struct tagContextProperty
2416 {
2417     GUID policyId;
2418     CPFLAGS flags;
2419     [unique] IUnknown *pUnk;
2420 } ContextProperty;
2421
2422 [
2423     local,
2424     object,
2425     uuid(000001c1-0000-0000-C000-000000000046)
2426 ]
2427 interface IEnumContextProps : IUnknown
2428 {
2429     typedef [unique] IEnumContextProps *LPENUMCONTEXTPROPS;
2430
2431     HRESULT Next(
2432         [in] ULONG celt,
2433         [out, size_is(celt), length_is(*pceltFetched)] ContextProperty *pContextProperties,
2434         [out] ULONG *pceltFetched);
2435
2436     HRESULT Skip(
2437         [in] ULONG celt);
2438
2439     HRESULT Reset();
2440
2441     HRESULT Clone(
2442         [out] IEnumContextProps **ppEnumContextProps);
2443
2444     HRESULT Count(
2445         [out] ULONG *pcelt);
2446 }
2447
2448 [
2449     local,
2450     object,
2451     uuid(000001c0-0000-0000-C000-000000000046)
2452 ]
2453 interface IContext : IUnknown
2454 {
2455     HRESULT SetProperty(
2456         [in] REFGUID policyId,
2457         [in] CPFLAGS flags,
2458         [in] IUnknown *pUnk);
2459
2460     HRESULT RemoveProperty(
2461         [in] REFGUID policyId);
2462
2463     HRESULT GetProperty(
2464         [in] REFGUID guid,
2465         [out] CPFLAGS *pFlags,
2466         [out] IUnknown **ppUnk);
2467
2468     HRESULT EnumContextProps(
2469         [out] IEnumContextProps **ppEnumContextProps);
2470 }
2471
2472 [
2473     local,
2474     object,
2475     uuid(000001c6-0000-0000-c000-000000000046),
2476     pointer_default(unique)
2477 ]
2478 interface IObjContext : IContext
2479 {
2480     void Reserved1();
2481     void Reserved2();
2482     void Reserved3();
2483     void Reserved4();
2484     void Reserved5();
2485     void Reserved6();
2486     void Reserved7();
2487 }
2488
2489 cpp_quote("#endif /* defined USE_COM_CONTEXT_DEF */")