У меня есть следующий код, который проверяет версии CLR, установленные на P C.
#include <string>
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
#include <iomanip>
#include <windows.h>
#import <mscorlib.tlb> raw_interfaces_only auto_rename
#include <metahost.h>
#pragma comment( lib, "Mscoree" )
_COM_SMARTPTR_TYPEDEF(ICLRMetaHost, IID_ICLRMetaHost);
_COM_SMARTPTR_TYPEDEF(ICLRRuntimeInfo, IID_ICLRRuntimeInfo);
int checkCLRversion()
{
ICLRMetaHostPtr pMetaHost{ nullptr };
HRESULT hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_PPV_ARGS(&pMetaHost));
if (FAILED(hr))
return -1;
IEnumUnknownPtr enumptr{ nullptr };
hr = pMetaHost->EnumerateInstalledRuntimes(&enumptr);
if (FAILED(hr))
return -1;
while (true)
{
ULONG fetched{ 0 };
IUnknownPtr uptr{ nullptr };
hr = enumptr->Next(1, &uptr, &fetched);
if (hr == S_OK)
{
ICLRRuntimeInfoPtr crlri{ uptr };
DWORD size{ 0 };
hr = crlri->GetVersionString(nullptr, &size);
if (hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) && size > 0)
{
std::wstring version(size, 0);
hr = crlri->GetVersionString(&version.front(), &size);
if (SUCCEEDED(hr))
{
std::wcout << version << std::endl;
}
}
}
else
break;
};
return 0;
}
void main()
{
HMODULE clrInst = LoadLibraryA("C:\\Windows\\System32\\mscoree.dll");
if (GetProcAddress(clrInst, "CLRCreateInstance") != NULL)
{
checkCLRversion();
}
}
Он прекрасно работает и работает почти на всех машинах, но если я попытаюсь запустить это приложение на Win 7 На компьютере без установленного пакета обновления 1 появляется сообщение об ошибке «Не удалось найти точку входа в процедуру CLRCreateInstance в динамической c библиотеке ссылок mscoree.dll». ![text](https://i.ibb.co/34409m6/Screenshot-from-2020-03-18-13-18-58.png)
В функцию main () я добавил условие
if (GetProcAddress(clrInst, "CLRCreateInstance") != NULL)
, но это не помогло.