From 3cf59b84045e4cd086420c18252de03e3e4b7041 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Wed, 27 Oct 2010 10:51:19 -0500 Subject: [PATCH 03/20] mscoree: Implement LoadLibraryShim. --- dlls/mscoree/metahost.c | 17 +++++++++++++++-- dlls/mscoree/mscoree_main.c | 38 +++++++++++++++++++++++++++++++++++--- dlls/mscoree/mscoree_private.h | 2 ++ dlls/mscoree/tests/mscoree.c | 2 +- 4 files changed, 53 insertions(+), 6 deletions(-) diff --git a/dlls/mscoree/metahost.c b/dlls/mscoree/metahost.c index 57fce37..0f28788 100644 --- a/dlls/mscoree/metahost.c +++ b/dlls/mscoree/metahost.c @@ -249,9 +249,17 @@ static HRESULT WINAPI CLRRuntimeInfo_LoadErrorString(ICLRRuntimeInfo* iface, static HRESULT WINAPI CLRRuntimeInfo_LoadLibrary(ICLRRuntimeInfo* iface, LPCWSTR pwzDllName, HMODULE *phndModule) { - FIXME("%p %s %p\n", iface, debugstr_w(pwzDllName), phndModule); + WCHAR version[MAX_PATH]; + HRESULT hr; + DWORD cchBuffer; - return E_NOTIMPL; + TRACE("%p %s %p\n", iface, debugstr_w(pwzDllName), phndModule); + + cchBuffer = MAX_PATH; + hr = ICLRRuntimeInfo_GetVersionString(iface, version, &cchBuffer); + if (FAILED(hr)) return hr; + + return LoadLibraryShim(pwzDllName, version, NULL, phndModule); } static HRESULT WINAPI CLRRuntimeInfo_GetProcAddress(ICLRRuntimeInfo* iface, @@ -947,3 +955,8 @@ HRESULT get_runtime_info(LPCWSTR exefile, LPCWSTR version, LPCWSTR config_file, return CLR_E_SHIM_RUNTIME; } + +HRESULT force_get_runtime_info(ICLRRuntimeInfo **result) +{ + return IUnknown_QueryInterface((IUnknown*)&runtimes[0], &IID_ICLRRuntimeInfo, (void**)result); +} diff --git a/dlls/mscoree/mscoree_main.c b/dlls/mscoree/mscoree_main.c index a57d766..9c91112 100644 --- a/dlls/mscoree/mscoree_main.c +++ b/dlls/mscoree/mscoree_main.c @@ -549,10 +549,42 @@ HRESULT WINAPI GetRequestedRuntimeInfo(LPCWSTR pExe, LPCWSTR pwszVersion, LPCWST HRESULT WINAPI LoadLibraryShim( LPCWSTR szDllName, LPCWSTR szVersion, LPVOID pvReserved, HMODULE * phModDll) { - FIXME("(%p %s, %p, %p, %p): semi-stub\n", szDllName, debugstr_w(szDllName), szVersion, pvReserved, phModDll); + HRESULT ret=S_OK; + WCHAR dll_filename[MAX_PATH]; + WCHAR version[MAX_PATH]; + static const WCHAR default_version[] = {'v','1','.','1','.','4','3','2','2',0}; + static const WCHAR slash[] = {'\\',0}; + DWORD dummy; - if (phModDll) *phModDll = LoadLibraryW(szDllName); - return S_OK; + TRACE("(%p %s, %p, %p, %p)\n", szDllName, debugstr_w(szDllName), szVersion, pvReserved, phModDll); + + if (!szDllName || !phModDll) + return E_POINTER; + + if (!get_install_root(dll_filename)) + { + ERR("error reading registry key for installroot\n"); + dll_filename[0] = 0; + } + else + { + if (!szVersion) + { + ret = GetCORVersion(version, MAX_PATH, &dummy); + if (SUCCEEDED(ret)) + szVersion = version; + else + szVersion = default_version; + } + strcatW(dll_filename, szVersion); + strcatW(dll_filename, slash); + } + + strcatW(dll_filename, szDllName); + + *phModDll = LoadLibraryW(dll_filename); + + return *phModDll ? S_OK : E_HANDLE; } HRESULT WINAPI LockClrVersion(FLockClrVersionCallback hostCallback, FLockClrVersionCallback *pBeginHostSetup, FLockClrVersionCallback *pEndHostSetup) diff --git a/dlls/mscoree/mscoree_private.h b/dlls/mscoree/mscoree_private.h index 6273b82..62fa0bf 100644 --- a/dlls/mscoree/mscoree_private.h +++ b/dlls/mscoree/mscoree_private.h @@ -48,6 +48,8 @@ typedef struct CLRRuntimeInfo extern HRESULT get_runtime_info(LPCWSTR exefile, LPCWSTR version, LPCWSTR config_file, DWORD startup_flags, DWORD runtimeinfo_flags, BOOL legacy, ICLRRuntimeInfo **result); +extern HRESULT force_get_runtime_info(ICLRRuntimeInfo **result); + /* Mono 2.6 embedding */ typedef struct _MonoDomain MonoDomain; typedef struct _MonoAssembly MonoAssembly; diff --git a/dlls/mscoree/tests/mscoree.c b/dlls/mscoree/tests/mscoree.c index cafd8d8..6426ac6 100644 --- a/dlls/mscoree/tests/mscoree.c +++ b/dlls/mscoree/tests/mscoree.c @@ -241,7 +241,7 @@ static void test_loadlibraryshim(void) } hr = pLoadLibraryShim(nosuchdll, latest, NULL, &hdll); - todo_wine ok(hr == E_HANDLE, "LoadLibraryShim failed, hr=%x\n", hr); + ok(hr == E_HANDLE, "LoadLibraryShim failed, hr=%x\n", hr); if (SUCCEEDED(hr)) FreeLibrary(hdll); -- 1.7.1