C ++ Не удалось найти точку входа в процедуру CLRCreateInstance в динамической c библиотеке ссылок mscoree.dll. - PullRequest
0 голосов
/ 18 марта 2020

У меня есть следующий код, который проверяет версии 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

В функцию main () я добавил условие

if (GetProcAddress(clrInst, "CLRCreateInstance") != NULL)

, но это не помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...