1

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

我也看到了这个链接。所以 boost::variant 支持对吗?那么如何将 VARIANT 转换为 boost::variant?上述声明中预期的任何变化?如何使用 VARIANT 或 struct 在 c# 中处理上述事件?任何示例都会有所帮助..

4

1 回答 1

1

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

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

于 2013-07-04T19:41:42.083 回答