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
时找不到该模块