Buffer size needs to be specified in bytes on input.
[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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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), async]
1458   HRESULT  RemoteOnDataChange(
1459     [in] IAsyncManager **ppIAM,
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), async]
1469   HRESULT RemoteOnViewChange(
1470     [in] IAsyncManager **ppIAM,
1471     [in] DWORD dwAspect,
1472     [in] LONG lindex);
1473
1474   [local]
1475   void OnRename(
1476     [in] IMoniker *pmk);
1477
1478   [call_as(OnRename), async]
1479   HRESULT RemoteOnRename(
1480     [in] IAsyncManager **ppIAM,
1481     [in] IMoniker *pmk);
1482
1483   [local]
1484   void OnSave();
1485
1486   [call_as(OnSave), async]
1487   HRESULT RemoteOnSave(
1488     [in] IAsyncManager **ppIAM);
1489
1490   [local]
1491   void OnClose();
1492
1493   [call_as(OnClose)]
1494   HRESULT RemoteOnClose();
1495 }
1496
1497 [
1498   object,
1499   uuid(00000125-0000-0000-C000-000000000046),
1500   pointer_default(unique)
1501 ]
1502 interface IAdviseSink2 : IAdviseSink
1503 {
1504   typedef [unique] IAdviseSink2 *LPADVISESINK2;
1505
1506   [local]
1507   void OnLinkSrcChange(
1508     [in, unique] IMoniker *pmk);
1509
1510   [call_as(OnLinkSrcChange), async]
1511   HRESULT RemoteOnLinkSrcChange(
1512     [in] IAsyncManager **ppIAM,
1513     [in, unique] IMoniker *pmk);
1514 }
1515
1516 [
1517   object,
1518   uuid(0000010e-0000-0000-C000-000000000046),
1519   pointer_default(unique)
1520 ]
1521 interface IDataObject : IUnknown
1522 {
1523   typedef [unique] IDataObject *LPDATAOBJECT;
1524
1525   typedef enum tagDATADIR {
1526     DATADIR_GET = 1,
1527     DATADIR_SET = 2
1528   } DATADIR;
1529
1530   [local]
1531   HRESULT GetData(
1532     [in, unique] FORMATETC *pformatetcIn,
1533     [out] STGMEDIUM *pmedium);
1534
1535   [call_as(GetData)]
1536   HRESULT RemoteGetData(
1537     [in, unique] FORMATETC *pformatetcIn,
1538     [out] STGMEDIUM *pRemoteMedium);
1539
1540   [local]
1541   HRESULT GetDataHere(
1542     [in, unique] FORMATETC *pformatetc,
1543     [in, out] STGMEDIUM *pmedium);
1544
1545   [call_as(GetDataHere)]
1546   HRESULT RemoteGetDataHere(
1547     [in, unique] FORMATETC *pformatetc,
1548     [in, out] STGMEDIUM *pRemoteMedium);
1549
1550   HRESULT QueryGetData(
1551     [in, unique] FORMATETC *pformatetc);
1552
1553   HRESULT GetCanonicalFormatEtc(
1554     [in, unique] FORMATETC *pformatectIn,
1555     [out] FORMATETC *pformatetcOut);
1556
1557   [local]
1558   HRESULT SetData(
1559     [in, unique] FORMATETC *pformatetc,
1560     [in, unique] STGMEDIUM *pmedium,
1561     [in] BOOL fRelease);
1562
1563   [call_as(SetData)]
1564   HRESULT RemoteSetData(
1565     [in, unique] FORMATETC *pformatetc,
1566     [in, unique] FLAG_STGMEDIUM *pmedium,
1567     [in] BOOL fRelease);
1568
1569   HRESULT EnumFormatEtc(
1570     [in] DWORD dwDirection,
1571     [out] IEnumFORMATETC **ppenumFormatEtc);
1572
1573   HRESULT DAdvise(
1574     [in] FORMATETC *pformatetc,
1575     [in] DWORD advf,
1576     [in, unique] IAdviseSink *pAdvSink,
1577     [out] DWORD *pdwConnection);
1578
1579   HRESULT DUnadvise(
1580     [in] DWORD dwConnection);
1581
1582   HRESULT EnumDAdvise(
1583     [out] IEnumSTATDATA **ppenumAdvise);
1584 }
1585
1586 [
1587   local,
1588   object,
1589   uuid(00000110-0000-0000-C000-000000000046)
1590 ]
1591 interface IDataAdviseHolder : IUnknown
1592 {
1593   typedef [unique] IDataAdviseHolder *LPDATAADVISEHOLDER;
1594
1595   HRESULT Advise(
1596     [in, unique] IDataObject *pDataObject,
1597     [in, unique] FORMATETC *pFetc,
1598     [in] DWORD advf,
1599     [in, unique] IAdviseSink *pAdvise,
1600     [out] DWORD *pdwConnection);
1601
1602   HRESULT Unadvise(
1603     [in] DWORD dwConnection);
1604
1605   HRESULT EnumAdvise(
1606     [out] IEnumSTATDATA **ppenumAdvise);
1607
1608   HRESULT SendOnDataChange(
1609     [in, unique] IDataObject *pDataObject,
1610     [in] DWORD dwReserved,
1611     [in] DWORD advf);
1612 }
1613
1614 /******************** Remoting ********************/
1615
1616 [
1617   local,
1618   object,
1619   uuid(00000016-0000-0000-C000-000000000046)
1620 ]
1621 interface IMessageFilter : IUnknown
1622 {
1623   typedef [unique] IMessageFilter *LPMESSAGEFILTER;
1624
1625   typedef enum tagCALLTYPE {
1626     CALLTYPE_TOPLEVEL = 1,
1627     CALLTYPE_NESTED   = 2,
1628     CALLTYPE_ASYNC    = 3,
1629     CALLTYPE_TOPLEVEL_CALLPENDING = 4,
1630     CALLTYPE_ASYNC_CALLPENDING    = 5
1631   } CALLTYPE;
1632
1633   typedef enum tagSERVERCALL {
1634     SERVERCALL_ISHANDLED  = 0,
1635     SERVERCALL_REJECTED   = 1,
1636     SERVERCALL_RETRYLATER = 2
1637   } SERVERCALL;
1638
1639   typedef enum tagPENDINGTYPE {
1640     PENDINGTYPE_TOPLEVEL = 1,
1641     PENDINGTYPE_NESTED   = 2
1642   } PENDINGTYPE;
1643
1644   typedef enum tagPENDINGMSG {
1645     PENDINGMSG_CANCELCALL     = 0,
1646     PENDINGMSG_WAITNOPROCESS  = 1,
1647     PENDINGMSG_WAITDEFPROCESS = 2
1648   } PENDINGMSG;
1649
1650   typedef struct tagINTERFACEINFO {
1651     IUnknown *pUnk;
1652     IID iid;
1653     WORD wMethod;
1654   } INTERFACEINFO, *LPINTERFACEINFO;
1655
1656   DWORD HandleInComingCall(
1657     [in] DWORD dwCallType,
1658     [in] HTASK htaskCaller,
1659     [in] DWORD dwTickCount,
1660     [in] LPINTERFACEINFO lpInterfaceInfo);
1661
1662   DWORD RetryRejectedCall(
1663     [in] HTASK htaskCallee,
1664     [in] DWORD dwTickCount,
1665     [in] DWORD dwRejectType);
1666
1667   DWORD MessagePending(
1668     [in] HTASK htaskCallee,
1669     [in] DWORD dwTickCount,
1670     [in] DWORD dwPendingType);
1671 }
1672
1673 [
1674   local,
1675   object,
1676   uuid(D5F56B60-593B-101A-B569-08002B2DBF7A)
1677 ]
1678 interface IRpcChannelBuffer : IUnknown
1679 {
1680   typedef [unique] IRpcChannelBuffer *LPRPCCHANNELBUFFER;
1681
1682   typedef unsigned long RPCOLEDATAREP;
1683
1684   typedef struct tagRPCOLEMESSAGE {
1685     void *reserved1;
1686     RPCOLEDATAREP dataRepresentation;
1687     void *Buffer;
1688     ULONG cbBuffer;
1689     ULONG iMethod;
1690     void *reserved2[5];
1691     ULONG rpcFlags;
1692   } RPCOLEMESSAGE;
1693
1694   typedef RPCOLEMESSAGE *PRPCOLEMESSAGE;
1695
1696   HRESULT GetBuffer(
1697     [in] RPCOLEMESSAGE *pMessage,
1698     [in] REFIID riid);
1699
1700   HRESULT SendReceive(
1701     [in,out] RPCOLEMESSAGE *pMessage,
1702     [out] ULONG *pStatus);
1703
1704   HRESULT FreeBuffer(
1705     [in] RPCOLEMESSAGE *pMessage);
1706
1707   HRESULT GetDestCtx(
1708     [out] DWORD *pdwDestContext,
1709     [out] void **ppvDestContext);
1710
1711   HRESULT IsConnected();
1712 }
1713
1714 [
1715   local,
1716   object,
1717   uuid(594f31d0-7f19-11d0-b194-00a0c90dc8bf)
1718 ]
1719 interface IRpcChannelBuffer2 : IRpcChannelBuffer
1720 {
1721   typedef [unique] IRpcChannelBuffer2 *LPRPCCHANNELBUFFER2;
1722
1723   HRESULT GetProtocolVersion(
1724     [in,out] DWORD *pdwVersion);
1725 }
1726
1727 [
1728   local,
1729   object,
1730   uuid(25B15600-0115-11d0-BF0D-00AA00B8DFD2)
1731 ]
1732 interface IRpcChannelBuffer3 : IRpcChannelBuffer2
1733 {
1734   typedef [unique] IRpcChannelBuffer3 *LPRPCCHANNELBUFFER3;
1735
1736   HRESULT Send(
1737     [in,out] RPCOLEMESSAGE *pMsg,
1738     [out] ULONG *pulStatus);
1739
1740   HRESULT Receive(
1741     [in,out] RPCOLEMESSAGE *pMsg,
1742     [in] ULONG ulSize,
1743     [out] ULONG *pulStatus);
1744
1745   HRESULT Cancel(
1746     [in] RPCOLEMESSAGE *pMsg);
1747
1748   HRESULT GetCallContext(
1749     [in] RPCOLEMESSAGE *pMsg,
1750     [in] REFIID riid,
1751     [out] void **pInterface);
1752
1753   HRESULT GetDestCtxEx(
1754     [in] RPCOLEMESSAGE *pMsg,
1755     [out] DWORD *pdwDestContext,
1756     [out] void **ppvDestContext);
1757
1758   HRESULT GetState(
1759     [in] RPCOLEMESSAGE *pMsg,
1760     [out] DWORD *pState);
1761
1762   HRESULT RegisterAsync(
1763     [in] RPCOLEMESSAGE *pMsg,
1764     [in] IAsyncManager *pAsyncMgr);
1765 }
1766
1767 [
1768     local,
1769     object,
1770     uuid(a5029fb6-3c34-11d1-9c99-00c04fb998aa),
1771     pointer_default(unique)
1772 ]
1773 interface IAsyncRpcChannelBuffer : IRpcChannelBuffer2
1774 {
1775     HRESULT Send(
1776         [in, out] RPCOLEMESSAGE *pMsg,
1777         [in] ISynchronize *pSync,
1778         [out] ULONG *pulStatus);
1779
1780     HRESULT Receive(
1781         [in, out] RPCOLEMESSAGE *pMsg,
1782         [out] ULONG *pulStatus);
1783
1784     HRESULT GetDestCtxEx(
1785         [in] RPCOLEMESSAGE *pMsg,
1786         [out] DWORD *pdwDestContext,
1787         [out] void **ppvDestContext);
1788 };
1789
1790 [
1791     local,
1792     object,
1793     uuid(58a08519-24c8-4935-b482-3fd823333a4f)
1794 ]
1795 interface IRpcSyntaxNegotiate : IUnknown
1796 {
1797     HRESULT NegotiateSyntax(
1798         [in, out] RPCOLEMESSAGE *pMsg);
1799 }
1800
1801 [
1802   local,
1803   object,
1804   uuid(D5F56A34-593B-101A-B569-08002B2DBF7A)
1805 ]
1806 interface IRpcProxyBuffer : IUnknown
1807 {
1808   typedef [unique] IRpcProxyBuffer *LPRPCPROXYBUFFER;
1809
1810   HRESULT Connect(
1811     [in, unique] IRpcChannelBuffer *pRpcChannelBuffer);
1812
1813   void Disconnect();
1814 }
1815
1816 [
1817   local,
1818   object,
1819   uuid(D5F56AFC-593B-101A-B569-08002B2DBF7A)
1820 ]
1821 interface IRpcStubBuffer : IUnknown
1822 {
1823   typedef [unique] IRpcStubBuffer *LPRPCSTUBBUFFER;
1824
1825   HRESULT Connect(
1826     [in] IUnknown *pUnkServer);
1827
1828   void Disconnect();
1829
1830   HRESULT Invoke(
1831     [in] RPCOLEMESSAGE *_prpcmsg,
1832     [in] IRpcChannelBuffer *_pRpcChannelBuffer);
1833
1834   IRpcStubBuffer *IsIIDSupported(
1835     [in] REFIID riid);
1836
1837   ULONG CountRefs();
1838
1839   HRESULT DebugServerQueryInterface(
1840     void **ppv);
1841
1842   void DebugServerRelease(
1843     void *pv);
1844 }
1845
1846 [
1847   local,
1848   object,
1849   uuid(D5F569D0-593B-101A-B569-08002B2DBF7A)
1850 ]
1851 interface IPSFactoryBuffer : IUnknown
1852 {
1853   typedef [unique] IPSFactoryBuffer *LPPSFACTORYBUFFER;
1854
1855   HRESULT CreateProxy(
1856     [in] IUnknown *pUnkOuter,
1857     [in] REFIID riid,
1858     [out] IRpcProxyBuffer **ppProxy,
1859     [out] void **ppv);
1860
1861   HRESULT CreateStub(
1862     [in] REFIID riid,
1863     [in, unique] IUnknown *pUnkServer,
1864     [out] IRpcStubBuffer **ppStub);
1865 }
1866
1867 [
1868   local,
1869   object,
1870   uuid(1008c4a0-7613-11cf-9af1-0020af6e72f4)
1871 ]
1872 interface IChannelHook : IUnknown
1873 {
1874   typedef [unique] IChannelHook *LPCHANNELHOOK;
1875
1876   typedef struct SChannelHookCallInfo {
1877     IID iid;
1878     DWORD cbSize;
1879     GUID uCausality;
1880     DWORD dwServerPid;
1881     DWORD iMethod;
1882     void *pObject;
1883   } SChannelHookCallInfo;
1884
1885   void ClientGetSize(
1886     [in] REFGUID uExtent,
1887     [in] REFIID riid,
1888     [out] ULONG *pDataSize);
1889
1890   void ClientFillBuffer(
1891     [in] REFGUID uExtent,
1892     [in] REFIID riid,
1893     [in, out] ULONG *pDataSize,
1894     [in] void *pDataBuffer);
1895
1896   void ClientNotify(
1897     [in] REFGUID uExtent,
1898     [in] REFIID riid,
1899     [in] ULONG cbDataSize,
1900     [in] void *pDataBuffer,
1901     [in] DWORD lDataRep,
1902     [in] HRESULT hrFault);
1903
1904   void ServerNotify(
1905     [in] REFGUID uExtent,
1906     [in] REFIID riid,
1907     [in] ULONG cbDataSize,
1908     [in] void *pDataBuffer,
1909     [in] DWORD lDataRep);
1910
1911   void ServerGetSize(
1912     [in] REFGUID uExtent,
1913     [in] REFIID riid,
1914     [in] HRESULT hrFault,
1915     [out] ULONG *pDataSize);
1916
1917   void ServerFillBuffer(
1918     [in] REFGUID uExtent,
1919     [in] REFIID riid,
1920     [in, out] ULONG *pDataSize,
1921     [in] void *pDataBuffer,
1922     [in] HRESULT hrFault );
1923 }
1924
1925 extern const FMTID FMTID_SummaryInformation;
1926 extern const FMTID FMTID_DocSummaryInformation;
1927 extern const FMTID FMTID_UserDefinedProperties;
1928
1929
1930 /******************** Connection Points ********************/
1931 /* FIXME */
1932
1933 /******************** DCOM ********************/
1934
1935 [
1936   local,
1937   object,
1938   uuid(0000013D-0000-0000-C000-000000000046)
1939 ]
1940 interface IClientSecurity : IUnknown
1941 {
1942   typedef struct tagSOLE_AUTHENTICATION_SERVICE {
1943     DWORD dwAuthnSvc;
1944     DWORD dwAuthzSvc;
1945     OLECHAR *pPrincipalName;
1946     HRESULT hr;
1947   } SOLE_AUTHENTICATION_SERVICE;
1948
1949   typedef SOLE_AUTHENTICATION_SERVICE *PSOLE_AUTHENTICATION_SERVICE;
1950
1951   typedef enum tagEOLE_AUTHENTICATION_CAPABILITIES {
1952     EOAC_NONE           = 0x0,
1953     EOAC_MUTUAL_AUTH    = 0x1,
1954     EOAC_CLOAKING       = 0x10,
1955     EOAC_SECURE_REFS    = 0x2,
1956     EOAC_ACCESS_CONTROL = 0x4,
1957     EOAC_APPID          = 0x8
1958   } EOLE_AUTHENTICATION_CAPABILITIES;
1959
1960   HRESULT QueryBlanket(
1961     [in] IUnknown *pProxy,
1962     [out] DWORD *pAuthnSvc,
1963     [out] DWORD *pAuthzSvc,
1964     [out] OLECHAR **pServerPrincName,
1965     [out] DWORD *pAuthnLevel,
1966     [out] DWORD *pImpLevel,
1967     [out] void **pAuthInfo,
1968     [out] DWORD *pCapabilites);
1969
1970   HRESULT SetBlanket(
1971     [in] IUnknown *pProxy,
1972     [in] DWORD AuthnSvc,
1973     [in] DWORD AuthzSvc,
1974     [in] OLECHAR *pServerPrincName,
1975     [in] DWORD AuthnLevel,
1976     [in] DWORD ImpLevel,
1977     [in] void *pAuthInfo,
1978     [in] DWORD Capabilities);
1979
1980   HRESULT CopyProxy(
1981     [in] IUnknown *pProxy,
1982     [out] IUnknown **ppCopy);
1983 }
1984
1985 [
1986   local,
1987   object,
1988   uuid(0000013E-0000-0000-C000-000000000046)
1989 ]
1990 interface IServerSecurity : IUnknown
1991 {
1992   HRESULT QueryBlanket(
1993     [out] DWORD *pAuthnSvc,
1994     [out] DWORD *pAuthzSvc,
1995     [out] OLECHAR **pServerPrincName,
1996     [out] DWORD *pAuthnLevel,
1997     [out] DWORD *pImpLevel,
1998     [out] void **pPrivs,
1999     [out] DWORD *pCapabilities);
2000
2001   HRESULT ImpersonateClient();
2002
2003   HRESULT RevertToSelf();
2004
2005   BOOL IsImpersonating();
2006 }
2007
2008 [
2009   local,
2010   object,
2011   uuid(00000024-0000-0000-C000-000000000046)
2012 ]
2013 interface IAsyncSetup : IUnknown
2014 {
2015   HRESULT GetAsyncManager(
2016     [in] REFIID riid,
2017     [in] IUnknown *pOuter,
2018     [in] DWORD dwFlags,
2019     [out] IUnknown **ppInner,
2020     [out] IAsyncManager **ppAsyncMgr);
2021 }
2022
2023 [
2024     object,
2025     uuid(0e6d4d92-6738-11cf-9608-00aa00680db4)
2026 ]
2027 interface IDirectWriterLock : IUnknown
2028 {
2029     HRESULT WaitForWriteAccess(
2030         [in] DWORD dwTimeout);
2031
2032     HRESULT ReleaseWriteAccess();
2033
2034     HRESULT HaveWriteAccess();
2035 }
2036
2037 [
2038     object,
2039     uuid(00000030-0000-0000-C000-000000000046)
2040 ]
2041
2042 interface ISynchronize : IUnknown
2043 {
2044     HRESULT Wait(
2045         [in] DWORD dwFlags,
2046         [in] DWORD dwMilliseconds);
2047
2048     HRESULT Signal();
2049
2050     HRESULT Reset();
2051 }
2052
2053
2054 [
2055     local,
2056     object,
2057     uuid(00000031-0000-0000-C000-000000000046)
2058 ]
2059 interface ISynchronizeHandle : IUnknown
2060 {
2061     HRESULT GetHandle(
2062         [out] HANDLE *ph);
2063 }
2064
2065
2066 [
2067     local,
2068     object,
2069     uuid(00000032-0000-0000-C000-000000000046)
2070 ]
2071 interface ISynchronizeEvent : ISynchronizeHandle
2072 {
2073     HRESULT SetEventHandle(
2074         [in] HANDLE *ph);
2075 }
2076
2077
2078 [
2079     local,
2080     object,
2081     uuid(00000033-0000-0000-C000-000000000046)
2082 ]
2083 interface ISynchronizeContainer : IUnknown
2084 {
2085     HRESULT AddSynchronize(
2086         [in] ISynchronize *pSync);
2087
2088     HRESULT WaitMultiple(
2089         [in] DWORD dwFlags,
2090         [in] DWORD dwTimeOut,
2091         [out] ISynchronize **ppSync);
2092 }
2093
2094 [
2095     local,
2096     object,
2097     uuid(00000025-0000-0000-C000-000000000046)
2098 ]
2099 interface ISynchronizeMutex : ISynchronize
2100 {
2101     HRESULT ReleaseMutex();
2102 }
2103
2104 [
2105     local,
2106     object,
2107     uuid(00000029-0000-0000-C000-000000000046)
2108 ]
2109
2110 interface ICancelMethodCalls : IUnknown
2111 {
2112     typedef [unique] ICancelMethodCalls *LPCANCELMETHODCALLS;
2113
2114     HRESULT Cancel(
2115         [in] ULONG ulSeconds);
2116
2117     HRESULT TestCancel();
2118 }
2119
2120 [
2121   local,
2122   object,
2123   uuid(0000002A-0000-0000-C000-000000000046)
2124 ]
2125 interface IAsyncManager : IUnknown
2126 {
2127   typedef enum tagDCOM_CALL_STATE {
2128     DCOM_NONE          = 0,
2129     DCOM_CALL_COMPLETE = 1,
2130     DCOM_CALL_CANCELED = 2
2131   } DCOM_CALL_STATE;
2132
2133   HRESULT CompleteCall(
2134     [in] HRESULT Result);
2135
2136   HRESULT GetCallContext(
2137     [in] REFIID riid,
2138     [out] void **pInterface);
2139
2140   HRESULT GetState(
2141     [out] ULONG *pulStateFlags);
2142 }
2143
2144 [
2145     local,
2146     object,
2147     uuid(1c733a30-2a1c-11ce-ade5-00aa0044773d),
2148     pointer_default(unique)
2149 ]
2150 interface ICallFactory : IUnknown
2151 {
2152     HRESULT CreateCall(
2153         [in] REFIID riid,
2154         [in] IUnknown *pCtrlUnk,
2155         [in] REFIID riid2,
2156         [out, iid_is(riid2)] IUnknown **ppv);
2157 }
2158
2159 [
2160     local,
2161     object,
2162     uuid(00000144-0000-0000-C000-000000000046)
2163 ]
2164 interface IRpcOptions : IUnknown
2165 {
2166     HRESULT Set(
2167         [in] IUnknown *pPrx,
2168         [in] DWORD dwProperty,
2169         [in] ULONG_PTR dwValue);
2170
2171     HRESULT Query(
2172         [in] IUnknown *pPrx,
2173         [in] DWORD dwProperty,
2174         [out] ULONG_PTR *pdwValue);
2175 }
2176
2177 enum {
2178    COMBND_RPCTIMEOUT = 1,
2179    COMBND_SERVER_LOCALITY = 2
2180 };  
2181
2182 enum {
2183    SERVER_LOCALITY_PROCESS_LOCAL = 0,
2184    SERVER_LOCALITY_MACHINE_LOCAL = 1,
2185    SERVER_LOCALITY_REMOTE = 2
2186 };
2187
2188 [
2189     local,
2190     object,
2191     uuid(00000149-0000-0000-C000-000000000046),
2192     pointer_default(unique)
2193 ]
2194 interface IRpcHelper : IUnknown
2195 {
2196     HRESULT GetDCOMProtocolVersion(
2197         [out] DWORD *pComVersion);
2198
2199     HRESULT GetIIDFromOBJREF(
2200         [in] void *pObjRef,
2201         [out] IID **piid);
2202 }
2203
2204 [
2205     local,
2206     object,
2207     uuid(eb0cb9e8-7996-11d2-872e-0000f8080859)
2208 ]
2209 interface IReleaseMarshalBuffers : IUnknown
2210 {
2211     HRESULT ReleaseMarshalBuffer(
2212         [in] RPCOLEMESSAGE *pMsg,
2213         [in] DWORD dwFlags,
2214         [in, unique] IUnknown *pChnl);
2215 }
2216
2217 [
2218     local,
2219     object,
2220     uuid(0000002B-0000-0000-C000-000000000046)
2221 ]
2222 interface IWaitMultiple : IUnknown
2223 {
2224     HRESULT WaitMultiple(
2225         [in] DWORD timeout,
2226         [out] ISynchronize **pSync);
2227     HRESULT AddSynchronize(
2228         [in] ISynchronize *pSync);
2229 }
2230
2231
2232 [
2233     object,
2234     uuid(00000026-0000-0000-C000-000000000046)
2235 ]
2236 interface IUrlMon : IUnknown
2237 {
2238     HRESULT AsyncGetClassBits(
2239         [in] REFCLSID rclsid,
2240         [in, unique] LPCWSTR pszTYPE,
2241         [in, unique] LPCWSTR pszExt,
2242         [in] DWORD dwFileVersionMS,
2243         [in] DWORD dwFileVersionLS,
2244         [in, unique] LPCWSTR pszCodeBase,
2245         [in] IBindCtx *pbc,
2246         [in] DWORD dwClassContext,
2247         [in] REFIID riid,
2248         [in] DWORD flags);
2249 }
2250
2251 [
2252     local,
2253     object,
2254     uuid(00000145-0000-0000-C000-000000000046)
2255 ]
2256 interface IForegroundTransfer : IUnknown
2257 {
2258     HRESULT AllowForegroundTransfer(
2259         [in] void *lpvReserved);
2260 }
2261
2262 [
2263     local,
2264     object,
2265     uuid(00000147-0000-0000-C000-000000000046)
2266 ]
2267 interface IAddrTrackingControl : IUnknown
2268 {
2269     typedef [unique] IAddrTrackingControl *LPADDRTRACKINGCONTROL;
2270
2271     HRESULT EnableCOMDynamicAddrTracking();
2272     HRESULT DisableCOMDynamicAddrTracking();
2273 };
2274
2275 [
2276     local,
2277     object,
2278     uuid(00000148-0000-0000-C000-000000000046)
2279 ]
2280 interface IAddrExclusionControl : IUnknown
2281 {
2282     typedef [unique] IAddrExclusionControl *LPADDREXCLUSIONCONTROL;
2283
2284     HRESULT GetCurrentAddrExclusionList(
2285         [in] REFIID riid,
2286         [out, iid_is(riid)] void **ppEnumerator);
2287     HRESULT UpdateAddrExclusionList(
2288         [in] IUnknown *pEnumerator);
2289 };
2290
2291 typedef enum _APTTYPE {
2292     APTTYPE_CURRENT = -1,
2293     APTTYPE_STA     = 0,
2294     APTTYPE_MTA     = 1,
2295     APTTYPE_NA      = 2,
2296     APTTYPE_MAINSTA = 3
2297 } APTTYPE;
2298
2299 typedef enum _THDTYPE {
2300     THDTYPE_BLOCKMESSAGES   = 0,
2301     THDTYPE_PROCESSMESSAGES = 1
2302 } THDTYPE;
2303
2304 [
2305     local,
2306     object,
2307     uuid(000001ce-0000-0000-C000-000000000046),
2308     pointer_default(unique)
2309 ]
2310 interface IComThreadingInfo : IUnknown
2311 {
2312     HRESULT GetCurrentApartmentType(
2313         [out] APTTYPE *pAptType);
2314     HRESULT GetCurrentThreadType(
2315         [out] THDTYPE *pThreadType);
2316     HRESULT GetCurrentLogicalThreadId(
2317         [out] GUID *pguidLogicalThreadId);
2318     HRESULT SetCurrentLogicalThreadId(
2319         [in] REFGUID rguid);
2320 };
2321
2322
2323 [
2324     object,
2325     pointer_default(unique),
2326     uuid(72380d55-8d2b-43a3-8513-2b6ef31434e9)
2327 ]
2328 interface IProcessInitControl : IUnknown
2329 {
2330     HRESULT ResetInitializerTimeout(
2331         [in] DWORD dwSecondsRemaining);
2332 };
2333
2334 [
2335     local,
2336     object,
2337     uuid(00000034-0000-0000-C000-000000000046),
2338     pointer_default(unique)
2339 ]
2340 interface IInitializeSpy : IUnknown
2341 {
2342     typedef [unique] IInitializeSpy *LPINITIALIZESPY;
2343
2344     HRESULT PreInitialize(
2345         [in] DWORD dwCoInit,
2346         [in] DWORD dwCurThreadAptRefs);
2347
2348     HRESULT PostInitialize(
2349         [in] HRESULT hrCoInit,
2350         [in] DWORD dwCoInit,
2351         [in] DWORD dwNewThreadAptRefs);
2352
2353     HRESULT PreUninitialize(
2354         [in] DWORD dwCurThreadAptRefs);
2355
2356     HRESULT PostUninitialize(
2357         [in] DWORD dwNewThreadAptRefs);
2358 };
2359
2360 [
2361     object,
2362     uuid(969dc708-5c76-11d1-8d86-0000f804b057)
2363 ]
2364 interface IThumbnailExtractor : IUnknown
2365 {
2366     HRESULT ExtractThumbnail(
2367         [in] IStorage *pStg,
2368         [in] ULONG ulLength,
2369         [in] ULONG ulHeight,
2370         [out] ULONG *pulOutputLength,
2371         [out] ULONG *pulOutputHeight,
2372         [out] HBITMAP *phOutputBitmap);
2373
2374
2375     HRESULT OnFileUpdated(
2376         [in] IStorage *pStg);
2377 }