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