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