[英]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.