static void test_getruntime(WCHAR *version) { static const WCHAR dotzero[] = {'.','0',0}; WCHAR *dot; HRESULT hr; ICLRRuntimeInfo *info; DWORD count; WCHAR buf[MAX_PATH]; hr = ICLRMetaHost_GetRuntime(metahost, NULL, &IID_ICLRRuntimeInfo, (void**)&info); ok(hr == E_POINTER, "GetVersion failed, hr=%x\n", hr); hr = ICLRMetaHost_GetRuntime(metahost, version, &IID_ICLRRuntimeInfo, (void**)&info); ok(hr == S_OK, "GetVersion failed, hr=%x\n", hr); if (hr != S_OK) return; count = MAX_PATH; hr = ICLRRuntimeInfo_GetVersionString(info, buf, &count); ok(hr == S_OK, "GetVersionString returned %x\n", hr); ok(count == lstrlenW(buf)+1, "GetVersionString returned count %u but string of length %u\n", count, lstrlenW(buf)+1); ok(lstrcmpW(buf, version) == 0, "got unexpected version %s\n", wine_dbgstr_w(buf)); ICLRRuntimeInfo_Release(info); /* Versions must match exactly. */ dot = strrchrW(version, '.'); lstrcpyW(dot, dotzero); hr = ICLRMetaHost_GetRuntime(metahost, version, &IID_ICLRRuntimeInfo, (void**)&info); ok(hr == CLR_E_SHIM_RUNTIME, "GetVersion failed, hr=%x\n", hr); }
HRESULT WINAPI GetRequestedRuntimeInfo(LPCWSTR pExe, LPCWSTR pwszVersion, LPCWSTR pConfigurationFile, DWORD startupFlags, DWORD runtimeInfoFlags, LPWSTR pDirectory, DWORD dwDirectory, DWORD *dwDirectoryLength, LPWSTR pVersion, DWORD cchBuffer, DWORD *dwlength) { HRESULT ret; ICLRRuntimeInfo *info; DWORD length_dummy; TRACE("(%s, %s, %s, 0x%08x, 0x%08x, %p, 0x%08x, %p, %p, 0x%08x, %p)\n", debugstr_w(pExe), debugstr_w(pwszVersion), debugstr_w(pConfigurationFile), startupFlags, runtimeInfoFlags, pDirectory, dwDirectory, dwDirectoryLength, pVersion, cchBuffer, dwlength); if (!dwDirectoryLength) dwDirectoryLength = &length_dummy; if (!dwlength) dwlength = &length_dummy; ret = get_runtime_info(pExe, pwszVersion, pConfigurationFile, startupFlags, runtimeInfoFlags, TRUE, &info); if (SUCCEEDED(ret)) { *dwlength = cchBuffer; ret = ICLRRuntimeInfo_GetVersionString(info, pVersion, dwlength); if (SUCCEEDED(ret)) { *dwDirectoryLength = dwDirectory; ret = ICLRRuntimeInfo_GetRuntimeDirectory(info, pDirectory, dwDirectoryLength); } ICLRRuntimeInfo_Release(info); } return ret; }
static void test_enumruntimes(void) { IEnumUnknown *runtime_enum; IUnknown *unk; DWORD count; ICLRRuntimeInfo *runtime_info; HRESULT hr; WCHAR buf[MAX_PATH]; hr = ICLRMetaHost_EnumerateInstalledRuntimes(metahost, &runtime_enum); ok(hr == S_OK, "EnumerateInstalledRuntimes returned %x\n", hr); if (FAILED(hr)) return; while ((hr = IEnumUnknown_Next(runtime_enum, 1, &unk, &count)) == S_OK) { hr = IUnknown_QueryInterface(unk, &IID_ICLRRuntimeInfo, (void**)&runtime_info); ok(hr == S_OK, "QueryInterface returned %x\n", hr); count = 1; hr = ICLRRuntimeInfo_GetVersionString(runtime_info, buf, &count); ok(hr == E_NOT_SUFFICIENT_BUFFER, "GetVersionString returned %x\n", hr); ok(count > 1, "GetVersionString returned count %u\n", count); count = 0xdeadbeef; hr = ICLRRuntimeInfo_GetVersionString(runtime_info, NULL, &count); ok(hr == S_OK, "GetVersionString returned %x\n", hr); ok(count > 1 && count != 0xdeadbeef, "GetVersionString returned count %u\n", count); count = MAX_PATH; hr = ICLRRuntimeInfo_GetVersionString(runtime_info, buf, &count); ok(hr == S_OK, "GetVersionString returned %x\n", hr); ok(count > 1, "GetVersionString returned count %u\n", count); trace("runtime found: %s\n", wine_dbgstr_w(buf)); ICLRRuntimeInfo_Release(runtime_info); IUnknown_Release(unk); test_getruntime(buf); } ok(hr == S_FALSE, "IEnumUnknown_Next returned %x\n", hr); IEnumUnknown_Release(runtime_enum); }
static HRESULT WINAPI CLRRuntimeInfo_LoadLibrary(ICLRRuntimeInfo* iface, LPCWSTR pwzDllName, HMODULE *phndModule) { WCHAR version[MAX_PATH]; HRESULT hr; DWORD cchBuffer; 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); }
HRESULT WINAPI GetCORVersion(LPWSTR pbuffer, DWORD cchBuffer, DWORD *dwLength) { ICLRRuntimeInfo *info; HRESULT ret; TRACE("(%p, %d, %p)!\n", pbuffer, cchBuffer, dwLength); if (!dwLength || !pbuffer) return E_POINTER; ret = get_runtime_info(NULL, NULL, NULL, 0, RUNTIME_INFO_UPGRADE_VERSION, TRUE, &info); if (SUCCEEDED(ret)) { *dwLength = cchBuffer; ret = ICLRRuntimeInfo_GetVersionString(info, pbuffer, dwLength); ICLRRuntimeInfo_Release(info); } return ret; }
static HRESULT WINAPI CLRRuntimeInfo_GetRuntimeDirectory(ICLRRuntimeInfo* iface, LPWSTR pwzBuffer, DWORD *pcchBuffer) { static const WCHAR slash[] = {'\\',0}; DWORD buffer_size = *pcchBuffer; WCHAR system_dir[MAX_PATH]; WCHAR version[MAX_PATH]; DWORD version_size, size; HRESULT hr = S_OK; TRACE("%p %p %p\n", iface, pwzBuffer, pcchBuffer); if (!get_install_root(system_dir)) { ERR("error reading registry key for installroot\n"); return E_FAIL; } else { version_size = MAX_PATH; ICLRRuntimeInfo_GetVersionString(iface, version, &version_size); lstrcatW(system_dir, version); lstrcatW(system_dir, slash); size = lstrlenW(system_dir) + 1; } *pcchBuffer = size; if (pwzBuffer) { if (buffer_size >= size) strcpyW(pwzBuffer, system_dir); else hr = E_NOT_SUFFICIENT_BUFFER; } return hr; }