MIDL передача по ссылке

Предыстория: я работаю над соединением 64-битного процесса с 32-битной DLL с помощью COM -объекта.

Зачем? Хороший вопрос. В настоящее время невозможно перекомпилировать весь исходный код x86 в x64, если нет абсолютно никакого способа обойти это... введите IPC.

Я знаю, что это не сработает; заставить его работать - это моя текущая задача... Полагаю, когда он увидит, что он не работает так же хорошо, мне все равно будет сказано перекомпилировать весь исходный код x86.

Что действительно здорово, так это то, что он работает на тестовом стенде, который я построил. У меня проблемы с доведением до масштаба, однако.

Я очень незнаком с COM - фактически начало этой недели, 16 апреля 2018 года, буквально первый раз, когда я что-либо делал с ним.

У меня есть три части: x64 exe, x86 -> x64 суррогатный exe и x86 .dll

x64 exe работает нормально:

CoInitialize(NULL);

CLSID clsid;
Ix86LibraryProxy* pProxy;

HRESULT hr = CLSIDFromProgID(OLESTR("x86x64.x86LibraryProxy"), &clsid);
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_Ix86LibraryProxy, (void **) &pProxy);
hr = pProxy->Load(HandleToLong(FindWindow(szWindowClass, szTitle)));
CoUninitialize();

Это x86 -> x64 суррогатный exe

// header file declaration
STDMETHOD(Update)(const float& dt, HRESULT* hResult);

//cpp file
STDMETHODIMP Cx86LibraryProxy::Update(const float& dt, HRESULT* hResult)
{
    typedef HRESULT(*DLL_Update)(const float& dt);

    *hResult = S_OK;
    HMODULE hLib = LoadLibrary(L"DLL.dll");

    if (hLib != NULL)
    {
        DLL_Update pFunc = (DLL_Update) GetProcAddress(hLib, "Update");
        if (pFunc != NULL)
        {
            *hResult = (*pFunc)(dt);
        }
        else
        {
            *hResult = E_FAIL;
        }
    }
    else
    {
        *hResult = E_INVALIDARG;
    }

    FreeLibrary(hLib);
    return S_OK;
}

Это экспорт из x86 dll

//x86 dll export
__declspec(dllexport) HRESULT Update(const float& dt)

Довольно стандартная среда выполнения приложений. В.dll есть функция, которая принимает const float& dt и возвращает HRESULT,

Очевидно, что в масштабе я не буду выгружать и перезагружать DLL каждый раз, когда вызываю эту функцию.

В моем файле.idl у меня есть следующее:

interface Ix86LibraryProxy : IDispatch{
    [id(1)] HRESULT Load([in] LONG hWnd, [out, retval] HRESULT* hResult);
    [id(2)] HRESULT Update([in] const float& dt, [out, retval] HRESULT* hResult);
    [id(3)] HRESULT Render([out, retval] HRESULT* hResult);
};

с ошибкой компилятора Error 1 error MIDL2025: syntax error : expecting a declarator or * near "&"

Я вижу, что MIDL не поддерживает конструкции C++, но я не вижу способа обойти это.

Любые изменения подписи в файле.idl ([id(2)] HRESULT Update([in] const float dt, [out, retval] HRESULT* hResult);) генерирует эту ошибку: Error 1 error C2259: 'ATL::CComObject<T>' : cannot instantiate abstract class

Я вижу, что этот вопрос задает аналогичный вопрос, но ответ на него не кажется, что он отвечает на вопрос, поскольку он ничего не делает с файлом MIDL: /questions/1937723/midl-postoyannyie-ssyilki/1937730#1937730

Так как не кажется, что MIDL поддерживает передачу по ссылке, что бы обойти это?

Чего я также не понимаю, так это того, что если проект для dll x86 не соответствует решению суррогатного процесса x86 -> x64, то суррогатный процесс x86 -> x64 не может найти модуль, когда пытается LoadLibrary("DLL.dll") с GetLastError() == 126

0 ответов

Другие вопросы по тегам