本地服务器COM中的IConnectionPoint事件

本地服务器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(..

我创建了一个支持ConnectionPoint事件的本地服务器(EXE)COM项目

idl伪:

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 get
RPC_E_SERVERFAULT
(服务器
catch(…)
not hit)你说的“client get”是什么意思?获取位置和方式?哪个调用确切地返回
RPC_E_SERVERFAULT
\u IAtlClassEvents::QueryInterface
实现应至少支持
IUnknown
,也可能支持
IDispatch
。如果组件支持多个事件接口(
IAtlClassEvents2
)?每个都需要一个单独的接收器。无论如何,您正在使用ATL-为什么您要重新发明轮子,而不是使用ATL专门为此目的提供的机制?请参阅-它的设计使类可以多次从中继承,每个实例处理一个事件接口。另请参阅:当服务器调用
f2()
client get
RPC_E_SERVERFAULT
(server
catch(…)
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}