set svn:eol-style to native
[reactos.git] / reactos / lib / ole32 / compobj_private.h
index 816e07a..7e5ddbb 100644 (file)
-/*\r
- * Copyright 1995 Martin von Loewis\r
- * Copyright 1998 Justin Bradford\r
- * Copyright 1999 Francis Beaudet\r
- * Copyright 1999 Sylvain St-Germain\r
- * Copyright 2002 Marcus Meissner\r
- * Copyright 2003 Ove Kåven, TransGaming Technologies\r
- * Copyright 2004 Mike Hearn, Rob Shearman, CodeWeavers Inc\r
- *\r
- * This library is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU Lesser General Public\r
- * License as published by the Free Software Foundation; either\r
- * version 2.1 of the License, or (at your option) any later version.\r
- *\r
- * This library is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
- * Lesser General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU Lesser General Public\r
- * License along with this library; if not, write to the Free Software\r
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
- */\r
-\r
-#ifndef __WINE_OLE_COMPOBJ_H\r
-#define __WINE_OLE_COMPOBJ_H\r
-\r
-/* All private prototype functions used by OLE will be added to this header file */\r
-\r
-#include <stdarg.h>\r
-\r
-#include "wine/list.h"\r
-\r
-#include "windef.h"\r
-#include "winbase.h"\r
-#include "wtypes.h"\r
-#include "dcom.h"\r
-#include "winreg.h"\r
-#include "winternl.h"\r
-\r
-struct apartment;\r
-typedef struct apartment APARTMENT;\r
-\r
-/* Thread-safety Annotation Legend:\r
- *\r
- * RO    - The value is read only. It never changes after creation, so no\r
- *         locking is required.\r
- * LOCK  - The value is written to only using Interlocked* functions.\r
- * CS    - The value is read or written to inside a critical section.\r
- *         The identifier following "CS" is the specific critical setion that\r
- *         must be used.\r
- * MUTEX - The value is read or written to with a mutex held.\r
- *         The identifier following "MUTEX" is the specific mutex that\r
- *         must be used.\r
- */\r
-\r
-typedef enum ifstub_state\r
-{\r
-    STUBSTATE_NORMAL_MARSHALED,\r
-    STUBSTATE_NORMAL_UNMARSHALED,\r
-    STUBSTATE_TABLE_WEAK_MARSHALED,\r
-    STUBSTATE_TABLE_WEAK_UNMARSHALED,\r
-    STUBSTATE_TABLE_STRONG,\r
-} STUB_STATE;\r
-\r
-/* an interface stub */\r
-struct ifstub   \r
-{\r
-    struct list       entry;      /* entry in stub_manager->ifstubs list (CS stub_manager->lock) */\r
-    IRpcStubBuffer   *stubbuffer; /* RO */\r
-    IID               iid;        /* RO */\r
-    IPID              ipid;       /* RO */\r
-    IUnknown         *iface;      /* RO */\r
-};\r
-\r
-\r
-/* stub managers hold refs on the object and each interface stub */\r
-struct stub_manager\r
-{\r
-    struct list       entry;      /* entry in apartment stubmgr list (CS apt->cs) */\r
-    struct list       ifstubs;    /* list of active ifstubs for the object (CS lock) */\r
-    CRITICAL_SECTION  lock;\r
-    APARTMENT        *apt;        /* owning apt (RO) */\r
-\r
-    ULONG             extrefs;    /* number of 'external' references (CS lock) */\r
-    ULONG             refs;       /* internal reference count (CS apt->cs) */\r
-    OID               oid;        /* apartment-scoped unique identifier (RO) */\r
-    IUnknown         *object;     /* the object we are managing the stub for (RO) */\r
-    ULONG             next_ipid;  /* currently unused (LOCK) */\r
-    STUB_STATE        state;      /* state machine (CS lock) */\r
-};\r
-\r
-/* imported interface proxy */\r
-struct ifproxy\r
-{\r
-  struct list entry;       /* entry in proxy_manager list (CS parent->cs) */\r
-  struct proxy_manager *parent; /* owning proxy_manager (RO) */\r
-  LPVOID iface;            /* interface pointer (RO) */\r
-  IID iid;                 /* interface ID (RO) */\r
-  IPID ipid;               /* imported interface ID (RO) */\r
-  LPRPCPROXYBUFFER proxy;  /* interface proxy (RO) */\r
-  DWORD refs;              /* imported (public) references (MUTEX parent->remoting_mutex) */\r
-  IRpcChannelBuffer *chan; /* channel to object (CS parent->cs) */\r
-};\r
-\r
-/* imported object / proxy manager */\r
-struct proxy_manager\r
-{\r
-  const IMultiQIVtbl *lpVtbl;\r
-  struct apartment *parent; /* owning apartment (RO) */\r
-  struct list entry;        /* entry in apartment (CS parent->cs) */\r
-  OXID oxid;                /* object exported ID (RO) */\r
-  OID oid;                  /* object ID (RO) */\r
-  struct list interfaces;   /* imported interfaces (CS cs) */\r
-  DWORD refs;               /* proxy reference count (LOCK) */\r
-  CRITICAL_SECTION cs;      /* thread safety for this object and children */\r
-  ULONG sorflags;           /* STDOBJREF flags (RO) */\r
-  IRemUnknown *remunk;      /* proxy to IRemUnknown used for lifecycle management (CS cs) */\r
-  HANDLE remoting_mutex;    /* mutex used for synchronizing access to IRemUnknown */\r
-};\r
-\r
-/* this needs to become a COM object that implements IRemUnknown */\r
-struct apartment\r
-{\r
-  struct list entry;       \r
-\r
-  DWORD refs;              /* refcount of the apartment (LOCK) */\r
-  DWORD model;             /* threading model (RO) */\r
-  DWORD tid;               /* thread id (RO) */\r
-  HANDLE thread;           /* thread handle (RO) */\r
-  OXID oxid;               /* object exporter ID (RO) */\r
-  DWORD ipidc;             /* interface pointer ID counter, starts at 1 (LOCK) */\r
-  HWND win;                /* message window (RO) */\r
-  CRITICAL_SECTION cs;     /* thread safety */\r
-  LPMESSAGEFILTER filter;  /* message filter (CS cs) */\r
-  struct list proxies;     /* imported objects (CS cs) */\r
-  struct list stubmgrs;    /* stub managers for exported objects (CS cs) */\r
-  BOOL remunk_exported;    /* has the IRemUnknown interface for this apartment been created yet? (CS cs) */\r
-  LONG remoting_started;   /* has the RPC system been started for this apartment? (LOCK) */\r
-\r
-  /* FIXME: OID's should be given out by RPCSS */\r
-  OID oidc;                /* object ID counter, starts at 1, zero is invalid OID (CS cs) */\r
-};\r
-\r
-/* this is what is stored in TEB->ReservedForOle */\r
-struct oletls\r
-{\r
-    struct apartment *apt;\r
-    IErrorInfo       *errorinfo;   /* see errorinfo.c */\r
-    IUnknown         *state;       /* see CoSetState */\r
-    DWORD            inits;        /* number of times CoInitializeEx called */\r
-};\r
-\r
-\r
-/* Global Interface Table Functions */\r
-\r
-extern void* StdGlobalInterfaceTable_Construct(void);\r
-extern void  StdGlobalInterfaceTable_Destroy(void* self);\r
-extern HRESULT StdGlobalInterfaceTable_GetFactory(LPVOID *ppv);\r
-extern void* StdGlobalInterfaceTableInstance;\r
-\r
-/* FIXME: these shouldn't be needed, except for 16-bit functions */\r
-extern HRESULT WINE_StringFromCLSID(const CLSID *id,LPSTR idstr);\r
-HRESULT WINAPI __CLSIDFromStringA(LPCSTR idstr, CLSID *id);\r
-\r
-HRESULT MARSHAL_GetStandardMarshalCF(LPVOID *ppv);\r
-\r
-/* Stub Manager */\r
-\r
-ULONG stub_manager_int_addref(struct stub_manager *This);\r
-ULONG stub_manager_int_release(struct stub_manager *This);\r
-struct stub_manager *new_stub_manager(APARTMENT *apt, IUnknown *object, MSHLFLAGS mshlflags);\r
-ULONG stub_manager_ext_addref(struct stub_manager *m, ULONG refs);\r
-ULONG stub_manager_ext_release(struct stub_manager *m, ULONG refs);\r
-struct ifstub *stub_manager_new_ifstub(struct stub_manager *m, IRpcStubBuffer *sb, IUnknown *iptr, REFIID iid);\r
-struct stub_manager *get_stub_manager(APARTMENT *apt, OID oid);\r
-struct stub_manager *get_stub_manager_from_object(APARTMENT *apt, void *object);\r
-BOOL stub_manager_notify_unmarshal(struct stub_manager *m);\r
-BOOL stub_manager_is_table_marshaled(struct stub_manager *m);\r
-void stub_manager_release_marshal_data(struct stub_manager *m, ULONG refs);\r
-HRESULT ipid_to_stub_manager(const IPID *ipid, APARTMENT **stub_apt, struct stub_manager **stubmgr_ret);\r
-IRpcStubBuffer *ipid_to_apt_and_stubbuffer(const IPID *ipid, APARTMENT **stub_apt);\r
-HRESULT start_apartment_remote_unknown(void);\r
-\r
-HRESULT marshal_object(APARTMENT *apt, STDOBJREF *stdobjref, REFIID riid, IUnknown *obj, MSHLFLAGS mshlflags);\r
-\r
-/* RPC Backend */\r
-\r
-struct dispatch_params;\r
-\r
-void    RPC_StartRemoting(struct apartment *apt);\r
-HRESULT RPC_CreateClientChannel(const OXID *oxid, const IPID *ipid, IRpcChannelBuffer **pipebuf);\r
-HRESULT RPC_ExecuteCall(struct dispatch_params *params);\r
-HRESULT RPC_RegisterInterface(REFIID riid);\r
-void    RPC_UnregisterInterface(REFIID riid);\r
-void    RPC_StartLocalServer(REFCLSID clsid, IStream *stream);\r
-HRESULT RPC_GetLocalClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv);\r
-\r
-/* This function initialize the Running Object Table */\r
-HRESULT WINAPI RunningObjectTableImpl_Initialize(void);\r
-\r
-/* This function uninitialize the Running Object Table */\r
-HRESULT WINAPI RunningObjectTableImpl_UnInitialize(void);\r
-\r
-/* This function decomposes a String path to a String Table containing all the elements ("\" or "subDirectory" or "Directory" or "FileName") of the path */\r
-int FileMonikerImpl_DecomposePath(LPCOLESTR str, LPOLESTR** stringTable);\r
-\r
-\r
-/* Apartment Functions */\r
-\r
-APARTMENT *apartment_findfromoxid(OXID oxid, BOOL ref);\r
-APARTMENT *apartment_findfromtid(DWORD tid);\r
-DWORD apartment_addref(struct apartment *apt);\r
-DWORD apartment_release(struct apartment *apt);\r
-HRESULT apartment_disconnectproxies(struct apartment *apt);\r
-void apartment_disconnectobject(struct apartment *apt, void *object);\r
-static inline HRESULT apartment_getoxid(struct apartment *apt, OXID *oxid)\r
-{\r
-    *oxid = apt->oxid;\r
-    return S_OK;\r
-}\r
-\r
-\r
-/* DCOM messages used by the apartment window (not compatible with native) */\r
-#define DM_EXECUTERPC   (WM_USER + 0) /* WPARAM = 0, LPARAM = (struct dispatch_params *) */\r
-\r
-/*\r
- * Per-thread values are stored in the TEB on offset 0xF80,\r
- * see http://www.microsoft.com/msj/1099/bugslayer/bugslayer1099.htm\r
- */\r
-\r
-/* will create if necessary */\r
-static inline struct oletls *COM_CurrentInfo(void)\r
-{\r
-    if (!NtCurrentTeb()->ReservedForOle)\r
-        NtCurrentTeb()->ReservedForOle = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct oletls));\r
-\r
-    return NtCurrentTeb()->ReservedForOle;\r
-}\r
-\r
-static inline APARTMENT* COM_CurrentApt(void)\r
-{  \r
-    return COM_CurrentInfo()->apt;\r
-}\r
-\r
-#define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field))\r
-\r
-/* helpers for debugging */\r
-#ifdef __i386__\r
-# define DEBUG_SET_CRITSEC_NAME(cs, name) (cs)->DebugInfo->Spare[1] = (DWORD)(__FILE__ ": " name)\r
-# define DEBUG_CLEAR_CRITSEC_NAME(cs) (cs)->DebugInfo->Spare[1] = 0\r
-#else\r
-# define DEBUG_SET_CRITSEC_NAME(cs, name)\r
-# define DEBUG_CLEAR_CRITSEC_NAME(cs)\r
-#endif\r
-\r
-extern HINSTANCE OLE32_hInstance; /* FIXME: make static */\r
-\r
-#endif /* __WINE_OLE_COMPOBJ_H */\r
+/*
+ * Copyright 1995 Martin von Loewis
+ * Copyright 1998 Justin Bradford
+ * Copyright 1999 Francis Beaudet
+ * Copyright 1999 Sylvain St-Germain
+ * Copyright 2002 Marcus Meissner
+ * Copyright 2003 Ove Kåven, TransGaming Technologies
+ * Copyright 2004 Mike Hearn, Rob Shearman, CodeWeavers Inc
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef __WINE_OLE_COMPOBJ_H
+#define __WINE_OLE_COMPOBJ_H
+
+/* All private prototype functions used by OLE will be added to this header file */
+
+#include <stdarg.h>
+
+#include "wine/list.h"
+
+#include "windef.h"
+#include "winbase.h"
+#include "wtypes.h"
+#include "dcom.h"
+#include "winreg.h"
+#include "winternl.h"
+
+struct apartment;
+typedef struct apartment APARTMENT;
+
+/* Thread-safety Annotation Legend:
+ *
+ * RO    - The value is read only. It never changes after creation, so no
+ *         locking is required.
+ * LOCK  - The value is written to only using Interlocked* functions.
+ * CS    - The value is read or written to inside a critical section.
+ *         The identifier following "CS" is the specific critical setion that
+ *         must be used.
+ * MUTEX - The value is read or written to with a mutex held.
+ *         The identifier following "MUTEX" is the specific mutex that
+ *         must be used.
+ */
+
+typedef enum ifstub_state
+{
+    STUBSTATE_NORMAL_MARSHALED,
+    STUBSTATE_NORMAL_UNMARSHALED,
+    STUBSTATE_TABLE_WEAK_MARSHALED,
+    STUBSTATE_TABLE_WEAK_UNMARSHALED,
+    STUBSTATE_TABLE_STRONG,
+} STUB_STATE;
+
+/* an interface stub */
+struct ifstub   
+{
+    struct list       entry;      /* entry in stub_manager->ifstubs list (CS stub_manager->lock) */
+    IRpcStubBuffer   *stubbuffer; /* RO */
+    IID               iid;        /* RO */
+    IPID              ipid;       /* RO */
+    IUnknown         *iface;      /* RO */
+};
+
+
+/* stub managers hold refs on the object and each interface stub */
+struct stub_manager
+{
+    struct list       entry;      /* entry in apartment stubmgr list (CS apt->cs) */
+    struct list       ifstubs;    /* list of active ifstubs for the object (CS lock) */
+    CRITICAL_SECTION  lock;
+    APARTMENT        *apt;        /* owning apt (RO) */
+
+    ULONG             extrefs;    /* number of 'external' references (CS lock) */
+    ULONG             refs;       /* internal reference count (CS apt->cs) */
+    OID               oid;        /* apartment-scoped unique identifier (RO) */
+    IUnknown         *object;     /* the object we are managing the stub for (RO) */
+    ULONG             next_ipid;  /* currently unused (LOCK) */
+    STUB_STATE        state;      /* state machine (CS lock) */
+};
+
+/* imported interface proxy */
+struct ifproxy
+{
+  struct list entry;       /* entry in proxy_manager list (CS parent->cs) */
+  struct proxy_manager *parent; /* owning proxy_manager (RO) */
+  LPVOID iface;            /* interface pointer (RO) */
+  IID iid;                 /* interface ID (RO) */
+  IPID ipid;               /* imported interface ID (RO) */
+  LPRPCPROXYBUFFER proxy;  /* interface proxy (RO) */
+  DWORD refs;              /* imported (public) references (MUTEX parent->remoting_mutex) */
+  IRpcChannelBuffer *chan; /* channel to object (CS parent->cs) */
+};
+
+/* imported object / proxy manager */
+struct proxy_manager
+{
+  const IMultiQIVtbl *lpVtbl;
+  struct apartment *parent; /* owning apartment (RO) */
+  struct list entry;        /* entry in apartment (CS parent->cs) */
+  OXID oxid;                /* object exported ID (RO) */
+  OID oid;                  /* object ID (RO) */
+  struct list interfaces;   /* imported interfaces (CS cs) */
+  DWORD refs;               /* proxy reference count (LOCK) */
+  CRITICAL_SECTION cs;      /* thread safety for this object and children */
+  ULONG sorflags;           /* STDOBJREF flags (RO) */
+  IRemUnknown *remunk;      /* proxy to IRemUnknown used for lifecycle management (CS cs) */
+  HANDLE remoting_mutex;    /* mutex used for synchronizing access to IRemUnknown */
+};
+
+/* this needs to become a COM object that implements IRemUnknown */
+struct apartment
+{
+  struct list entry;       
+
+  DWORD refs;              /* refcount of the apartment (LOCK) */
+  DWORD model;             /* threading model (RO) */
+  DWORD tid;               /* thread id (RO) */
+  HANDLE thread;           /* thread handle (RO) */
+  OXID oxid;               /* object exporter ID (RO) */
+  DWORD ipidc;             /* interface pointer ID counter, starts at 1 (LOCK) */
+  HWND win;                /* message window (RO) */
+  CRITICAL_SECTION cs;     /* thread safety */
+  LPMESSAGEFILTER filter;  /* message filter (CS cs) */
+  struct list proxies;     /* imported objects (CS cs) */
+  struct list stubmgrs;    /* stub managers for exported objects (CS cs) */
+  BOOL remunk_exported;    /* has the IRemUnknown interface for this apartment been created yet? (CS cs) */
+  LONG remoting_started;   /* has the RPC system been started for this apartment? (LOCK) */
+
+  /* FIXME: OID's should be given out by RPCSS */
+  OID oidc;                /* object ID counter, starts at 1, zero is invalid OID (CS cs) */
+};
+
+/* this is what is stored in TEB->ReservedForOle */
+struct oletls
+{
+    struct apartment *apt;
+    IErrorInfo       *errorinfo;   /* see errorinfo.c */
+    IUnknown         *state;       /* see CoSetState */
+    DWORD            inits;        /* number of times CoInitializeEx called */
+};
+
+
+/* Global Interface Table Functions */
+
+extern void* StdGlobalInterfaceTable_Construct(void);
+extern void  StdGlobalInterfaceTable_Destroy(void* self);
+extern HRESULT StdGlobalInterfaceTable_GetFactory(LPVOID *ppv);
+extern void* StdGlobalInterfaceTableInstance;
+
+/* FIXME: these shouldn't be needed, except for 16-bit functions */
+extern HRESULT WINE_StringFromCLSID(const CLSID *id,LPSTR idstr);
+HRESULT WINAPI __CLSIDFromStringA(LPCSTR idstr, CLSID *id);
+
+HRESULT MARSHAL_GetStandardMarshalCF(LPVOID *ppv);
+
+/* Stub Manager */
+
+ULONG stub_manager_int_addref(struct stub_manager *This);
+ULONG stub_manager_int_release(struct stub_manager *This);
+struct stub_manager *new_stub_manager(APARTMENT *apt, IUnknown *object, MSHLFLAGS mshlflags);
+ULONG stub_manager_ext_addref(struct stub_manager *m, ULONG refs);
+ULONG stub_manager_ext_release(struct stub_manager *m, ULONG refs);
+struct ifstub *stub_manager_new_ifstub(struct stub_manager *m, IRpcStubBuffer *sb, IUnknown *iptr, REFIID iid);
+struct stub_manager *get_stub_manager(APARTMENT *apt, OID oid);
+struct stub_manager *get_stub_manager_from_object(APARTMENT *apt, void *object);
+BOOL stub_manager_notify_unmarshal(struct stub_manager *m);
+BOOL stub_manager_is_table_marshaled(struct stub_manager *m);
+void stub_manager_release_marshal_data(struct stub_manager *m, ULONG refs);
+HRESULT ipid_to_stub_manager(const IPID *ipid, APARTMENT **stub_apt, struct stub_manager **stubmgr_ret);
+IRpcStubBuffer *ipid_to_apt_and_stubbuffer(const IPID *ipid, APARTMENT **stub_apt);
+HRESULT start_apartment_remote_unknown(void);
+
+HRESULT marshal_object(APARTMENT *apt, STDOBJREF *stdobjref, REFIID riid, IUnknown *obj, MSHLFLAGS mshlflags);
+
+/* RPC Backend */
+
+struct dispatch_params;
+
+void    RPC_StartRemoting(struct apartment *apt);
+HRESULT RPC_CreateClientChannel(const OXID *oxid, const IPID *ipid, IRpcChannelBuffer **pipebuf);
+HRESULT RPC_ExecuteCall(struct dispatch_params *params);
+HRESULT RPC_RegisterInterface(REFIID riid);
+void    RPC_UnregisterInterface(REFIID riid);
+void    RPC_StartLocalServer(REFCLSID clsid, IStream *stream);
+HRESULT RPC_GetLocalClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv);
+
+/* This function initialize the Running Object Table */
+HRESULT WINAPI RunningObjectTableImpl_Initialize(void);
+
+/* This function uninitialize the Running Object Table */
+HRESULT WINAPI RunningObjectTableImpl_UnInitialize(void);
+
+/* This function decomposes a String path to a String Table containing all the elements ("\" or "subDirectory" or "Directory" or "FileName") of the path */
+int FileMonikerImpl_DecomposePath(LPCOLESTR str, LPOLESTR** stringTable);
+
+
+/* Apartment Functions */
+
+APARTMENT *apartment_findfromoxid(OXID oxid, BOOL ref);
+APARTMENT *apartment_findfromtid(DWORD tid);
+DWORD apartment_addref(struct apartment *apt);
+DWORD apartment_release(struct apartment *apt);
+HRESULT apartment_disconnectproxies(struct apartment *apt);
+void apartment_disconnectobject(struct apartment *apt, void *object);
+static inline HRESULT apartment_getoxid(struct apartment *apt, OXID *oxid)
+{
+    *oxid = apt->oxid;
+    return S_OK;
+}
+
+
+/* DCOM messages used by the apartment window (not compatible with native) */
+#define DM_EXECUTERPC   (WM_USER + 0) /* WPARAM = 0, LPARAM = (struct dispatch_params *) */
+
+/*
+ * Per-thread values are stored in the TEB on offset 0xF80,
+ * see http://www.microsoft.com/msj/1099/bugslayer/bugslayer1099.htm
+ */
+
+/* will create if necessary */
+static inline struct oletls *COM_CurrentInfo(void)
+{
+    if (!NtCurrentTeb()->ReservedForOle)
+        NtCurrentTeb()->ReservedForOle = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct oletls));
+
+    return NtCurrentTeb()->ReservedForOle;
+}
+
+static inline APARTMENT* COM_CurrentApt(void)
+{  
+    return COM_CurrentInfo()->apt;
+}
+
+#define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field))
+
+/* helpers for debugging */
+#ifdef __i386__
+# define DEBUG_SET_CRITSEC_NAME(cs, name) (cs)->DebugInfo->Spare[1] = (DWORD)(__FILE__ ": " name)
+# define DEBUG_CLEAR_CRITSEC_NAME(cs) (cs)->DebugInfo->Spare[1] = 0
+#else
+# define DEBUG_SET_CRITSEC_NAME(cs, name)
+# define DEBUG_CLEAR_CRITSEC_NAME(cs)
+#endif
+
+extern HINSTANCE OLE32_hInstance; /* FIXME: make static */
+
+#endif /* __WINE_OLE_COMPOBJ_H */