ATL进程外回调接口上的“未注册接口”错误

时间:2013-07-26 07:10:09

标签: c# c++ com atl

我有一个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.Advise(this)'时,我收到'Interface not registered'(80040105)错误

我花了几个小时寻找类似的问题,却找不到任何东西。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

为了使这个工作在proc-of-proc之外,你需要在进程之间编组接口。很可能您会依赖自动化编组,它使用从您的IDL生成的类型库来查找编组的内容和方法。问题是只能用于IDL中标记为[oleautomation][dual]或两者的接口。 See this answer for more details

您最好的选择是将您想要编组的接口标记为[oleautomation],并添加一条评论,例如“如果您删除此信息,编组魔法会消失”。