Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 1995 Martin von Loewis |
| 3 | * Copyright 1998 Justin Bradford |
| 4 | * Copyright 1999 Francis Beaudet |
| 5 | * Copyright 1999 Sylvain St-Germain |
| 6 | * Copyright 2002 Marcus Meissner |
Ove Kaaven | ef57c4d | 2003-06-04 20:11:34 +0000 | [diff] [blame] | 7 | * Copyright 2003 Ove Kåven, TransGaming Technologies |
Alexandre Julliard | 2a46702 | 2005-02-08 12:55:26 +0000 | [diff] [blame] | 8 | * Copyright 2004 Mike Hearn, Rob Shearman, CodeWeavers Inc |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 9 | * |
| 10 | * This library is free software; you can redistribute it and/or |
| 11 | * modify it under the terms of the GNU Lesser General Public |
| 12 | * License as published by the Free Software Foundation; either |
| 13 | * version 2.1 of the License, or (at your option) any later version. |
| 14 | * |
| 15 | * This library is distributed in the hope that it will be useful, |
| 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 18 | * Lesser General Public License for more details. |
| 19 | * |
| 20 | * You should have received a copy of the GNU Lesser General Public |
| 21 | * License along with this library; if not, write to the Free Software |
| 22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 23 | */ |
| 24 | |
Francois Gouget | 3116bd9 | 2000-11-25 03:08:23 +0000 | [diff] [blame] | 25 | #ifndef __WINE_OLE_COMPOBJ_H |
| 26 | #define __WINE_OLE_COMPOBJ_H |
| 27 | |
| 28 | /* All private prototype functions used by OLE will be added to this header file */ |
| 29 | |
Alexandre Julliard | e37c6e1 | 2003-09-05 23:08:26 +0000 | [diff] [blame] | 30 | #include <stdarg.h> |
| 31 | |
Mike Hearn | 5475a2e | 2004-12-27 19:21:47 +0000 | [diff] [blame] | 32 | #include "wine/list.h" |
| 33 | |
Alexandre Julliard | e37c6e1 | 2003-09-05 23:08:26 +0000 | [diff] [blame] | 34 | #include "windef.h" |
| 35 | #include "winbase.h" |
Francois Gouget | 3116bd9 | 2000-11-25 03:08:23 +0000 | [diff] [blame] | 36 | #include "wtypes.h" |
Ove Kaaven | ef57c4d | 2003-06-04 20:11:34 +0000 | [diff] [blame] | 37 | #include "dcom.h" |
Alexandre Julliard | e37c6e1 | 2003-09-05 23:08:26 +0000 | [diff] [blame] | 38 | #include "winreg.h" |
Alexandre Julliard | 7df1b9e | 2003-08-28 19:57:35 +0000 | [diff] [blame] | 39 | #include "winternl.h" |
Ove Kaaven | ef57c4d | 2003-06-04 20:11:34 +0000 | [diff] [blame] | 40 | |
Mike Hearn | a6a416c | 2005-01-05 17:14:33 +0000 | [diff] [blame] | 41 | struct apartment; |
Mike Hearn | a6a416c | 2005-01-05 17:14:33 +0000 | [diff] [blame] | 42 | typedef struct apartment APARTMENT; |
Francois Gouget | 3116bd9 | 2000-11-25 03:08:23 +0000 | [diff] [blame] | 43 | |
Robert Shearman | c353f85 | 2005-01-11 10:45:34 +0000 | [diff] [blame] | 44 | /* Thread-safety Annotation Legend: |
| 45 | * |
Robert Shearman | 1b5ebab | 2005-03-17 10:26:20 +0000 | [diff] [blame] | 46 | * RO - The value is read only. It never changes after creation, so no |
| 47 | * locking is required. |
| 48 | * LOCK - The value is written to only using Interlocked* functions. |
| 49 | * CS - The value is read or written to inside a critical section. |
| 50 | * The identifier following "CS" is the specific critical setion that |
| 51 | * must be used. |
| 52 | * MUTEX - The value is read or written to with a mutex held. |
| 53 | * The identifier following "MUTEX" is the specific mutex that |
| 54 | * must be used. |
Robert Shearman | c353f85 | 2005-01-11 10:45:34 +0000 | [diff] [blame] | 55 | */ |
| 56 | |
Robert Shearman | 4c8d59d | 2005-01-17 13:39:40 +0000 | [diff] [blame] | 57 | typedef enum ifstub_state |
| 58 | { |
Robert Shearman | 95288f9 | 2005-02-18 20:03:23 +0000 | [diff] [blame] | 59 | STUBSTATE_NORMAL_MARSHALED, |
| 60 | STUBSTATE_NORMAL_UNMARSHALED, |
| 61 | STUBSTATE_TABLE_WEAK_MARSHALED, |
| 62 | STUBSTATE_TABLE_WEAK_UNMARSHALED, |
| 63 | STUBSTATE_TABLE_STRONG, |
| 64 | } STUB_STATE; |
Robert Shearman | 4c8d59d | 2005-01-17 13:39:40 +0000 | [diff] [blame] | 65 | |
Mike Hearn | 5475a2e | 2004-12-27 19:21:47 +0000 | [diff] [blame] | 66 | /* an interface stub */ |
| 67 | struct ifstub |
| 68 | { |
Robert Shearman | c353f85 | 2005-01-11 10:45:34 +0000 | [diff] [blame] | 69 | struct list entry; /* entry in stub_manager->ifstubs list (CS stub_manager->lock) */ |
| 70 | IRpcStubBuffer *stubbuffer; /* RO */ |
| 71 | IID iid; /* RO */ |
| 72 | IPID ipid; /* RO */ |
| 73 | IUnknown *iface; /* RO */ |
Alexandre Julliard | 611b5ac | 2005-09-02 11:18:45 +0000 | [diff] [blame] | 74 | MSHLFLAGS flags; /* so we can enforce process-local marshalling rules (RO) */ |
Robert Shearman | a02cb3e | 2006-01-10 20:08:02 +0100 | [diff] [blame] | 75 | IRpcChannelBuffer*chan; /* channel passed to IRpcStubBuffer::Invoke (RO) */ |
Mike Hearn | 5475a2e | 2004-12-27 19:21:47 +0000 | [diff] [blame] | 76 | }; |
| 77 | |
| 78 | |
| 79 | /* stub managers hold refs on the object and each interface stub */ |
| 80 | struct stub_manager |
| 81 | { |
Robert Shearman | c353f85 | 2005-01-11 10:45:34 +0000 | [diff] [blame] | 82 | struct list entry; /* entry in apartment stubmgr list (CS apt->cs) */ |
| 83 | struct list ifstubs; /* list of active ifstubs for the object (CS lock) */ |
Mike Hearn | 5475a2e | 2004-12-27 19:21:47 +0000 | [diff] [blame] | 84 | CRITICAL_SECTION lock; |
Robert Shearman | c353f85 | 2005-01-11 10:45:34 +0000 | [diff] [blame] | 85 | APARTMENT *apt; /* owning apt (RO) */ |
Mike Hearn | 5475a2e | 2004-12-27 19:21:47 +0000 | [diff] [blame] | 86 | |
Robert Shearman | 95288f9 | 2005-02-18 20:03:23 +0000 | [diff] [blame] | 87 | ULONG extrefs; /* number of 'external' references (CS lock) */ |
Robert Shearman | c353f85 | 2005-01-11 10:45:34 +0000 | [diff] [blame] | 88 | ULONG refs; /* internal reference count (CS apt->cs) */ |
| 89 | OID oid; /* apartment-scoped unique identifier (RO) */ |
| 90 | IUnknown *object; /* the object we are managing the stub for (RO) */ |
| 91 | ULONG next_ipid; /* currently unused (LOCK) */ |
Alexandre Julliard | 611b5ac | 2005-09-02 11:18:45 +0000 | [diff] [blame] | 92 | |
| 93 | /* We need to keep a count of the outstanding marshals, so we can enforce the |
| 94 | * marshalling rules (ie, you can only unmarshal normal marshals once). Note |
| 95 | * that these counts do NOT include unmarshalled interfaces, once a stream is |
| 96 | * unmarshalled and a proxy set up, this count is decremented. |
| 97 | */ |
| 98 | |
| 99 | ULONG norm_refs; /* refcount of normal marshals (CS lock) */ |
Mike Hearn | 5475a2e | 2004-12-27 19:21:47 +0000 | [diff] [blame] | 100 | }; |
| 101 | |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 102 | /* imported interface proxy */ |
| 103 | struct ifproxy |
| 104 | { |
Robert Shearman | 4c8d59d | 2005-01-17 13:39:40 +0000 | [diff] [blame] | 105 | struct list entry; /* entry in proxy_manager list (CS parent->cs) */ |
| 106 | struct proxy_manager *parent; /* owning proxy_manager (RO) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 107 | LPVOID iface; /* interface pointer (RO) */ |
Robert Shearman | dab603d | 2005-08-27 09:25:16 +0000 | [diff] [blame] | 108 | STDOBJREF stdobjref; /* marshal data that represents this object (RO) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 109 | IID iid; /* interface ID (RO) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 110 | LPRPCPROXYBUFFER proxy; /* interface proxy (RO) */ |
Robert Shearman | 1b5ebab | 2005-03-17 10:26:20 +0000 | [diff] [blame] | 111 | DWORD refs; /* imported (public) references (MUTEX parent->remoting_mutex) */ |
Robert Shearman | 527ef47 | 2005-03-07 17:14:11 +0000 | [diff] [blame] | 112 | IRpcChannelBuffer *chan; /* channel to object (CS parent->cs) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 113 | }; |
| 114 | |
| 115 | /* imported object / proxy manager */ |
| 116 | struct proxy_manager |
| 117 | { |
Robert Shearman | 3018974 | 2005-01-26 21:07:05 +0000 | [diff] [blame] | 118 | const IMultiQIVtbl *lpVtbl; |
Robert Shearman | dab603d | 2005-08-27 09:25:16 +0000 | [diff] [blame] | 119 | const IMarshalVtbl *lpVtblMarshal; |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 120 | struct apartment *parent; /* owning apartment (RO) */ |
| 121 | struct list entry; /* entry in apartment (CS parent->cs) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 122 | OXID oxid; /* object exported ID (RO) */ |
| 123 | OID oid; /* object ID (RO) */ |
| 124 | struct list interfaces; /* imported interfaces (CS cs) */ |
Mike McCormack | c7fdb45 | 2005-07-05 11:02:54 +0000 | [diff] [blame] | 125 | LONG refs; /* proxy reference count (LOCK) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 126 | CRITICAL_SECTION cs; /* thread safety for this object and children */ |
Robert Shearman | 6b89a92 | 2005-01-24 11:24:08 +0000 | [diff] [blame] | 127 | ULONG sorflags; /* STDOBJREF flags (RO) */ |
Robert Shearman | ad34f3d | 2005-01-25 10:57:24 +0000 | [diff] [blame] | 128 | IRemUnknown *remunk; /* proxy to IRemUnknown used for lifecycle management (CS cs) */ |
Robert Shearman | 1b5ebab | 2005-03-17 10:26:20 +0000 | [diff] [blame] | 129 | HANDLE remoting_mutex; /* mutex used for synchronizing access to IRemUnknown */ |
Robert Shearman | 92a1f52 | 2006-03-05 13:37:22 +0000 | [diff] [blame] | 130 | MSHCTX dest_context; /* context used for activating optimisations (LOCK) */ |
| 131 | void *dest_context_data; /* reserved context value (LOCK) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 132 | }; |
| 133 | |
| 134 | /* this needs to become a COM object that implements IRemUnknown */ |
| 135 | struct apartment |
| 136 | { |
Robert Shearman | a37a501 | 2006-02-20 11:15:57 +0100 | [diff] [blame] | 137 | struct list entry; |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 138 | |
Mike McCormack | c7fdb45 | 2005-07-05 11:02:54 +0000 | [diff] [blame] | 139 | LONG refs; /* refcount of the apartment (LOCK) */ |
Robert Shearman | a37a501 | 2006-02-20 11:15:57 +0100 | [diff] [blame] | 140 | BOOL multi_threaded; /* multi-threaded or single-threaded apartment? (RO) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 141 | DWORD tid; /* thread id (RO) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 142 | OXID oxid; /* object exporter ID (RO) */ |
Mike McCormack | c7fdb45 | 2005-07-05 11:02:54 +0000 | [diff] [blame] | 143 | LONG ipidc; /* interface pointer ID counter, starts at 1 (LOCK) */ |
Robert Shearman | cd2fafb | 2006-01-10 20:09:08 +0100 | [diff] [blame] | 144 | HWND win; /* message window (LOCK) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 145 | CRITICAL_SECTION cs; /* thread safety */ |
| 146 | LPMESSAGEFILTER filter; /* message filter (CS cs) */ |
| 147 | struct list proxies; /* imported objects (CS cs) */ |
| 148 | struct list stubmgrs; /* stub managers for exported objects (CS cs) */ |
Robert Shearman | ad34f3d | 2005-01-25 10:57:24 +0000 | [diff] [blame] | 149 | BOOL remunk_exported; /* has the IRemUnknown interface for this apartment been created yet? (CS cs) */ |
Robert Shearman | 552cc7d | 2005-02-15 15:44:25 +0000 | [diff] [blame] | 150 | LONG remoting_started; /* has the RPC system been started for this apartment? (LOCK) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 151 | |
Robert Shearman | 552cc7d | 2005-02-15 15:44:25 +0000 | [diff] [blame] | 152 | /* FIXME: OID's should be given out by RPCSS */ |
Alexandre Julliard | 2a46702 | 2005-02-08 12:55:26 +0000 | [diff] [blame] | 153 | OID oidc; /* object ID counter, starts at 1, zero is invalid OID (CS cs) */ |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 154 | }; |
| 155 | |
| 156 | /* this is what is stored in TEB->ReservedForOle */ |
| 157 | struct oletls |
| 158 | { |
| 159 | struct apartment *apt; |
| 160 | IErrorInfo *errorinfo; /* see errorinfo.c */ |
| 161 | IUnknown *state; /* see CoSetState */ |
| 162 | DWORD inits; /* number of times CoInitializeEx called */ |
| 163 | }; |
| 164 | |
Robert Shearman | 552cc7d | 2005-02-15 15:44:25 +0000 | [diff] [blame] | 165 | |
| 166 | /* Global Interface Table Functions */ |
| 167 | |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 168 | extern void* StdGlobalInterfaceTable_Construct(void); |
| 169 | extern void StdGlobalInterfaceTable_Destroy(void* self); |
| 170 | extern HRESULT StdGlobalInterfaceTable_GetFactory(LPVOID *ppv); |
Robert Shearman | 552cc7d | 2005-02-15 15:44:25 +0000 | [diff] [blame] | 171 | extern void* StdGlobalInterfaceTableInstance; |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 172 | |
| 173 | /* FIXME: these shouldn't be needed, except for 16-bit functions */ |
| 174 | extern HRESULT WINE_StringFromCLSID(const CLSID *id,LPSTR idstr); |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 175 | |
Robert Shearman | f7b65cc | 2005-11-09 10:29:11 +0000 | [diff] [blame] | 176 | HRESULT COM_OpenKeyForCLSID(REFCLSID clsid, LPCWSTR keyname, REGSAM access, HKEY *key); |
Robert Shearman | 5ce396f | 2005-01-14 17:20:27 +0000 | [diff] [blame] | 177 | HRESULT MARSHAL_GetStandardMarshalCF(LPVOID *ppv); |
| 178 | |
Robert Shearman | 552cc7d | 2005-02-15 15:44:25 +0000 | [diff] [blame] | 179 | /* Stub Manager */ |
| 180 | |
Robert Shearman | c353f85 | 2005-01-11 10:45:34 +0000 | [diff] [blame] | 181 | ULONG stub_manager_int_addref(struct stub_manager *This); |
| 182 | ULONG stub_manager_int_release(struct stub_manager *This); |
Alexandre Julliard | 611b5ac | 2005-09-02 11:18:45 +0000 | [diff] [blame] | 183 | struct stub_manager *new_stub_manager(APARTMENT *apt, IUnknown *object); |
Robert Shearman | c353f85 | 2005-01-11 10:45:34 +0000 | [diff] [blame] | 184 | ULONG stub_manager_ext_addref(struct stub_manager *m, ULONG refs); |
| 185 | ULONG stub_manager_ext_release(struct stub_manager *m, ULONG refs); |
Alexandre Julliard | 611b5ac | 2005-09-02 11:18:45 +0000 | [diff] [blame] | 186 | struct ifstub *stub_manager_new_ifstub(struct stub_manager *m, IRpcStubBuffer *sb, IUnknown *iptr, REFIID iid, MSHLFLAGS flags); |
| 187 | struct ifstub *stub_manager_find_ifstub(struct stub_manager *m, REFIID iid, MSHLFLAGS flags); |
Robert Shearman | 6036a77 | 2005-01-14 16:48:34 +0000 | [diff] [blame] | 188 | struct stub_manager *get_stub_manager(APARTMENT *apt, OID oid); |
| 189 | struct stub_manager *get_stub_manager_from_object(APARTMENT *apt, void *object); |
Alexandre Julliard | 611b5ac | 2005-09-02 11:18:45 +0000 | [diff] [blame] | 190 | BOOL stub_manager_notify_unmarshal(struct stub_manager *m, const IPID *ipid); |
| 191 | BOOL stub_manager_is_table_marshaled(struct stub_manager *m, const IPID *ipid); |
| 192 | void stub_manager_release_marshal_data(struct stub_manager *m, ULONG refs, const IPID *ipid); |
Robert Shearman | ad34f3d | 2005-01-25 10:57:24 +0000 | [diff] [blame] | 193 | HRESULT ipid_to_stub_manager(const IPID *ipid, APARTMENT **stub_apt, struct stub_manager **stubmgr_ret); |
Robert Shearman | a02cb3e | 2006-01-10 20:08:02 +0100 | [diff] [blame] | 194 | HRESULT ipid_get_dispatch_params(const IPID *ipid, APARTMENT **stub_apt, IRpcStubBuffer **stub, IRpcChannelBuffer **chan); |
Robert Shearman | ad34f3d | 2005-01-25 10:57:24 +0000 | [diff] [blame] | 195 | HRESULT start_apartment_remote_unknown(void); |
Mike Hearn | 5475a2e | 2004-12-27 19:21:47 +0000 | [diff] [blame] | 196 | |
Robert Shearman | 8971f06 | 2005-03-11 10:19:10 +0000 | [diff] [blame] | 197 | HRESULT marshal_object(APARTMENT *apt, STDOBJREF *stdobjref, REFIID riid, IUnknown *obj, MSHLFLAGS mshlflags); |
| 198 | |
Robert Shearman | 552cc7d | 2005-02-15 15:44:25 +0000 | [diff] [blame] | 199 | /* RPC Backend */ |
Mike Hearn | 5475a2e | 2004-12-27 19:21:47 +0000 | [diff] [blame] | 200 | |
Robert Shearman | 1b5ebab | 2005-03-17 10:26:20 +0000 | [diff] [blame] | 201 | struct dispatch_params; |
| 202 | |
Robert Shearman | 552cc7d | 2005-02-15 15:44:25 +0000 | [diff] [blame] | 203 | void RPC_StartRemoting(struct apartment *apt); |
Robert Shearman | 7406cc2 | 2006-03-05 13:37:34 +0000 | [diff] [blame] | 204 | HRESULT RPC_CreateClientChannel(const OXID *oxid, const IPID *ipid, |
| 205 | DWORD dest_context, void *dest_context_data, |
| 206 | IRpcChannelBuffer **chan); |
Robert Shearman | a02cb3e | 2006-01-10 20:08:02 +0100 | [diff] [blame] | 207 | HRESULT RPC_CreateServerChannel(IRpcChannelBuffer **chan); |
Robert Shearman | 43df8b6 | 2005-09-14 10:07:01 +0000 | [diff] [blame] | 208 | void RPC_ExecuteCall(struct dispatch_params *params); |
Robert Shearman | db6db7c | 2005-02-15 15:02:49 +0000 | [diff] [blame] | 209 | HRESULT RPC_RegisterInterface(REFIID riid); |
Robert Shearman | 552cc7d | 2005-02-15 15:44:25 +0000 | [diff] [blame] | 210 | void RPC_UnregisterInterface(REFIID riid); |
| 211 | void RPC_StartLocalServer(REFCLSID clsid, IStream *stream); |
| 212 | HRESULT RPC_GetLocalClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv); |
Marcus Meissner | 0749fc2 | 2002-02-05 18:11:17 +0000 | [diff] [blame] | 213 | |
Francois Gouget | 3116bd9 | 2000-11-25 03:08:23 +0000 | [diff] [blame] | 214 | /* This function initialize the Running Object Table */ |
Eric Pouech | 4056d7e | 2004-12-13 21:19:01 +0000 | [diff] [blame] | 215 | HRESULT WINAPI RunningObjectTableImpl_Initialize(void); |
Francois Gouget | 3116bd9 | 2000-11-25 03:08:23 +0000 | [diff] [blame] | 216 | |
| 217 | /* This function uninitialize the Running Object Table */ |
Eric Pouech | 4056d7e | 2004-12-13 21:19:01 +0000 | [diff] [blame] | 218 | HRESULT WINAPI RunningObjectTableImpl_UnInitialize(void); |
Francois Gouget | 3116bd9 | 2000-11-25 03:08:23 +0000 | [diff] [blame] | 219 | |
| 220 | /* This function decomposes a String path to a String Table containing all the elements ("\" or "subDirectory" or "Directory" or "FileName") of the path */ |
Mike McCormack | 912ffd6 | 2005-05-12 09:57:21 +0000 | [diff] [blame] | 221 | int FileMonikerImpl_DecomposePath(LPCOLESTR str, LPOLESTR** stringTable); |
Francois Gouget | 3116bd9 | 2000-11-25 03:08:23 +0000 | [diff] [blame] | 222 | |
Robert Shearman | 552cc7d | 2005-02-15 15:44:25 +0000 | [diff] [blame] | 223 | |
| 224 | /* Apartment Functions */ |
| 225 | |
Robert Shearman | 8971f06 | 2005-03-11 10:19:10 +0000 | [diff] [blame] | 226 | APARTMENT *apartment_findfromoxid(OXID oxid, BOOL ref); |
| 227 | APARTMENT *apartment_findfromtid(DWORD tid); |
| 228 | DWORD apartment_addref(struct apartment *apt); |
| 229 | DWORD apartment_release(struct apartment *apt); |
| 230 | HRESULT apartment_disconnectproxies(struct apartment *apt); |
| 231 | void apartment_disconnectobject(struct apartment *apt, void *object); |
| 232 | static inline HRESULT apartment_getoxid(struct apartment *apt, OXID *oxid) |
| 233 | { |
| 234 | *oxid = apt->oxid; |
| 235 | return S_OK; |
| 236 | } |
Robert Shearman | cd2fafb | 2006-01-10 20:09:08 +0100 | [diff] [blame] | 237 | HRESULT apartment_createwindowifneeded(struct apartment *apt); |
Robert Shearman | fcba783 | 2006-01-10 20:08:41 +0100 | [diff] [blame] | 238 | HWND apartment_getwindow(struct apartment *apt); |
Robert Shearman | b75db2d | 2006-01-09 18:41:19 +0100 | [diff] [blame] | 239 | void apartment_joinmta(void); |
Mike Hearn | a6a416c | 2005-01-05 17:14:33 +0000 | [diff] [blame] | 240 | |
Robert Shearman | 1b5ebab | 2005-03-17 10:26:20 +0000 | [diff] [blame] | 241 | |
| 242 | /* DCOM messages used by the apartment window (not compatible with native) */ |
| 243 | #define DM_EXECUTERPC (WM_USER + 0) /* WPARAM = 0, LPARAM = (struct dispatch_params *) */ |
Robert Shearman | 2ff1711 | 2005-02-14 11:50:51 +0000 | [diff] [blame] | 244 | |
Ove Kaaven | ef57c4d | 2003-06-04 20:11:34 +0000 | [diff] [blame] | 245 | /* |
| 246 | * Per-thread values are stored in the TEB on offset 0xF80, |
| 247 | * see http://www.microsoft.com/msj/1099/bugslayer/bugslayer1099.htm |
| 248 | */ |
Mike Hearn | a6a416c | 2005-01-05 17:14:33 +0000 | [diff] [blame] | 249 | |
| 250 | /* will create if necessary */ |
| 251 | static inline struct oletls *COM_CurrentInfo(void) |
Ove Kaaven | ef57c4d | 2003-06-04 20:11:34 +0000 | [diff] [blame] | 252 | { |
Robert Shearman | 452491b | 2005-01-12 19:48:39 +0000 | [diff] [blame] | 253 | if (!NtCurrentTeb()->ReservedForOle) |
Mike Hearn | a6a416c | 2005-01-05 17:14:33 +0000 | [diff] [blame] | 254 | NtCurrentTeb()->ReservedForOle = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct oletls)); |
Robert Shearman | 452491b | 2005-01-12 19:48:39 +0000 | [diff] [blame] | 255 | |
Mike Hearn | a6a416c | 2005-01-05 17:14:33 +0000 | [diff] [blame] | 256 | return NtCurrentTeb()->ReservedForOle; |
Ove Kaaven | ef57c4d | 2003-06-04 20:11:34 +0000 | [diff] [blame] | 257 | } |
| 258 | |
Mike Hearn | a6a416c | 2005-01-05 17:14:33 +0000 | [diff] [blame] | 259 | static inline APARTMENT* COM_CurrentApt(void) |
| 260 | { |
| 261 | return COM_CurrentInfo()->apt; |
| 262 | } |
Ove Kaaven | ef57c4d | 2003-06-04 20:11:34 +0000 | [diff] [blame] | 263 | |
Alexandre Julliard | 936198c | 2004-08-13 00:44:22 +0000 | [diff] [blame] | 264 | #define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field)) |
| 265 | |
Robert Shearman | 1b5ebab | 2005-03-17 10:26:20 +0000 | [diff] [blame] | 266 | /* helpers for debugging */ |
Alexandre Julliard | 20a1a20 | 2005-09-09 10:19:44 +0000 | [diff] [blame] | 267 | # define DEBUG_SET_CRITSEC_NAME(cs, name) (cs)->DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": " name) |
| 268 | # define DEBUG_CLEAR_CRITSEC_NAME(cs) (cs)->DebugInfo->Spare[0] = 0 |
Robert Shearman | 1b5ebab | 2005-03-17 10:26:20 +0000 | [diff] [blame] | 269 | |
Marcus Meissner | f3d99b2 | 2005-05-16 14:12:53 +0000 | [diff] [blame] | 270 | extern HINSTANCE OLE32_hInstance; /* FIXME: make static */ |
| 271 | |
Robert Shearman | f419880 | 2005-06-20 10:33:17 +0000 | [diff] [blame] | 272 | #define CHARS_IN_GUID 39 /* including NULL */ |
| 273 | |
Robert Shearman | b9d7754 | 2005-11-28 11:16:58 +0100 | [diff] [blame] | 274 | /* Exported non-interface Data Advise Holder functions */ |
| 275 | HRESULT DataAdviseHolder_OnConnect(IDataAdviseHolder *iface, IDataObject *pDelegate); |
| 276 | void DataAdviseHolder_OnDisconnect(IDataAdviseHolder *iface); |
| 277 | |
Francois Gouget | 3116bd9 | 2000-11-25 03:08:23 +0000 | [diff] [blame] | 278 | #endif /* __WINE_OLE_COMPOBJ_H */ |