COM c++中的自定义事件处理

Custom Event Handling in COM c++

本文关键字:自定义 事件处理 c++ COM      更新时间:2023-10-16

我有一个c#.NET类,它有一个事件签名,使用如下的传出接口向COM公开::

[ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IHehServerEvents
    {
       string EmptyEvent(object sender, CustomEventArgs args);
    }

在PluginAPI.h中>>我有

class PluginAPI: public IHehServerEvents,public FB::JSAPIAuto//implemented the COM outgoing interface
{

//声明的基于tlh文件的EmptyEvent方法

 HRESULT __stdcall EmptyEvent(VARIANT sender,IUnknown * args, BSTR * pRetVal);
        FB_JSAPI_EVENT(CSharpEvent, 2, (FB::variant,IUnknown *));
    }
    HRESULT ClassCpluss::EmptyEvent(BSTR message, BSTR * pRetVal)
    {....}

Firebreath语句中的我的事件助手是

FB_JSAPI_EVENT(CSharpEvent, 2, (VARIANT,struct _EventArgs *));

我还看到了此链接。所以boost::vairant是支持的,对吗?那么如何将VARIANT投射到boost::VARIANT?上述声明中预计会有任何变化?如何使用VARIANT或struct在c#中处理上述事件?任何例子都会有帮助。。

否,boost::variant不受支持,FB::variation受支持--这根本不是一回事。FB::变体实际上在内部使用boost::any。

你想做的是混合COM和FireBreath,但不会有好的结果。相反,创建一个与COM内容对话的类,并从JSAPI对象中使用它。处理对象中的事件,并让它调用一个函数(看看boost::bind和boost::function),或者可能使用boost中的信号和套接字。有很多方法可以处理它,但这里的关键是,你需要首先获得知道如何与COM对话的C++对象,然后从FireBreath中使用该对象会很容易。在firebreath事件中直接使用VARIANT或任意结构类型是行不通的。