From 99eb5faf86e03ac30899d41f9df029e23e68f868 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 | 24 ++++++++++++++++++++++-- dlls/mscoree/mscoree_main.c | 22 +++++++++++++++++++--- dlls/mscoree/mscoree_private.h | 2 ++ dlls/mscoree/tests/mscoree.c | 2 +- 4 files changed, 44 insertions(+), 6 deletions(-) diff --git a/dlls/mscoree/metahost.c b/dlls/mscoree/metahost.c index 57fce37..42d08c0 100644 --- a/dlls/mscoree/metahost.c +++ b/dlls/mscoree/metahost.c @@ -249,9 +249,24 @@ 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 dll_filename[MAX_PATH]; + HRESULT hr; + DWORD cchBuffer; - return E_NOTIMPL; + TRACE("%p %s %p\n", iface, debugstr_w(pwzDllName), phndModule); + + if (!pwzDllName || !phndModule) + return E_POINTER; + + cchBuffer = MAX_PATH - lstrlenW(pwzDllName); + hr = ICLRRuntimeInfo_GetRuntimeDirectory(iface, dll_filename, &cchBuffer); + if (FAILED(hr)) return hr; + + strcatW(dll_filename, pwzDllName); + + *phndModule = LoadLibraryW(dll_filename); + + return *phndModule ? S_OK : E_HANDLE; } static HRESULT WINAPI CLRRuntimeInfo_GetProcAddress(ICLRRuntimeInfo* iface, @@ -947,3 +962,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..c751203 100644 --- a/dlls/mscoree/mscoree_main.c +++ b/dlls/mscoree/mscoree_main.c @@ -549,10 +549,26 @@ 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; + ICLRRuntimeInfo *info; - if (phModDll) *phModDll = LoadLibraryW(szDllName); - return S_OK; + TRACE("(%p %s, %p, %p, %p)\n", szDllName, debugstr_w(szDllName), szVersion, pvReserved, phModDll); + + ret = get_runtime_info(NULL, szVersion, NULL, 0, 0, TRUE, &info); + if (FAILED(ret)) + { + /* FIXME: Get Mono properly packaged so we can fail here. */ + ret = force_get_runtime_info(&info); + } + + if (SUCCEEDED(ret)) + { + ret = ICLRRuntimeInfo_LoadLibrary(info, szDllName, phModDll); + + ICLRRuntimeInfo_Release(info); + } + + return ret; } 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 8fad671..2205b0e 100644 --- a/dlls/mscoree/tests/mscoree.c +++ b/dlls/mscoree/tests/mscoree.c @@ -229,7 +229,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