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