Commit 13195151 authored by Daniel Jelinski's avatar Daniel Jelinski Committed by Alexandre Julliard

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

parent 0eaa3ec9
...@@ -1235,6 +1235,7 @@ HRESULT RuntimeHost_Destroy(RuntimeHost *This) ...@@ -1235,6 +1235,7 @@ HRESULT RuntimeHost_Destroy(RuntimeHost *This)
HRESULT create_monodata(REFIID riid, LPVOID *ppObj ) 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 wszCodebase[] = {'C','o','d','e','B','a','s','e',0};
static const WCHAR wszClass[] = {'C','l','a','s','s',0}; static const WCHAR wszClass[] = {'C','l','a','s','s',0};
static const WCHAR wszFileSlash[] = {'f','i','l','e',':','/','/','/',0}; static const WCHAR wszFileSlash[] = {'f','i','l','e',':','/','/','/',0};
...@@ -1246,11 +1247,12 @@ HRESULT create_monodata(REFIID riid, LPVOID *ppObj ) ...@@ -1246,11 +1247,12 @@ HRESULT create_monodata(REFIID riid, LPVOID *ppObj )
ICLRRuntimeInfo *info = NULL; ICLRRuntimeInfo *info = NULL;
RuntimeHost *host; RuntimeHost *host;
HRESULT hr; HRESULT hr;
HKEY key; HKEY key, subkey;
LONG res; LONG res;
int offset = 0; int offset = 0;
DWORD numKeys, keyLength;
WCHAR codebase[MAX_PATH + 8]; WCHAR codebase[MAX_PATH + 8];
WCHAR classname[350]; WCHAR classname[350], subkeyName[256];
WCHAR filename[MAX_PATH]; WCHAR filename[MAX_PATH];
DWORD dwBufLen = 350; DWORD dwBufLen = 350;
...@@ -1277,19 +1279,40 @@ HRESULT create_monodata(REFIID riid, LPVOID *ppObj ) ...@@ -1277,19 +1279,40 @@ HRESULT create_monodata(REFIID riid, LPVOID *ppObj )
dwBufLen = MAX_PATH + 8; dwBufLen = MAX_PATH + 8;
res = RegGetValueW( key, NULL, wszCodebase, RRF_RT_REG_SZ, NULL, codebase, &dwBufLen); 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; 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)); TRACE("codebase (%s)\n", debugstr_w(filename));
*ppObj = NULL; *ppObj = NULL;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment