Daniel Jelinski : mscoree: Search for COM classes by assembly name if CodeBase not found.

Alexandre Julliard julliard at winehq.org
Wed Jun 5 13:47:03 CDT 2013


Module: wine
Branch: master
Commit: 1319515173f5c0ea303a8087904ad72d8698c99f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1319515173f5c0ea303a8087904ad72d8698c99f

Author: Daniel Jelinski <djelinski1 at gmail.com>
Date:   Tue Jun  4 21:14:56 2013 +0200

mscoree: Search for COM classes by assembly name if CodeBase not found.

---

 dlls/mscoree/corruntimehost.c |   45 +++++++++++++++++++++++++++++++----------
 1 files changed, 34 insertions(+), 11 deletions(-)

diff --git a/dlls/mscoree/corruntimehost.c b/dlls/mscoree/corruntimehost.c
index b4ee38b..76b7d65 100644
--- a/dlls/mscoree/corruntimehost.c
+++ b/dlls/mscoree/corruntimehost.c
@@ -1235,6 +1235,7 @@ HRESULT RuntimeHost_Destroy(RuntimeHost *This)
 
 HRESULT create_monodata(REFIID riid, LPVOID *ppObj )
 {
+    static const WCHAR wszAssembly[] = {'A','s','s','e','m','b','l','y',0};
     static const WCHAR wszCodebase[] = {'C','o','d','e','B','a','s','e',0};
     static const WCHAR wszClass[] = {'C','l','a','s','s',0};
     static const WCHAR wszFileSlash[] = {'f','i','l','e',':','/','/','/',0};
@@ -1246,11 +1247,12 @@ HRESULT create_monodata(REFIID riid, LPVOID *ppObj )
     ICLRRuntimeInfo *info = NULL;
     RuntimeHost *host;
     HRESULT hr;
-    HKEY key;
+    HKEY key, subkey;
     LONG res;
     int offset = 0;
+    DWORD numKeys, keyLength;
     WCHAR codebase[MAX_PATH + 8];
-    WCHAR classname[350];
+    WCHAR classname[350], subkeyName[256];
     WCHAR filename[MAX_PATH];
 
     DWORD dwBufLen = 350;
@@ -1277,19 +1279,40 @@ HRESULT create_monodata(REFIID riid, LPVOID *ppObj )
 
     dwBufLen = MAX_PATH + 8;
     res = RegGetValueW( key, NULL, wszCodebase, RRF_RT_REG_SZ, NULL, codebase, &dwBufLen);
-    if(res != ERROR_SUCCESS)
+    if(res == ERROR_SUCCESS)
+    {
+        /* Strip file:/// */
+        if(strncmpW(codebase, wszFileSlash, strlenW(wszFileSlash)) == 0)
+            offset = strlenW(wszFileSlash);
+
+        strcpyW(filename, codebase + offset);
+    }
+    else
     {
-        WARN("CodeBase value cannot be found.\n");
         hr = CLASS_E_CLASSNOTAVAILABLE;
-        goto cleanup;
+        WARN("CodeBase value cannot be found, trying Assembly.\n");
+        /* get the last subkey of InprocServer32 */
+        res = RegQueryInfoKeyW(key, 0, 0, 0, &numKeys, 0, 0, 0, 0, 0, 0, 0);
+        if (res != ERROR_SUCCESS || numKeys == 0)
+            goto cleanup;
+        numKeys--;
+        keyLength = sizeof(subkeyName) / sizeof(WCHAR);
+        res = RegEnumKeyExW(key, numKeys, subkeyName, &keyLength, 0, 0, 0, 0);
+        if (res != ERROR_SUCCESS)
+            goto cleanup;
+        res = RegOpenKeyExW(key, subkeyName, 0, KEY_READ, &subkey);
+        if (res != ERROR_SUCCESS)
+            goto cleanup;
+        dwBufLen = MAX_PATH + 8;
+        res = RegGetValueW(subkey, NULL, wszAssembly, RRF_RT_REG_SZ, NULL, codebase, &dwBufLen);
+        RegCloseKey(subkey);
+        if (res != ERROR_SUCCESS)
+            goto cleanup;
+        hr = get_file_from_strongname(codebase, filename, MAX_PATH);
+        if (!SUCCEEDED(hr))
+            goto cleanup;
     }
 
-    /* Strip file:/// */
-    if(strncmpW(codebase, wszFileSlash, strlenW(wszFileSlash)) == 0)
-        offset = strlenW(wszFileSlash);
-
-    strcpyW(filename, codebase + offset);
-
     TRACE("codebase (%s)\n", debugstr_w(filename));
 
     *ppObj = NULL;




More information about the wine-cvs mailing list