mscoree: Implement ICLRMetaHost_GetRuntime.
This commit is contained in:
parent
ad9507b5f3
commit
a7bda5c2b5
|
@ -290,6 +290,8 @@ HRESULT RuntimeHost_Construct(const CLRRuntimeInfo *runtime_version,
|
||||||
This->mono = loaded_mono;
|
This->mono = loaded_mono;
|
||||||
This->legacy = FALSE;
|
This->legacy = FALSE;
|
||||||
|
|
||||||
|
*result = This;
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "winreg.h"
|
#include "winreg.h"
|
||||||
#include "ole2.h"
|
#include "ole2.h"
|
||||||
|
|
||||||
|
#include "corerror.h"
|
||||||
#include "mscoree.h"
|
#include "mscoree.h"
|
||||||
#include "metahost.h"
|
#include "metahost.h"
|
||||||
#include "mscoree_private.h"
|
#include "mscoree_private.h"
|
||||||
|
@ -86,15 +87,11 @@ static HRESULT CLRRuntimeInfo_GetRuntimeHost(CLRRuntimeInfo *This, RuntimeHost *
|
||||||
|
|
||||||
EnterCriticalSection(&runtime_list_cs);
|
EnterCriticalSection(&runtime_list_cs);
|
||||||
|
|
||||||
if (!This->loaded_runtime)
|
|
||||||
goto end;
|
|
||||||
|
|
||||||
hr = load_mono(This, &ploaded_mono);
|
hr = load_mono(This, &ploaded_mono);
|
||||||
|
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
hr = RuntimeHost_Construct(This, ploaded_mono, &This->loaded_runtime);
|
hr = RuntimeHost_Construct(This, ploaded_mono, &This->loaded_runtime);
|
||||||
|
|
||||||
end:
|
|
||||||
LeaveCriticalSection(&runtime_list_cs);
|
LeaveCriticalSection(&runtime_list_cs);
|
||||||
|
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
|
@ -662,12 +659,81 @@ static ULONG WINAPI CLRMetaHost_Release(ICLRMetaHost* iface)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL parse_runtime_version(LPCWSTR version, DWORD *major, DWORD *minor, DWORD *build)
|
||||||
|
{
|
||||||
|
*major = 0;
|
||||||
|
*minor = 0;
|
||||||
|
*build = 0;
|
||||||
|
|
||||||
|
if (version[0] == 'v')
|
||||||
|
{
|
||||||
|
version++;
|
||||||
|
if (!isdigit(*version))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
while (isdigit(*version))
|
||||||
|
*major = *major * 10 + (*version++ - '0');
|
||||||
|
|
||||||
|
if (*version == 0)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
if (*version++ != '.' || !isdigit(*version))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
while (isdigit(*version))
|
||||||
|
*minor = *minor * 10 + (*version++ - '0');
|
||||||
|
|
||||||
|
if (*version == 0)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
if (*version++ != '.' || !isdigit(*version))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
while (isdigit(*version))
|
||||||
|
*build = *build * 10 + (*version++ - '0');
|
||||||
|
|
||||||
|
return *version == 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI CLRMetaHost_GetRuntime(ICLRMetaHost* iface,
|
static HRESULT WINAPI CLRMetaHost_GetRuntime(ICLRMetaHost* iface,
|
||||||
LPCWSTR pwzVersion, REFIID iid, LPVOID *ppRuntime)
|
LPCWSTR pwzVersion, REFIID iid, LPVOID *ppRuntime)
|
||||||
{
|
{
|
||||||
FIXME("%s %s %p\n", debugstr_w(pwzVersion), debugstr_guid(iid), ppRuntime);
|
int i;
|
||||||
|
DWORD major, minor, build;
|
||||||
|
|
||||||
return E_NOTIMPL;
|
TRACE("%s %s %p\n", debugstr_w(pwzVersion), debugstr_guid(iid), ppRuntime);
|
||||||
|
|
||||||
|
if (!pwzVersion)
|
||||||
|
return E_POINTER;
|
||||||
|
|
||||||
|
if (!parse_runtime_version(pwzVersion, &major, &minor, &build))
|
||||||
|
{
|
||||||
|
ERR("Cannot parse %s\n", debugstr_w(pwzVersion));
|
||||||
|
return CLR_E_SHIM_RUNTIME;
|
||||||
|
}
|
||||||
|
|
||||||
|
find_runtimes();
|
||||||
|
|
||||||
|
for (i=0; i<NUM_RUNTIMES; i++)
|
||||||
|
{
|
||||||
|
if (runtimes[i].major == major && runtimes[i].minor == minor &&
|
||||||
|
runtimes[i].build == build)
|
||||||
|
{
|
||||||
|
if (runtimes[i].mono_abi_version)
|
||||||
|
return IUnknown_QueryInterface((IUnknown*)&runtimes[i], iid, ppRuntime);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ERR("Mono is missing %s runtime\n", debugstr_w(pwzVersion));
|
||||||
|
return CLR_E_SHIM_RUNTIME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FIXME("Unrecognized version %s\n", debugstr_w(pwzVersion));
|
||||||
|
return CLR_E_SHIM_RUNTIME;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI CLRMetaHost_GetVersionFromFile(ICLRMetaHost* iface,
|
static HRESULT WINAPI CLRMetaHost_GetVersionFromFile(ICLRMetaHost* iface,
|
||||||
|
|
|
@ -118,10 +118,14 @@ void test_getruntime(void)
|
||||||
WCHAR buf[MAX_PATH];
|
WCHAR buf[MAX_PATH];
|
||||||
|
|
||||||
hr = ICLRMetaHost_GetRuntime(metahost, NULL, &IID_ICLRRuntimeInfo, (void**)&info);
|
hr = ICLRMetaHost_GetRuntime(metahost, NULL, &IID_ICLRRuntimeInfo, (void**)&info);
|
||||||
todo_wine ok(hr == E_POINTER, "GetVersion failed, hr=%x\n", hr);
|
ok(hr == E_POINTER, "GetVersion failed, hr=%x\n", hr);
|
||||||
|
|
||||||
hr = ICLRMetaHost_GetRuntime(metahost, twodotzero, &IID_ICLRRuntimeInfo, (void**)&info);
|
hr = ICLRMetaHost_GetRuntime(metahost, twodotzero, &IID_ICLRRuntimeInfo, (void**)&info);
|
||||||
todo_wine ok(hr == S_OK, "GetVersion failed, hr=%x\n", hr);
|
if (hr == CLR_E_SHIM_RUNTIME)
|
||||||
|
/* FIXME: Get Mono properly packaged so we can fail here. */
|
||||||
|
todo_wine ok(hr == S_OK, "GetVersion failed, hr=%x\n", hr);
|
||||||
|
else
|
||||||
|
ok(hr == S_OK, "GetVersion failed, hr=%x\n", hr);
|
||||||
if (hr != S_OK) return;
|
if (hr != S_OK) return;
|
||||||
|
|
||||||
count = MAX_PATH;
|
count = MAX_PATH;
|
||||||
|
@ -134,7 +138,7 @@ void test_getruntime(void)
|
||||||
|
|
||||||
/* Versions must match exactly. */
|
/* Versions must match exactly. */
|
||||||
hr = ICLRMetaHost_GetRuntime(metahost, twodotzerodotzero, &IID_ICLRRuntimeInfo, (void**)&info);
|
hr = ICLRMetaHost_GetRuntime(metahost, twodotzerodotzero, &IID_ICLRRuntimeInfo, (void**)&info);
|
||||||
todo_wine ok(hr == CLR_E_SHIM_RUNTIME, "GetVersion failed, hr=%x\n", hr);
|
ok(hr == CLR_E_SHIM_RUNTIME, "GetVersion failed, hr=%x\n", hr);
|
||||||
}
|
}
|
||||||
|
|
||||||
START_TEST(metahost)
|
START_TEST(metahost)
|
||||||
|
|
Loading…
Reference in New Issue