MIDL通过引用传递

时间:2018-04-19 15:33:41

标签: c++ com atl midl

Backstory:我正在使用COM对象将64位进程桥接到32位DLL。

为什么呢?好问题。目前不可能将所有x86源代码重新编译为x64,除非绝对没有办法解决它...进入IPC。

我知道它不会表现得那么好;让它工作是我当前的任务......我假设一旦看到它表现不佳,我将被告知要重新编译所有的x86源代码。

但很酷的是,它与我建立的测试平台一起工作。然而,我在将其提升到规模时遇到了问题。

我对COM非常不熟悉 - 实际上本周初,2018年4月16日是我第一次用它做过任何事情。

我有三件: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文件没有任何作用:https://stackoverflow.com/a/3028861/4518677

由于MIDL似乎不支持通过引用传递,这会是什么方法呢?

我还不明白的是,如果x86 dll的项目与x86的解决方案不同 - &gt; x64代理过程,x86 - &gt; x64代理进程在尝试使用LoadLibrary("DLL.dll")

GetLastError() == 126时找不到该模块

0 个答案:

没有答案