ウィンドウメッセージWM_GETOBJECTを使用した別の可能な解決策もあります。
オブジェクトを持つアプリケーションでは、独自のクラスでウィンドウを作成するだけです。ハンドラーでは、次のようにウィンドウメッセージを処理する必要があります(インターフェイスの例としてIDispatchを使用します)。
LRESULT WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_GETOBJECT:
{
if(lParam == OBJID_NATIVEOM)
{
return LresultFromObject(IID_IDispatch, wParam, g_MyGlobalIDispatchPointer);
}
else
{
// Not handled
break;
}
}
return 0;
}
// Default
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
他のアプリケーションは、その特定のウィンドウを見つけて、 AccessibleObjectFromWindowを介してオブジェクトを取得する必要があります
例:
HWND hWndCommunicator = FindWindow(_T("MyWindowClassOfTheOtherApplication"), _T("MyWindowTitleOfTheOtherApplication"));
if(hWndCommunicator)
{
IDispatch* poObject = nullptr;
HRESULT hr = AccessibleObjectFromWindow(hWndCommunicator, static_cast<DWORD>(OBJID_NATIVEOM), IID_IDispatch, &poWindow);
if(SUCCEEDED(hr))
{
// Do something with the object of the other process
// i. e. poObject->Invoke
}
}
マーシャリングは、このソリューションを使用して自動的に実行されます。