Nikolay Sivov : ole32: Support activation context in ProgIDFromCLSID().
Alexandre Julliard
julliard at winehq.org
Tue Oct 22 13:30:41 CDT 2013
Module: wine
Branch: master
Commit: 03dbbe21039e6b4387ee5e37c06051af530c5006
URL: http://source.winehq.org/git/wine.git/?a=commit;h=03dbbe21039e6b4387ee5e37c06051af530c5006
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Sep 27 23:11:46 2013 +0400
ole32: Support activation context in ProgIDFromCLSID().
---
dlls/ole32/compobj.c | 22 ++++++++++++++++++++++
dlls/ole32/tests/compobj.c | 9 ++-------
2 files changed, 24 insertions(+), 7 deletions(-)
diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index d70bfc1..b8954fb 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -2227,6 +2227,7 @@ HRESULT COM_OpenKeyForAppIdFromCLSID(REFCLSID clsid, REGSAM access, HKEY *subkey
HRESULT WINAPI ProgIDFromCLSID(REFCLSID clsid, LPOLESTR *ppszProgID)
{
static const WCHAR wszProgID[] = {'P','r','o','g','I','D',0};
+ ACTCTX_SECTION_KEYED_DATA data;
HKEY hkey;
HRESULT ret;
LONG progidlen = 0;
@@ -2238,6 +2239,27 @@ HRESULT WINAPI ProgIDFromCLSID(REFCLSID clsid, LPOLESTR *ppszProgID)
}
*ppszProgID = NULL;
+
+ data.cbSize = sizeof(data);
+ if (FindActCtxSectionGuid(0, NULL, ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION,
+ clsid, &data))
+ {
+ struct comclassredirect_data *comclass = (struct comclassredirect_data*)data.lpData;
+ if (comclass->progid_len)
+ {
+ WCHAR *ptrW;
+
+ *ppszProgID = CoTaskMemAlloc(comclass->progid_len + sizeof(WCHAR));
+ if (!*ppszProgID) return E_OUTOFMEMORY;
+
+ ptrW = (WCHAR*)((BYTE*)comclass + comclass->progid_offset);
+ memcpy(*ppszProgID, ptrW, comclass->progid_len + sizeof(WCHAR));
+ return S_OK;
+ }
+ else
+ return REGDB_E_CLASSNOTREG;
+ }
+
ret = COM_OpenKeyForCLSID(clsid, wszProgID, KEY_READ, &hkey);
if (FAILED(ret))
return ret;
diff --git a/dlls/ole32/tests/compobj.c b/dlls/ole32/tests/compobj.c
index 8998251..3bc98fc 100644
--- a/dlls/ole32/tests/compobj.c
+++ b/dlls/ole32/tests/compobj.c
@@ -309,19 +309,14 @@ static void test_ProgIDFromCLSID(void)
static const WCHAR customfontW[] = {'C','u','s','t','o','m','F','o','n','t',0};
hr = ProgIDFromCLSID(&CLSID_non_existent, &progid);
-todo_wine
ok(hr == S_OK, "got 0x%08x\n", hr);
- if (hr == S_OK)
- {
- ok(!lstrcmpiW(progid, progidW), "got %s\n", wine_dbgstr_w(progid));
- CoTaskMemFree(progid);
- }
+ ok(!lstrcmpiW(progid, progidW), "got %s\n", wine_dbgstr_w(progid));
+ CoTaskMemFree(progid);
/* try something registered and redirected */
progid = NULL;
hr = ProgIDFromCLSID(&CLSID_StdFont, &progid);
ok(hr == S_OK, "got 0x%08x\n", hr);
-todo_wine
ok(!lstrcmpiW(progid, customfontW), "got wrong progid %s\n", wine_dbgstr_w(progid));
CoTaskMemFree(progid);
More information about the wine-cvs
mailing list