繁体   English   中英

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

[英]Custom Event Handling in COM c++

我有一个带有事件签名的ac#.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 *));

我也看到了这个链接 SO boost :: vairant是否受支持,然后如何将VARIANT强制转换为boost :: variant? 上述声明中有什么变化? 如何通过使用VARIANT或struct在c#中处理上述事件?任何示例都将有所帮助。

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

您正在尝试将COM和FireBreath混合使用,但效果不会很好。 而是创建一个与您的COM对话的类,并从JSAPI对象中使用它。 处理对象中的事件并将其称为函子(查看boost :: bind和boost :: function),或者使用boost中的信号和套接字。 有很多方法可以处理它,但是这里的关键是您需要首先获取知道如何与COM通讯的C ++对象,然后从FireBreath使用该对象将很容易。 直接将VARIANT或任意struct类型与firebreath事件一起使用将永远无法工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM