Reactos
at master 1059 lines 28 kB view raw
1/* 2 * Copyright (C) 1998-1999 Francois Gouget 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#include <rpc.h> 20#include <rpcndr.h> 21 22#ifndef _OBJBASE_H_ 23#define _OBJBASE_H_ 24 25/***************************************************************************** 26 * Macros to define a COM interface 27 */ 28/* 29 * The goal of the following set of definitions is to provide a way to use the same 30 * header file definitions to provide both a C interface and a C++ object oriented 31 * interface to COM interfaces. The type of interface is selected automatically 32 * depending on the language but it is always possible to get the C interface in C++ 33 * by defining CINTERFACE. 34 * 35 * It is based on the following assumptions: 36 * - all COM interfaces derive from IUnknown, this should not be a problem. 37 * - the header file only defines the interface, the actual fields are defined 38 * separately in the C file implementing the interface. 39 * 40 * The natural approach to this problem would be to make sure we get a C++ class and 41 * virtual methods in C++ and a structure with a table of pointer to functions in C. 42 * Unfortunately the layout of the virtual table is compiler specific, the layout of 43 * g++ virtual tables is not the same as that of an egcs virtual table which is not the 44 * same as that generated by Visual C++. There are workarounds to make the virtual tables 45 * compatible via padding but unfortunately the one which is imposed to the WINE emulator 46 * by the Windows binaries, i.e. the Visual C++ one, is the most compact of all. 47 * 48 * So the solution I finally adopted does not use virtual tables. Instead I use inline 49 * non virtual methods that dereference the method pointer themselves and perform the call. 50 * 51 * Let's take Direct3D as an example: 52 * 53 * #define INTERFACE IDirect3D 54 * DECLARE_INTERFACE_(IDirect3D,IUnknown) 55 * { 56 * // *** IUnknown methods *** // 57 * STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID, void**) PURE; 58 * STDMETHOD_(ULONG,AddRef)(THIS) PURE; 59 * STDMETHOD_(ULONG,Release)(THIS) PURE; 60 * // *** IDirect3D methods *** // 61 * STDMETHOD(Initialize)(THIS_ REFIID) PURE; 62 * STDMETHOD(EnumDevices)(THIS_ LPD3DENUMDEVICESCALLBACK, LPVOID) PURE; 63 * STDMETHOD(CreateLight)(THIS_ LPDIRECT3DLIGHT *, IUnknown *) PURE; 64 * STDMETHOD(CreateMaterial)(THIS_ LPDIRECT3DMATERIAL *, IUnknown *) PURE; 65 * STDMETHOD(CreateViewport)(THIS_ LPDIRECT3DVIEWPORT *, IUnknown *) PURE; 66 * STDMETHOD(FindDevice)(THIS_ LPD3DFINDDEVICESEARCH, LPD3DFINDDEVICERESULT) PURE; 67 * }; 68 * #undef INTERFACE 69 * 70 * #ifdef COBJMACROS 71 * // *** IUnknown methods *** // 72 * #define IDirect3D_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) 73 * #define IDirect3D_AddRef(p) (p)->lpVtbl->AddRef(p) 74 * #define IDirect3D_Release(p) (p)->lpVtbl->Release(p) 75 * // *** IDirect3D methods *** // 76 * #define IDirect3D_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) 77 * #define IDirect3D_EnumDevices(p,a,b) (p)->lpVtbl->EnumDevice(p,a,b) 78 * #define IDirect3D_CreateLight(p,a,b) (p)->lpVtbl->CreateLight(p,a,b) 79 * #define IDirect3D_CreateMaterial(p,a,b) (p)->lpVtbl->CreateMaterial(p,a,b) 80 * #define IDirect3D_CreateViewport(p,a,b) (p)->lpVtbl->CreateViewport(p,a,b) 81 * #define IDirect3D_FindDevice(p,a,b) (p)->lpVtbl->FindDevice(p,a,b) 82 * #endif 83 * 84 * Comments: 85 * - The INTERFACE macro is used in the STDMETHOD macros to define the type of the 'this' 86 * pointer. Defining this macro here saves us the trouble of having to repeat the interface 87 * name everywhere. Note however that because of the way macros work, a macro like STDMETHOD 88 * cannot use 'INTERFACE##_VTABLE' because this would give 'INTERFACE_VTABLE' and not 89 * 'IDirect3D_VTABLE'. 90 * - The DECLARE_INTERFACE declares all the structures necessary for the interface. We have to 91 * explicitly use the interface name for macro expansion reasons again. It defines the list of 92 * methods that are inheritable from this interface. It must be written manually (rather than 93 * using a macro to generate the equivalent code) to avoid macro recursion (which compilers 94 * don't like). It must start with the methods definition of the parent interface so that 95 * method inheritance works properly. 96 * - The 'undef INTERFACE' is here to remind you that using INTERFACE in the following macros 97 * will not work. 98 * - Finally the set of 'IDirect3D_Xxx' macros is a standard set of macros defined to ease access 99 * to the interface methods in C. Unfortunately I don't see any way to avoid having to duplicate 100 * the inherited method definitions there. This time I could have used a trick to use only one 101 * macro whatever the number of parameters but I preferred to have it work the same way as above. 102 * - You probably have noticed that we don't define the fields we need to actually implement this 103 * interface: reference count, pointer to other resources and miscellaneous fields. That's 104 * because these interfaces are just that: interfaces. They may be implemented more than once, in 105 * different contexts and sometimes not even in Wine. Thus it would not make sense to impose 106 * that the interface contains some specific fields. 107 * 108 * 109 * In C this gives: 110 * typedef struct IDirect3DVtbl IDirect3DVtbl; 111 * struct IDirect3D { 112 * IDirect3DVtbl* lpVtbl; 113 * }; 114 * struct IDirect3DVtbl { 115 * HRESULT (*QueryInterface)(IDirect3D* me, REFIID riid, LPVOID* ppvObj); 116 * ULONG (*AddRef)(IDirect3D* me); 117 * ULONG (*Release)(IDirect3D* me); 118 * HRESULT (*Initialize)(IDirect3D* me, REFIID a); 119 * HRESULT (*EnumDevices)(IDirect3D* me, LPD3DENUMDEVICESCALLBACK a, LPVOID b); 120 * HRESULT (*CreateLight)(IDirect3D* me, LPDIRECT3DLIGHT* a, IUnknown* b); 121 * HRESULT (*CreateMaterial)(IDirect3D* me, LPDIRECT3DMATERIAL* a, IUnknown* b); 122 * HRESULT (*CreateViewport)(IDirect3D* me, LPDIRECT3DVIEWPORT* a, IUnknown* b); 123 * HRESULT (*FindDevice)(IDirect3D* me, LPD3DFINDDEVICESEARCH a, LPD3DFINDDEVICERESULT b); 124 * }; 125 * 126 * #ifdef COBJMACROS 127 * // *** IUnknown methods *** // 128 * #define IDirect3D_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) 129 * #define IDirect3D_AddRef(p) (p)->lpVtbl->AddRef(p) 130 * #define IDirect3D_Release(p) (p)->lpVtbl->Release(p) 131 * // *** IDirect3D methods *** // 132 * #define IDirect3D_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) 133 * #define IDirect3D_EnumDevices(p,a,b) (p)->lpVtbl->EnumDevice(p,a,b) 134 * #define IDirect3D_CreateLight(p,a,b) (p)->lpVtbl->CreateLight(p,a,b) 135 * #define IDirect3D_CreateMaterial(p,a,b) (p)->lpVtbl->CreateMaterial(p,a,b) 136 * #define IDirect3D_CreateViewport(p,a,b) (p)->lpVtbl->CreateViewport(p,a,b) 137 * #define IDirect3D_FindDevice(p,a,b) (p)->lpVtbl->FindDevice(p,a,b) 138 * #endif 139 * 140 * Comments: 141 * - IDirect3D only contains a pointer to the IDirect3D virtual/jump table. This is the only thing 142 * the user needs to know to use the interface. Of course the structure we will define to 143 * implement this interface will have more fields but the first one will match this pointer. 144 * - The code generated by DECLARE_INTERFACE defines both the structure representing the interface and 145 * the structure for the jump table. 146 * - Each method is declared as a pointer to function field in the jump table. The implementation 147 * will fill this jump table with appropriate values, probably using a static variable, and 148 * initialize the lpVtbl field to point to this variable. 149 * - The IDirect3D_Xxx macros then just derefence the lpVtbl pointer and use the function pointer 150 * corresponding to the macro name. This emulates the behavior of a virtual table and should be 151 * just as fast. 152 * - This C code should be quite compatible with the Windows headers both for code that uses COM 153 * interfaces and for code implementing a COM interface. 154 * 155 * 156 * And in C++ (with gcc's g++): 157 * 158 * typedef struct IDirect3D: public IUnknown { 159 * virtual HRESULT Initialize(REFIID a) = 0; 160 * virtual HRESULT EnumDevices(LPD3DENUMDEVICESCALLBACK a, LPVOID b) = 0; 161 * virtual HRESULT CreateLight(LPDIRECT3DLIGHT* a, IUnknown* b) = 0; 162 * virtual HRESULT CreateMaterial(LPDIRECT3DMATERIAL* a, IUnknown* b) = 0; 163 * virtual HRESULT CreateViewport(LPDIRECT3DVIEWPORT* a, IUnknown* b) = 0; 164 * virtual HRESULT FindDevice(LPD3DFINDDEVICESEARCH a, LPD3DFINDDEVICERESULT b) = 0; 165 * }; 166 * 167 * Comments: 168 * - Of course in C++ we use inheritance so that we don't have to duplicate the method definitions. 169 * - Finally there is no IDirect3D_Xxx macro. These are not needed in C++ unless the CINTERFACE 170 * macro is defined in which case we would not be here. 171 */ 172 173#if defined(__cplusplus) && !defined(CINTERFACE) 174 175/* C++ interface */ 176 177#define STDMETHOD(method) virtual HRESULT STDMETHODCALLTYPE method 178#define STDMETHOD_(type,method) virtual type STDMETHODCALLTYPE method 179#define STDMETHODV(method) virtual HRESULT STDMETHODVCALLTYPE method 180#define STDMETHODV_(type,method) virtual type STDMETHODVCALLTYPE method 181 182#define PURE = 0 183#define THIS_ 184#define THIS void 185 186#define interface struct 187#define DECLARE_INTERFACE(iface) interface DECLSPEC_NOVTABLE iface 188#define DECLARE_INTERFACE_(iface,ibase) interface DECLSPEC_NOVTABLE iface : public ibase 189#define DECLARE_INTERFACE_IID_(iface, ibase, iid) interface DECLSPEC_UUID(iid) DECLSPEC_NOVTABLE iface : public ibase 190 191#define BEGIN_INTERFACE 192#define END_INTERFACE 193 194#else /* __cplusplus && !CINTERFACE */ 195 196/* C interface */ 197 198#define STDMETHOD(method) HRESULT (STDMETHODCALLTYPE *method) 199#define STDMETHOD_(type,method) type (STDMETHODCALLTYPE *method) 200#define STDMETHODV(method) HRESULT (STDMETHODVCALLTYPE *method) 201#define STDMETHODV_(type,method) type (STDMETHODVCALLTYPE *method) 202 203#define PURE 204#define THIS_ INTERFACE *This, 205#define THIS INTERFACE *This 206 207#define interface struct 208 209#ifdef __WINESRC__ 210#define CONST_VTABLE 211#endif 212 213#ifdef CONST_VTABLE 214#undef CONST_VTBL 215#define CONST_VTBL const 216#define DECLARE_INTERFACE(iface) \ 217 typedef interface iface { const struct iface##Vtbl *lpVtbl; } iface; \ 218 typedef struct iface##Vtbl iface##Vtbl; \ 219 struct iface##Vtbl 220#else 221#undef CONST_VTBL 222#define CONST_VTBL 223#define DECLARE_INTERFACE(iface) \ 224 typedef interface iface { struct iface##Vtbl *lpVtbl; } iface; \ 225 typedef struct iface##Vtbl iface##Vtbl; \ 226 struct iface##Vtbl 227#endif 228#define DECLARE_INTERFACE_(iface,ibase) DECLARE_INTERFACE(iface) 229#define DECLARE_INTERFACE_IID_(iface, ibase, iid) DECLARE_INTERFACE_(iface, ibase) 230 231#define BEGIN_INTERFACE 232#define END_INTERFACE 233 234#endif /* __cplusplus && !CINTERFACE */ 235 236#ifndef __IRpcStubBuffer_FWD_DEFINED__ 237#define __IRpcStubBuffer_FWD_DEFINED__ 238typedef interface IRpcStubBuffer IRpcStubBuffer; 239#endif 240#ifndef __IRpcChannelBuffer_FWD_DEFINED__ 241#define __IRpcChannelBuffer_FWD_DEFINED__ 242typedef interface IRpcChannelBuffer IRpcChannelBuffer; 243#endif 244 245#ifndef RC_INVOKED 246/* For compatibility only, at least for now */ 247#include <stdlib.h> 248#endif 249 250#include <wtypes.h> 251#include <unknwn.h> 252#include <objidl.h> 253 254#include <guiddef.h> 255#ifndef INITGUID 256#include <cguid.h> 257#endif 258 259#ifdef __cplusplus 260extern "C" { 261#endif 262 263#ifndef NONAMELESSSTRUCT 264#define LISet32(li, v) ((li).HighPart = (v) < 0 ? -1 : 0, (li).LowPart = (v)) 265#define ULISet32(li, v) ((li).HighPart = 0, (li).LowPart = (v)) 266#else 267#define LISet32(li, v) ((li).u.HighPart = (v) < 0 ? -1 : 0, (li).u.LowPart = (v)) 268#define ULISet32(li, v) ((li).u.HighPart = 0, (li).u.LowPart = (v)) 269#endif 270 271/***************************************************************************** 272 * Standard API 273 */ 274DWORD WINAPI CoBuildVersion(void); 275 276typedef enum tagCOINIT 277{ 278 COINIT_APARTMENTTHREADED = 0x2, /* Apartment model */ 279 COINIT_MULTITHREADED = 0x0, /* OLE calls objects on any thread */ 280 COINIT_DISABLE_OLE1DDE = 0x4, /* Don't use DDE for Ole1 support */ 281 COINIT_SPEED_OVER_MEMORY = 0x8 /* Trade memory for speed */ 282} COINIT; 283 284_Check_return_ HRESULT WINAPI CoInitialize(_In_opt_ LPVOID lpReserved); 285 286_Check_return_ 287HRESULT 288WINAPI 289CoInitializeEx( 290 _In_opt_ LPVOID lpReserved, 291 _In_ DWORD dwCoInit); 292 293void WINAPI CoUninitialize(void); 294DWORD WINAPI CoGetCurrentProcess(void); 295HRESULT WINAPI CoGetCurrentLogicalThreadId(_Out_ GUID *id); 296HRESULT WINAPI CoGetApartmentType(_Out_ APTTYPE *type, _Out_ APTTYPEQUALIFIER *qualifier); 297 298HINSTANCE WINAPI CoLoadLibrary(_In_ LPOLESTR lpszLibName, _In_ BOOL bAutoFree); 299void WINAPI CoFreeAllLibraries(void); 300void WINAPI CoFreeLibrary(_In_ HINSTANCE hLibrary); 301void WINAPI CoFreeUnusedLibraries(void); 302 303void 304WINAPI 305CoFreeUnusedLibrariesEx( 306 _In_ DWORD dwUnloadDelay, 307 _In_ DWORD dwReserved); 308 309_Check_return_ 310HRESULT 311WINAPI 312CoCreateInstance( 313 _In_ REFCLSID rclsid, 314 _In_opt_ LPUNKNOWN pUnkOuter, 315 _In_ DWORD dwClsContext, 316 _In_ REFIID iid, 317 _Outptr_ _At_(*ppv, _Post_readable_size_(_Inexpressible_(varies))) LPVOID *ppv); 318 319_Check_return_ 320HRESULT 321WINAPI 322CoCreateInstanceEx( 323 _In_ REFCLSID rclsid, 324 _In_opt_ LPUNKNOWN pUnkOuter, 325 _In_ DWORD dwClsContext, 326 _In_opt_ COSERVERINFO *pServerInfo, 327 _In_ ULONG cmq, 328 _Inout_updates_(cmq) MULTI_QI *pResults); 329 330_Check_return_ 331HRESULT 332WINAPI 333CoGetInstanceFromFile( 334 _In_opt_ COSERVERINFO *pServerInfo, 335 _In_opt_ CLSID *pClsid, 336 _In_opt_ IUnknown *punkOuter, 337 _In_ DWORD dwClsCtx, 338 _In_ DWORD grfMode, 339 _In_ _Null_terminated_ OLECHAR *pwszName, 340 _In_ DWORD dwCount, 341 _Inout_updates_(dwCount) MULTI_QI *pResults); 342 343_Check_return_ 344HRESULT 345WINAPI 346CoGetInstanceFromIStorage( 347 _In_opt_ COSERVERINFO *pServerInfo, 348 _In_opt_ CLSID *pClsid, 349 _In_opt_ IUnknown *punkOuter, 350 _In_ DWORD dwClsCtx, 351 _In_ IStorage *pstg, 352 _In_ DWORD dwCount, 353 _Inout_updates_(dwCount) MULTI_QI *pResults); 354 355_Check_return_ 356HRESULT 357WINAPI 358CoGetMalloc( 359 _In_ DWORD dwMemContext, 360 _Outptr_ LPMALLOC *lpMalloc); 361 362_Ret_opt_ 363_Post_writable_byte_size_(size) 364__drv_allocatesMem(Mem) 365_Check_return_ 366LPVOID 367WINAPI 368CoTaskMemAlloc(_In_ SIZE_T size) __WINE_ALLOC_SIZE(1); 369 370void 371WINAPI 372CoTaskMemFree( 373 _In_opt_ __drv_freesMem(Mem) _Post_invalid_ LPVOID ptr); 374 375_Ret_opt_ 376_Post_writable_byte_size_(size) 377_When_(size > 0, __drv_allocatesMem(Mem) _Check_return_) 378LPVOID 379WINAPI 380CoTaskMemRealloc( 381 _In_opt_ __drv_freesMem(Mem) _Post_invalid_ LPVOID ptr, 382 _In_ SIZE_T size); 383 384HRESULT WINAPI CoRegisterMallocSpy(_In_ LPMALLOCSPY pMallocSpy); 385HRESULT WINAPI CoRevokeMallocSpy(void); 386 387_Check_return_ HRESULT WINAPI CoGetContextToken(_Out_ ULONG_PTR *token); 388 389/* class registration flags; passed to CoRegisterClassObject */ 390typedef enum tagREGCLS 391{ 392 REGCLS_SINGLEUSE = 0, 393 REGCLS_MULTIPLEUSE = 1, 394 REGCLS_MULTI_SEPARATE = 2, 395 REGCLS_SUSPENDED = 4, 396 REGCLS_SURROGATE = 8 397} REGCLS; 398 399_Check_return_ 400HRESULT 401WINAPI 402CoGetClassObject( 403 _In_ REFCLSID rclsid, 404 _In_ DWORD dwClsContext, 405 _In_opt_ COSERVERINFO *pServerInfo, 406 _In_ REFIID iid, 407 _Outptr_ LPVOID *ppv); 408 409_Check_return_ 410HRESULT 411WINAPI 412CoRegisterClassObject( 413 _In_ REFCLSID rclsid, 414 _In_ LPUNKNOWN pUnk, 415 _In_ DWORD dwClsContext, 416 _In_ DWORD flags, 417 _Out_ LPDWORD lpdwRegister); 418 419_Check_return_ 420HRESULT 421WINAPI 422CoRevokeClassObject( 423 _In_ DWORD dwRegister); 424 425_Check_return_ 426HRESULT 427WINAPI 428CoGetPSClsid( 429 _In_ REFIID riid, 430 _Out_ CLSID *pclsid); 431 432_Check_return_ 433HRESULT 434WINAPI 435CoRegisterPSClsid( 436 _In_ REFIID riid, 437 _In_ REFCLSID rclsid); 438 439_Check_return_ HRESULT WINAPI CoRegisterSurrogate(_In_ LPSURROGATE pSurrogate); 440_Check_return_ HRESULT WINAPI CoSuspendClassObjects(void); 441_Check_return_ HRESULT WINAPI CoResumeClassObjects(void); 442ULONG WINAPI CoAddRefServerProcess(void); 443ULONG WINAPI CoReleaseServerProcess(void); 444 445/* marshalling */ 446 447_Check_return_ 448HRESULT 449WINAPI 450CoCreateFreeThreadedMarshaler( 451 _In_opt_ LPUNKNOWN punkOuter, 452 _Outptr_ LPUNKNOWN *ppunkMarshal); 453 454_Check_return_ 455HRESULT 456WINAPI 457CoGetInterfaceAndReleaseStream( 458 _In_ LPSTREAM pStm, 459 _In_ REFIID iid, 460 _Outptr_ LPVOID *ppv); 461 462_Check_return_ 463HRESULT 464WINAPI 465CoGetMarshalSizeMax( 466 _Out_ ULONG *pulSize, 467 _In_ REFIID riid, 468 _In_ LPUNKNOWN pUnk, 469 _In_ DWORD dwDestContext, 470 _In_opt_ LPVOID pvDestContext, 471 _In_ DWORD mshlflags); 472 473_Check_return_ 474HRESULT 475WINAPI 476CoGetStandardMarshal( 477 _In_ REFIID riid, 478 _In_ LPUNKNOWN pUnk, 479 _In_ DWORD dwDestContext, 480 _In_opt_ LPVOID pvDestContext, 481 _In_ DWORD mshlflags, 482 _Outptr_ LPMARSHAL *ppMarshal); 483 484HRESULT WINAPI CoMarshalHresult(_In_ LPSTREAM pstm, _In_ HRESULT hresult); 485 486_Check_return_ 487HRESULT 488WINAPI 489CoMarshalInterface( 490 _In_ LPSTREAM pStm, 491 _In_ REFIID riid, 492 _In_ LPUNKNOWN pUnk, 493 _In_ DWORD dwDestContext, 494 _In_opt_ LPVOID pvDestContext, 495 _In_ DWORD mshlflags); 496 497_Check_return_ 498HRESULT 499WINAPI 500CoMarshalInterThreadInterfaceInStream( 501 _In_ REFIID riid, 502 _In_ LPUNKNOWN pUnk, 503 _Outptr_ LPSTREAM *ppStm); 504 505_Check_return_ HRESULT WINAPI CoReleaseMarshalData(_In_ LPSTREAM pStm); 506 507_Check_return_ 508HRESULT 509WINAPI 510CoDisconnectObject( 511 _In_ LPUNKNOWN lpUnk, 512 _In_ DWORD reserved); 513 514HRESULT WINAPI CoUnmarshalHresult(_In_ LPSTREAM pstm, _Out_ HRESULT *phresult); 515 516_Check_return_ 517HRESULT 518WINAPI 519CoUnmarshalInterface( 520 _In_ LPSTREAM pStm, 521 _In_ REFIID riid, 522 _Outptr_ LPVOID *ppv); 523 524_Check_return_ 525HRESULT 526WINAPI 527CoLockObjectExternal( 528 _In_ LPUNKNOWN pUnk, 529 _In_ BOOL fLock, 530 _In_ BOOL fLastUnlockReleases); 531 532BOOL WINAPI CoIsHandlerConnected(_In_ LPUNKNOWN pUnk); 533 534/* security */ 535 536_Check_return_ 537HRESULT 538WINAPI 539CoInitializeSecurity( 540 _In_opt_ PSECURITY_DESCRIPTOR pSecDesc, 541 _In_ LONG cAuthSvc, 542 _In_reads_opt_(cAuthSvc) SOLE_AUTHENTICATION_SERVICE *asAuthSvc, 543 _In_opt_ void *pReserved1, 544 _In_ DWORD dwAuthnLevel, 545 _In_ DWORD dwImpLevel, 546 _In_opt_ void *pReserved2, 547 _In_ DWORD dwCapabilities, 548 _In_opt_ void *pReserved3); 549 550_Check_return_ 551HRESULT 552WINAPI 553CoGetCallContext( 554 _In_ REFIID riid, 555 _Outptr_ void **ppInterface); 556 557_Check_return_ 558HRESULT 559WINAPI 560CoSwitchCallContext( 561 _In_opt_ IUnknown *pContext, 562 _Outptr_ IUnknown **ppOldContext); 563 564_Check_return_ 565HRESULT 566WINAPI 567CoQueryAuthenticationServices( 568 _Out_ DWORD *pcAuthSvc, 569 _Outptr_result_buffer_(*pcAuthSvc) SOLE_AUTHENTICATION_SERVICE **asAuthSvc); 570 571_Check_return_ 572HRESULT 573WINAPI 574CoQueryProxyBlanket( 575 _In_ IUnknown *pProxy, 576 _Out_opt_ DWORD *pwAuthnSvc, 577 _Out_opt_ DWORD *pAuthzSvc, 578 _Outptr_opt_ OLECHAR **pServerPrincName, 579 _Out_opt_ DWORD *pAuthnLevel, 580 _Out_opt_ DWORD *pImpLevel, 581 _Out_opt_ RPC_AUTH_IDENTITY_HANDLE *pAuthInfo, 582 _Out_opt_ DWORD *pCapabilities); 583 584_Check_return_ 585HRESULT 586WINAPI 587CoSetProxyBlanket( 588 _In_ IUnknown *pProxy, 589 _In_ DWORD dwAuthnSvc, 590 _In_ DWORD dwAuthzSvc, 591 _In_opt_ OLECHAR *pServerPrincName, 592 _In_ DWORD dwAuthnLevel, 593 _In_ DWORD dwImpLevel, 594 _In_opt_ RPC_AUTH_IDENTITY_HANDLE pAuthInfo, 595 _In_ DWORD dwCapabilities); 596 597_Check_return_ 598HRESULT 599WINAPI CoCopyProxy( 600 _In_ IUnknown *pProxy, 601 _Outptr_ IUnknown **ppCopy); 602 603_Check_return_ HRESULT WINAPI CoImpersonateClient(void); 604 605_Check_return_ 606HRESULT 607WINAPI 608CoQueryClientBlanket( 609 _Out_opt_ DWORD *pAuthnSvc, 610 _Out_opt_ DWORD *pAuthzSvc, 611 _Outptr_opt_ OLECHAR **pServerPrincName, 612 _Out_opt_ DWORD *pAuthnLevel, 613 _Out_opt_ DWORD *pImpLevel, 614 _Outptr_opt_ RPC_AUTHZ_HANDLE *pPrivs, 615 _Inout_opt_ DWORD *pCapabilities); 616 617_Check_return_ HRESULT WINAPI CoRevertToSelf(void); 618 619/* misc */ 620 621_Check_return_ 622HRESULT 623WINAPI 624CoGetTreatAsClass( 625 _In_ REFCLSID clsidOld, 626 _Out_ LPCLSID pClsidNew); 627 628_Check_return_ 629HRESULT 630WINAPI 631CoTreatAsClass( 632 _In_ REFCLSID clsidOld, 633 _In_ REFCLSID clsidNew); 634 635HRESULT 636WINAPI 637CoAllowSetForegroundWindow( 638 _In_ IUnknown *pUnk, 639 _In_opt_ LPVOID lpvReserved); 640 641_Check_return_ 642HRESULT 643WINAPI 644CoGetObjectContext( 645 _In_ REFIID riid, 646 _Outptr_ LPVOID *ppv); 647 648_Check_return_ 649HRESULT 650WINAPI 651CoRegisterInitializeSpy( 652 _In_ IInitializeSpy *spy, 653 _Out_ ULARGE_INTEGER *cookie); 654 655_Check_return_ 656HRESULT 657WINAPI 658CoRevokeInitializeSpy( 659 _In_ ULARGE_INTEGER cookie); 660 661_Check_return_ HRESULT WINAPI CoCreateGuid(_Out_ GUID *pguid); 662BOOL WINAPI CoIsOle1Class(_In_ REFCLSID rclsid); 663 664BOOL 665WINAPI 666CoDosDateTimeToFileTime( 667 _In_ WORD nDosDate, 668 _In_ WORD nDosTime, 669 _Out_ FILETIME *lpFileTime); 670 671BOOL 672WINAPI 673CoFileTimeToDosDateTime( 674 _In_ FILETIME *lpFileTime, 675 _Out_ WORD *lpDosDate, 676 _Out_ WORD *lpDosTime); 677 678HRESULT WINAPI CoFileTimeNow(_Out_ FILETIME *lpFileTime); 679 680_Check_return_ 681HRESULT 682WINAPI 683CoRegisterMessageFilter( 684 _In_opt_ LPMESSAGEFILTER lpMessageFilter, 685 _Outptr_opt_result_maybenull_ LPMESSAGEFILTER *lplpMessageFilter); 686 687HRESULT 688WINAPI 689CoRegisterChannelHook( 690 _In_ REFGUID ExtensionGuid, 691 _In_ IChannelHook *pChannelHook); 692 693typedef enum tagCOWAIT_FLAGS 694{ 695 COWAIT_DEFAULT = 0x00000000, 696 COWAIT_WAITALL = 0x00000001, 697 COWAIT_ALERTABLE = 0x00000002, 698 COWAIT_INPUTAVAILABLE = 0x00000004 699} COWAIT_FLAGS; 700 701_Check_return_ 702HRESULT 703WINAPI 704CoWaitForMultipleHandles( 705 _In_ DWORD dwFlags, 706 _In_ DWORD dwTimeout, 707 _In_ ULONG cHandles, 708 _In_reads_(cHandles) LPHANDLE pHandles, 709 _Out_ LPDWORD lpdwindex); 710 711/***************************************************************************** 712 * GUID API 713 */ 714 715_Check_return_ 716HRESULT 717WINAPI 718StringFromCLSID( 719 _In_ REFCLSID id, 720 _Outptr_ LPOLESTR*); 721 722_Check_return_ 723HRESULT 724WINAPI 725CLSIDFromString( 726 _In_ LPCOLESTR, 727 _Out_ LPCLSID); 728 729_Check_return_ 730HRESULT 731WINAPI 732CLSIDFromProgID( 733 _In_ LPCOLESTR progid, 734 _Out_ LPCLSID riid); 735 736_Check_return_ 737HRESULT 738WINAPI 739ProgIDFromCLSID( 740 _In_ REFCLSID clsid, 741 _Outptr_ LPOLESTR *lplpszProgID); 742 743_Check_return_ 744INT 745WINAPI 746StringFromGUID2( 747 _In_ REFGUID id, 748 _Out_writes_to_(cmax, return) LPOLESTR str, 749 _In_ INT cmax); 750 751_Check_return_ 752HRESULT 753WINAPI 754IIDFromString( 755 _In_ LPCOLESTR lpsz, 756 _Out_ LPIID lpiid); 757 758/***************************************************************************** 759 * COM Server dll - exports 760 */ 761 762_Check_return_ 763HRESULT 764WINAPI 765DllGetClassObject( 766 _In_ REFCLSID rclsid, 767 _In_ REFIID riid, 768 _Outptr_ LPVOID *ppv) DECLSPEC_HIDDEN; 769 770HRESULT WINAPI DllCanUnloadNow(void) DECLSPEC_HIDDEN; 771 772/* shouldn't be here, but is nice for type checking */ 773#ifdef __WINESRC__ 774HRESULT WINAPI DllRegisterServer(void) DECLSPEC_HIDDEN; 775HRESULT WINAPI DllUnregisterServer(void) DECLSPEC_HIDDEN; 776#endif 777 778 779/***************************************************************************** 780 * Data Object 781 */ 782 783HRESULT 784WINAPI 785CreateDataAdviseHolder( 786 _Outptr_ LPDATAADVISEHOLDER *ppDAHolder); 787 788HRESULT 789WINAPI 790CreateDataCache( 791 _In_opt_ LPUNKNOWN pUnkOuter, 792 _In_ REFCLSID rclsid, 793 _In_ REFIID iid, 794 _Out_ LPVOID *ppv); 795 796/***************************************************************************** 797 * Moniker API 798 */ 799 800_Check_return_ 801HRESULT 802WINAPI 803BindMoniker( 804 _In_ LPMONIKER pmk, 805 _In_ DWORD grfOpt, 806 _In_ REFIID iidResult, 807 _Outptr_ LPVOID *ppvResult); 808 809_Check_return_ 810HRESULT 811WINAPI 812CoGetObject( 813 _In_ LPCWSTR pszName, 814 _In_opt_ BIND_OPTS *pBindOptions, 815 _In_ REFIID riid, 816 _Outptr_ void **ppv); 817 818_Check_return_ HRESULT WINAPI CreateAntiMoniker(_Outptr_ LPMONIKER *ppmk); 819 820_Check_return_ 821HRESULT 822WINAPI 823CreateBindCtx( 824 _In_ DWORD reserved, 825 _Outptr_ LPBC *ppbc); 826 827_Check_return_ 828HRESULT 829WINAPI 830CreateClassMoniker( 831 _In_ REFCLSID rclsid, 832 _Outptr_ LPMONIKER *ppmk); 833 834_Check_return_ 835HRESULT 836WINAPI 837CreateFileMoniker( 838 _In_ LPCOLESTR lpszPathName, 839 _Outptr_ LPMONIKER *ppmk); 840 841_Check_return_ 842HRESULT 843WINAPI 844CreateGenericComposite( 845 _In_opt_ LPMONIKER pmkFirst, 846 _In_opt_ LPMONIKER pmkRest, 847 _Outptr_ LPMONIKER *ppmkComposite); 848 849_Check_return_ 850HRESULT 851WINAPI 852CreateItemMoniker( 853 _In_ LPCOLESTR lpszDelim, 854 _In_ LPCOLESTR lpszItem, 855 _Outptr_ LPMONIKER *ppmk); 856 857_Check_return_ 858HRESULT 859WINAPI 860CreateObjrefMoniker( 861 _In_opt_ LPUNKNOWN punk, 862 _Outptr_ LPMONIKER *ppmk); 863 864_Check_return_ 865HRESULT 866WINAPI 867CreatePointerMoniker( 868 _In_opt_ LPUNKNOWN punk, 869 _Outptr_ LPMONIKER *ppmk); 870 871_Check_return_ 872HRESULT 873WINAPI 874GetClassFile( 875 _In_ LPCOLESTR filePathName, 876 _Out_ CLSID *pclsid); 877 878_Check_return_ 879HRESULT 880WINAPI 881GetRunningObjectTable( 882 _In_ DWORD reserved, 883 _Outptr_ LPRUNNINGOBJECTTABLE *pprot); 884 885_Check_return_ 886HRESULT 887WINAPI 888MkParseDisplayName( 889 _In_ LPBC pbc, 890 _In_ LPCOLESTR szUserName, 891 _Out_ ULONG *pchEaten, 892 _Outptr_ LPMONIKER *ppmk); 893 894_Check_return_ 895HRESULT 896WINAPI 897MonikerCommonPrefixWith( 898 _In_ IMoniker *pmkThis, 899 _In_ IMoniker *pmkOther, 900 _Outptr_ IMoniker **ppmkCommon); 901 902_Check_return_ 903HRESULT 904WINAPI 905MonikerRelativePathTo( 906 _In_ LPMONIKER pmkSrc, 907 _In_ LPMONIKER pmkDest, 908 _Outptr_ LPMONIKER *ppmkRelPath, 909 _In_ BOOL dwReserved); 910 911/***************************************************************************** 912 * Storage API 913 */ 914#define STGM_DIRECT 0x00000000 915#define STGM_TRANSACTED 0x00010000 916#define STGM_SIMPLE 0x08000000 917#define STGM_READ 0x00000000 918#define STGM_WRITE 0x00000001 919#define STGM_READWRITE 0x00000002 920#define STGM_SHARE_DENY_NONE 0x00000040 921#define STGM_SHARE_DENY_READ 0x00000030 922#define STGM_SHARE_DENY_WRITE 0x00000020 923#define STGM_SHARE_EXCLUSIVE 0x00000010 924#define STGM_PRIORITY 0x00040000 925#define STGM_DELETEONRELEASE 0x04000000 926#define STGM_CREATE 0x00001000 927#define STGM_CONVERT 0x00020000 928#define STGM_FAILIFTHERE 0x00000000 929#define STGM_NOSCRATCH 0x00100000 930#define STGM_NOSNAPSHOT 0x00200000 931#define STGM_DIRECT_SWMR 0x00400000 932 933#define STGFMT_STORAGE 0 934#define STGFMT_FILE 3 935#define STGFMT_ANY 4 936#define STGFMT_DOCFILE 5 937 938typedef struct tagSTGOPTIONS 939{ 940 USHORT usVersion; 941 USHORT reserved; 942 ULONG ulSectorSize; 943 const WCHAR* pwcsTemplateFile; 944} STGOPTIONS; 945 946_Check_return_ 947HRESULT 948WINAPI 949StringFromIID( 950 _In_ REFIID rclsid, 951 _Outptr_ LPOLESTR *lplpsz); 952 953_Check_return_ 954HRESULT 955WINAPI 956StgCreateDocfile( 957 _In_opt_ _Null_terminated_ LPCOLESTR pwcsName, 958 _In_ DWORD grfMode, 959 _Reserved_ DWORD reserved, 960 _Outptr_ IStorage **ppstgOpen); 961 962_Check_return_ 963HRESULT 964WINAPI 965StgCreateStorageEx( 966 _In_opt_ _Null_terminated_ const WCHAR*, 967 _In_ DWORD, 968 _In_ DWORD, 969 _In_ DWORD, 970 _Inout_opt_ STGOPTIONS*, 971 _In_opt_ void*, 972 _In_ REFIID, 973 _Outptr_ void**); 974 975_Check_return_ 976HRESULT 977WINAPI 978StgIsStorageFile( 979 _In_ _Null_terminated_ LPCOLESTR fn); 980 981_Check_return_ 982HRESULT 983WINAPI 984StgIsStorageILockBytes( 985 _In_ ILockBytes *plkbyt); 986 987_Check_return_ 988HRESULT 989WINAPI 990StgOpenStorage( 991 _In_opt_ _Null_terminated_ const OLECHAR *pwcsName, 992 _In_opt_ IStorage *pstgPriority, 993 _In_ DWORD grfMode, 994 _In_opt_z_ SNB snbExclude, 995 _In_ DWORD reserved, 996 _Outptr_ IStorage **ppstgOpen); 997 998_Check_return_ 999HRESULT 1000WINAPI 1001StgOpenStorageEx( 1002 _In_ _Null_terminated_ const WCHAR *pwcwName, 1003 _In_ DWORD grfMode, 1004 _In_ DWORD stgfmt, 1005 _In_ DWORD grfAttrs, 1006 _Inout_opt_ STGOPTIONS *pStgOptions, 1007 _In_opt_ void *reserved, 1008 _In_ REFIID riid, 1009 _Outptr_ void **ppObjectOpen); 1010 1011_Check_return_ 1012HRESULT 1013WINAPI 1014StgCreateDocfileOnILockBytes( 1015 _In_ ILockBytes *plkbyt, 1016 _In_ DWORD grfMode, 1017 _In_ DWORD reserved, 1018 _Outptr_ IStorage **ppstgOpen); 1019 1020_Check_return_ 1021HRESULT 1022WINAPI 1023StgOpenStorageOnILockBytes( 1024 _In_ ILockBytes *plkbyt, 1025 _In_opt_ IStorage *pstgPriority, 1026 _In_ DWORD grfMode, 1027 _In_opt_z_ SNB snbExclude, 1028 _Reserved_ DWORD reserved, 1029 _Outptr_ IStorage **ppstgOpen); 1030 1031_Check_return_ 1032HRESULT 1033WINAPI 1034StgSetTimes( 1035 _In_ _Null_terminated_ OLECHAR const *lpszName, 1036 _In_opt_ FILETIME const *pctime, 1037 _In_opt_ FILETIME const *patime, 1038 _In_opt_ FILETIME const *pmtime); 1039 1040#ifdef __cplusplus 1041} 1042#endif 1043 1044#ifndef __WINESRC__ 1045# include <urlmon.h> 1046#endif 1047#include <propidl.h> 1048 1049#ifndef __WINESRC__ 1050 1051#define FARSTRUCT 1052#define HUGEP 1053 1054#define WINOLEAPI STDAPI 1055#define WINOLEAPI_(type) STDAPI_(type) 1056 1057#endif /* __WINESRC__ */ 1058 1059#endif /* _OBJBASE_H_ */