';接口未注册';ATL进程外回调接口出错

本文关键字:接口 回调 出错 注册 ATL 进程 | 更新日期: 2023-09-27 18:24:57

我有一个ATL进程内服务器,它实现了这样的回调接口:

.idl

interface IClientEvents : IUnknown{
    [] HRESULT TestEvent(void);
};
interface IATLSimpleObject : IDispatch{
    [id(1)] HRESULT Advise([in] IClientEvents* clientEvents);
    [id(2)] HRESULT Unadvise(void);
};

.h

private:
    IClientEvents* m_ClientEvents;
public:
    STDMETHOD(Advise)(IClientEvents* clientEvents);
    STDMETHOD(Unadvise)(void);

.cpp

STDMETHODIMP CATLSimpleObject::Advise(IClientEvents* clientEvents)
{
    m_ClientEvents = clientEvents;
    m_ClientEvents->AddRef();
    return S_OK;
}
STDMETHODIMP CATLSimpleObject::Unadvise(void)
{
    m_ClientEvents->Release();
    m_ClientEvents = NULL;
    return S_OK;
}

C#客户端

public partial class Form1 : Form, ATLProject1Lib.IClientEvents
{
    private ATLProject1Lib.ATLSimpleObject ATLSimple = new ATLProject1Lib.ATLSimpleObject();
    private void Form1_Shown(object sender, EventArgs e)
    {
        ATLSimple.Advise(this);
    }
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        ATLSimple.Unadvise();
    }

它工作得很好,但我需要在进程外的服务器中做同样的事情,然而,在执行时,我在调用"ATLSimple.Advice(this)"时收到"Interface not Registered"(80040105)错误。

我花了几个小时寻找类似的问题,但什么也找不到。如有任何帮助,我们将不胜感激。

';接口未注册';ATL进程外回调接口出错

为了在进程外实现这一点,您需要在进程之间整理接口。您很可能希望依赖Automation编组,它使用从IDL生成的typelib来查找编组内容和方式。问题是,这只适用于IDL中标记为[oleautomation][dual]或两者都标记的接口。有关详细信息,请参阅此答案。

最好将要编组的接口标记为[oleautomation],并添加一条注释,如"如果删除它,编组魔法就会消失"。