From: Zebediah Figura Subject: [PATCH v6] compobj.dll16: Implement CoGetClassObject16(). Message-Id: <1487370732-601-1-git-send-email-z.figura12@gmail.com> Date: Fri, 17 Feb 2017 16:32:12 -0600 Fixes https://bugs.winehq.org/show_bug.cgi?id=41209 Signed-off-by: Zebediah Figura --- dlls/compobj.dll16/compobj.c | 69 ++++++++++++++++++++++++++++++++--- dlls/compobj.dll16/compobj.dll16.spec | 2 +- 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/dlls/compobj.dll16/compobj.c b/dlls/compobj.dll16/compobj.c index b934a06..fbc9618 100644 --- a/dlls/compobj.dll16/compobj.c +++ b/dlls/compobj.dll16/compobj.c @@ -714,15 +714,74 @@ HRESULT WINAPI CoFileTimeNow16( FILETIME *lpFileTime ) * */ HRESULT WINAPI CoGetClassObject16( - REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, - REFIID iid, LPVOID *ppv) + SEGPTR rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, + SEGPTR riid, SEGPTR ppv) { - FIXME(", stub!\n\tCLSID:\t%s,\n\tIID:\t%s\n", debugstr_guid(rclsid), debugstr_guid(iid)); + LPVOID *ppvl = MapSL(ppv); + + TRACE("CLSID: %s, IID: %s\n", debugstr_guid(MapSL(rclsid)), debugstr_guid(MapSL(riid))); + *ppvl = NULL; + if (pServerInfo) { - FIXME("\tpServerInfo: name=%s\n",debugstr_w(pServerInfo->pwszName)); - FIXME("\t\tpAuthInfo=%p\n",pServerInfo->pAuthInfo); + FIXME("pServerInfo->name=%s pAuthInfo=%p\n", + debugstr_w(pServerInfo->pwszName), pServerInfo->pAuthInfo); } + + if (CLSCTX_INPROC_SERVER & dwClsContext) + { + char idstr[CHARS_IN_GUID]; + char buf_key[CHARS_IN_GUID+19], dllpath[MAX_PATH+1]; + LONG dllpath_len = sizeof(dllpath); + + HMODULE16 dll; + FARPROC16 DllGetClassObject; + + WORD args[6]; + DWORD dwRet; + + StringFromGUID216(MapSL(rclsid), idstr, CHARS_IN_GUID); + sprintf(buf_key, "CLSID\\%s\\InprocServer", idstr); + if (RegQueryValueA(HKEY_CLASSES_ROOT, buf_key, dllpath, &dllpath_len)) + { + ERR("class %s not registered\n", debugstr_guid(MapSL(rclsid))); + return REGDB_E_CLASSNOTREG; + } + + dll = LoadLibrary16(dllpath); + if (!dll) + { + ERR("couldn't load in-process dll %s\n", debugstr_a(dllpath)); + return E_ACCESSDENIED; /* FIXME: or should this be CO_E_DLLNOTFOUND? */ + } + + DllGetClassObject = GetProcAddress16(dll, "DllGetClassObject"); + if (!DllGetClassObject) + { + ERR("couldn't find function DllGetClassObject in %s\n", debugstr_a(dllpath)); + FreeLibrary16(dll); + return CO_E_DLLNOTFOUND; + } + + TRACE("calling DllGetClassObject %p\n", DllGetClassObject); + args[5] = SELECTOROF(rclsid); + args[4] = OFFSETOF(rclsid); + args[3] = SELECTOROF(riid); + args[2] = OFFSETOF(riid); + args[1] = SELECTOROF(ppv); + args[0] = OFFSETOF(ppv); + WOWCallback16Ex((DWORD) DllGetClassObject, WCB16_PASCAL, sizeof(args), args, &dwRet); + if (dwRet != S_OK) + { + ERR("DllGetClassObject returned error 0x%08x\n", dwRet); + FreeLibrary16(dll); + return dwRet; + } + + return S_OK; + } + + FIXME("semi-stub\n"); return E_NOTIMPL; } diff --git a/dlls/compobj.dll16/compobj.dll16.spec b/dlls/compobj.dll16/compobj.dll16.spec index 85dfc42..71dba80 100644 --- a/dlls/compobj.dll16/compobj.dll16.spec +++ b/dlls/compobj.dll16/compobj.dll16.spec @@ -4,7 +4,7 @@ 4 pascal CoGetMalloc(long ptr) CoGetMalloc16 5 pascal CoRegisterClassObject(ptr ptr long long ptr) CoRegisterClassObject16 6 pascal CoRevokeClassObject(long) CoRevokeClassObject16 -7 pascal CoGetClassObject(ptr long ptr ptr ptr) CoGetClassObject16 +7 pascal CoGetClassObject(segptr long ptr segptr segptr) CoGetClassObject16 8 stub COMARSHALINTERFACE 9 stub COUNMARSHALINTERFACE 10 stub COLOADLIBRARY -- 2.7.4