From 739ccae798a9880b37b6998abbcd8bfeb9b2e780 Mon Sep 17 00:00:00 2001 From: Mike Hearn Date: Tue, 17 Jun 2003 03:57:18 +0000 Subject: [PATCH] Implement a class factory for the Global Interface Table. --- dlls/ole32/compobj.c | 2 +- dlls/ole32/compobj_private.h | 3 +++ dlls/ole32/git.c | 55 +++++++++++++++++++++++++++++++++++++++++++- dlls/ole32/oleproxy.c | 3 +++ 4 files changed, 61 insertions(+), 2 deletions(-) diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c index 8fda55a80ed..a4017c78d4d 100644 --- a/dlls/ole32/compobj.c +++ b/dlls/ole32/compobj.c @@ -62,7 +62,7 @@ static void COM_ExternalLockFreeList(); const CLSID CLSID_StdGlobalInterfaceTable = { 0x00000323, 0, 0, {0xc0, 0, 0, 0, 0, 0, 0, 0x46} }; -static void* StdGlobalInterfaceTableInstance; + APARTMENT MTA, *apts; static CRITICAL_SECTION csApartment = CRITICAL_SECTION_INIT("csApartment"); diff --git a/dlls/ole32/compobj_private.h b/dlls/ole32/compobj_private.h index d9e21de09b2..a8e19c95efc 100644 --- a/dlls/ole32/compobj_private.h +++ b/dlls/ole32/compobj_private.h @@ -98,10 +98,13 @@ extern APARTMENT MTA, *apts; extern void* StdGlobalInterfaceTable_Construct(); extern void StdGlobalInterfaceTable_Destroy(void* self); +extern HRESULT StdGlobalInterfaceTable_GetFactory(LPVOID *ppv); extern HRESULT WINE_StringFromCLSID(const CLSID *id,LPSTR idstr); extern HRESULT create_marshalled_proxy(REFCLSID rclsid, REFIID iid, LPVOID *ppv); +extern void* StdGlobalInterfaceTableInstance; + inline static HRESULT get_facbuf_for_iid(REFIID riid,IPSFactoryBuffer **facbuf) { HRESULT hres; diff --git a/dlls/ole32/git.c b/dlls/ole32/git.c index bc7c0f0d317..82b57e2e741 100644 --- a/dlls/ole32/git.c +++ b/dlls/ole32/git.c @@ -74,6 +74,8 @@ typedef struct StdGlobalInterfaceTableImpl } StdGlobalInterfaceTableImpl; +void* StdGlobalInterfaceTableInstance; + /* IUnknown */ static HRESULT WINAPI StdGlobalInterfaceTable_QueryInterface(IGlobalInterfaceTable* iface, REFIID riid, void** ppvObject); @@ -105,6 +107,8 @@ static ICOM_VTABLE(IGlobalInterfaceTable) StdGlobalInterfaceTableImpl_Vtbl = void* StdGlobalInterfaceTable_Construct() { StdGlobalInterfaceTableImpl* newGIT; + TRACE("constructing\n"); + newGIT = HeapAlloc(GetProcessHeap(), 0, sizeof(StdGlobalInterfaceTableImpl)); if (newGIT == 0) return newGIT; @@ -141,6 +145,7 @@ StdGITEntry* StdGlobalInterfaceTable_FindEntry(IGlobalInterfaceTable* iface, DWO if (e->cookie == cookie) return e; e = e->next; } + TRACE("Entry not found\n"); return NULL; } @@ -198,7 +203,7 @@ HRESULT WINAPI StdGlobalInterfaceTable_RegisterInterfaceInGlobal(IGlobalInterfac HRESULT hres; StdGITEntry* entry; - TRACE("iface=%p, pUnk=%p, riid=%s, pdwCookie=%p\n", iface, pUnk, debugstr_guid(riid), pdwCookie); + TRACE("iface=%p, pUnk=%p, riid=%s, pdwCookie=0x%p\n", iface, pUnk, debugstr_guid(riid), pdwCookie); if (pUnk == NULL) return E_INVALIDARG; @@ -222,6 +227,7 @@ HRESULT WINAPI StdGlobalInterfaceTable_RegisterInterfaceInGlobal(IGlobalInterfac /* and return the cookie */ *pdwCookie = entry->cookie; + TRACE("Cookie is 0x%ld\n", entry->cookie); return S_OK; } @@ -249,6 +255,8 @@ HRESULT WINAPI StdGlobalInterfaceTable_RevokeInterfaceFromGlobal(IGlobalInterfac HRESULT WINAPI StdGlobalInterfaceTable_GetInterfaceFromGlobal(IGlobalInterfaceTable* iface, DWORD dwCookie, REFIID riid, void **ppv) { StdGITEntry* entry; HRESULT hres; + + TRACE("dwCookie=0x%lx, riid=%s\n", dwCookie, debugstr_guid(riid)); entry = StdGlobalInterfaceTable_FindEntry(iface, dwCookie); if (entry == NULL) return E_INVALIDARG; @@ -260,3 +268,48 @@ HRESULT WINAPI StdGlobalInterfaceTable_GetInterfaceFromGlobal(IGlobalInterfaceTa return S_OK; } + +/* Classfactory definition - despite what MSDN says, some programs need this */ + +static HRESULT WINAPI GITCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid, LPVOID *ppv) { + *ppv = NULL; + if (IsEqualIID(riid,&IID_IUnknown) || IsEqualIID(riid,&IID_IGlobalInterfaceTable)) { + *ppv = (LPVOID)iface; + return S_OK; + } + return E_NOINTERFACE; +} +static ULONG WINAPI GITCF_AddRef(LPCLASSFACTORY iface) { return 2; } +static ULONG WINAPI GITCF_Release(LPCLASSFACTORY iface) { return 1; } + +static HRESULT WINAPI GITCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pUnk, REFIID riid, LPVOID *ppv) { + if (IsEqualIID(riid,&IID_IGlobalInterfaceTable)) { + if (StdGlobalInterfaceTableInstance == NULL) + StdGlobalInterfaceTableInstance = StdGlobalInterfaceTable_Construct(); + return IGlobalInterfaceTable_QueryInterface( (IGlobalInterfaceTable*) StdGlobalInterfaceTableInstance, riid, ppv); + } + + FIXME("(%s), not supported.\n",debugstr_guid(riid)); + return E_NOINTERFACE; +} + +static HRESULT WINAPI GITCF_LockServer(LPCLASSFACTORY iface, BOOL fLock) { + FIXME("(%d), stub!\n",fLock); + return S_OK; +} + +static ICOM_VTABLE(IClassFactory) GITClassFactoryVtbl = { + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + GITCF_QueryInterface, + GITCF_AddRef, + GITCF_Release, + GITCF_CreateInstance, + GITCF_LockServer +}; +static ICOM_VTABLE(IClassFactory) *PGITClassFactoryVtbl = &GITClassFactoryVtbl; + +HRESULT StdGlobalInterfaceTable_GetFactory(LPVOID *ppv) { + *ppv = &PGITClassFactoryVtbl; + TRACE("Returning GIT classfactory\n"); + return S_OK; +} diff --git a/dlls/ole32/oleproxy.c b/dlls/ole32/oleproxy.c index 2e1353b1cad..63cee18f6c2 100644 --- a/dlls/ole32/oleproxy.c +++ b/dlls/ole32/oleproxy.c @@ -515,6 +515,9 @@ HRESULT WINAPI OLE32_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv) ) ) return MARSHAL_GetStandardMarshalCF(ppv); + if (IsEqualIID(rclsid,&CLSID_StdGlobalInterfaceTable) && (IsEqualIID(iid,&IID_IClassFactory) || IsEqualIID(iid,&IID_IUnknown))) + return StdGlobalInterfaceTable_GetFactory(ppv); + FIXME("\n\tCLSID:\t%s,\n\tIID:\t%s\n",debugstr_guid(rclsid),debugstr_guid(iid)); return CLASS_E_CLASSNOTAVAILABLE; } -- 2.11.4.GIT