我有一个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或任意结构类型是行不通的。