Vincent Povirk : mscoree: Implement LoadLibraryShim.

Alexandre Julliard julliard at winehq.org
Thu Oct 28 12:19:54 CDT 2010


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Wed Oct 27 10:51:19 2010 -0500

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);
 




More information about the wine-cvs mailing list