在处理进程间COM
对象时,不使用将 aIDispatch*
转换为a 是否安全?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.exeInvoke
的任何对象的任何函数都会引发这些访问冲突(编辑:评论和答案表明这个最新的假设是完全错误的!)。IDispatch
这就是我试图保护::CoIsHandlerConnected(pIUnknown);
采用IUnknown
as 参数的应用程序测试的原因。
但是通过调用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;