本地服务器COM中的IConnectionPoint事件
我创建了一个支持ConnectionPoint事件的本地服务器(EXE)COM项目 idl伪:本地服务器COM中的IConnectionPoint事件,com,Com,我创建了一个支持ConnectionPoint事件的本地服务器(EXE)COM项目 idl伪: interface IAtlClass : IDispatch{ [id(1)] HRESULT f1(); }; library ComExeLib { dispinterface _IAtlClassEvents { methods: [id(1)] HRESULT f2(); }; [ uuid(..
interface IAtlClass : IDispatch{
[id(1)] HRESULT f1();
};
library ComExeLib
{
dispinterface _IAtlClassEvents
{
methods:
[id(1)] HRESULT f2();
};
[
uuid(...
]
coclass AtlClass
{
[default] interface IAtlClass;
[default, source] dispinterface _IAtlClassEvents;
};
})
服务器内置于32位配置中。客户端代码,内置64位
HRESULT hr = CoInitialize(NULL);
IAtlClass* atlClass;
hr = CoCreateInstance(CLSID_AtlClass, NULL,
CLSCTX_LOCAL_SERVER,
IID_IAtlClass,
reinterpret_cast<void**>(&atlClass));
hr = atlClass->f1();
IConnectionPointContainer* pICPC = NULL;
hr = atlClass->QueryInterface(IID_IConnectionPointContainer, (VOID **)&pICPC);
IConnectionPoint* pICP = NULL;
hr = pICPC->FindConnectionPoint(DIID__IAtlClassEvents, &pICP);
hr = pICP->Advise((_IAtlClassEvents*)&sink, &cookie);
这些都与IAtlClass
(一些标准MS iid-)无关
最后,
advice
返回E_意外灾难性故障
,问题是我做错了什么?\u IAtlClassEvents::QueryInterface
实现应至少支持IUnknown
,也可能支持IDispatch
。如果组件支持多个事件接口怎么办(IAtlClassEvents2
)?每个都需要一个单独的接收器。无论如何,您正在使用ATL-为什么您要重新发明轮子,而不是使用ATL专门为此目的提供的机制?请参阅-它的设计使类可以多次从中继承,每个实例处理一个事件接口。另请参阅:当服务器调用f2()
client getRPC_E_SERVERFAULT
(服务器catch(…)
not hit)你说的“client get”是什么意思?获取位置和方式?哪个调用确切地返回RPC_E_SERVERFAULT
?\u IAtlClassEvents::QueryInterface
实现应至少支持IUnknown
,也可能支持IDispatch
。如果组件支持多个事件接口(IAtlClassEvents2
)?每个都需要一个单独的接收器。无论如何,您正在使用ATL-为什么您要重新发明轮子,而不是使用ATL专门为此目的提供的机制?请参阅-它的设计使类可以多次从中继承,每个实例处理一个事件接口。另请参阅:当服务器调用f2()
client getRPC_E_SERVERFAULT
(servercatch(…)
not hit)你说的“client get”是什么意思?从何处获取以及如何获取?哪个调用确切地返回RPC_E_SERVERFAULT
?
class Sink : public _IAtlClassEvents
{
public:
HRESULT STDMETHODCALLTYPE QueryInterface(
/* [in] */ REFIID riid,
/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
{
if ((DIID__IAtlClassEvents == riid))
{
*ppvObject = static_cast<_IAtlClassEvents*>(this);
AddRef();
return(S_OK);
}
*ppvObject = NULL;
return(E_NOINTERFACE);
}
ULONG STDMETHODCALLTYPE AddRef(void)
{
return(InterlockedIncrement(&m_iRef));
}
ULONG STDMETHODCALLTYPE Release(void)
{
if (0 == InterlockedDecrement(&m_iRef))
{
delete this;
return(0);
}
return(m_iRef);
}
HRESULT STDMETHODCALLTYPE GetTypeInfoCount()
HRESULT STDMETHODCALLTYPE GetTypeInfo()
HRESULT STDMETHODCALLTYPE GetIDsOfNames()
HRESULT STDMETHODCALLTYPE Invoke()
};
{00000003-0000-0000-C000-000000000046}
{ECC8691B-C1DB-4DC0-855E-65F6C551AF49}
{00000003-0000-0000-C000-000000000046}
{0000001B-0000-0000-C000-000000000046}
{IID_IUnknown}