COM
インタープロセスオブジェクトを扱う場合、 を使用せずに をにキャストIDispatch*
しても安全ですか?IUnknown*
QueryInterface
ここで、IDispatch
オブジェクトは他のプロセスから取得されますOtherProcess.exe
。そして、私の同僚は、 を得るために に電話QueryInterface
するべきだと言っています。IDispatch
IUnknown
現在、私はやっています:
void CComThrowDispatch::CheckCOMAvailabilty() const
{
IUnknown * pIUnknown = m_spDispatchDriver.p;
// is this line above a problem ?
// m_spDispatchDriver is an ATL CComDispatchDriver
// it handles an object instanciated in another process.
// m_spDispatchDriver.p is of type IDispatch*
if (pIUnknown == nullptr) return;
bool bComObjectReachable = ::CoIsHandlerConnected(pIUnknown) == TRUE;
if (bComObjectReachable == false)
{
throw MyException;
}
}
彼の提案に関する私の問題: 私は、OtherProcess.exe がクラッシュしたか強制終了された場合 (アクセス違反) に対処しています。この存在しない OtherProcess.exe からオブジェクトをカプセル化するInvoke
on のような関数を呼び出すと、これらのアクセス違反が引き起こされるようです (編集:コメントと回答は、この最新の仮定が完全に誤りであったことを示しています!)。IDispatch
そのため、 as パラメーター::CoIsHandlerConnected(pIUnknown);
を取るアプリケーションのテストを保護しようとしています。IUnknown
しかし、同僚が私にアドバイスするように、QueryInterface
を呼び出すことによって、私が解決しようとしている同じ問題に戻ることを 恐れています: これは、もはや存在しないオブジェクトを処理します。 (もう一度編集します。この仮定も誤りです)。IDispatch
IDispatch
QueryInterface
IUnknown
キャストをするだけで本当に間違っていますか?死んだプロセス間COM
オブジェクトを処理する一般的な方法は何ですか?
これは、OAIdl.h 内の の定義の始まりであり、IDispatch
から派生したものとして宣言されていIUnknown
ます。
MIDL_INTERFACE("00020400-0000-0000-C000-000000000046")
IDispatch : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(
/* [out] */ __RPC__out UINT *pctinfo) = 0;