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