2013-07-04 130 views
1

我使用的輸出接口這樣的:自定義事件處理在COM C++

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

在PluginAPI.h >> 我有

具有暴露COM事件簽名C#.NET類
class PluginAPI: public IHehServerEvents,public FB::JSAPIAuto//implemented the COM outgoing interface 
{ 

//宣佈基於TLH文件

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

    } 
    HRESULT ClassCpluss::EmptyEvent(BSTR message, BSTR * pRetVal) 
    {....} 

我的事件^ h EmptyEvent方法在Firebreath聲明中的elper是

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

我也看到了THIS link。 SO boost :: vairant是否支持右鍵?那麼如何將VARIANT轉換爲boost :: variant? 以上聲明中預期的任何更改? 如何在c#中使用VARIANT或結構來處理上述事件?任何示例都會有幫助..

回答

1

不,boost :: variant不受支持,FB :: variant受支持 - 它不相同一切都是如此。 FB :: variant實際上是在內部使用boost :: any。

你想要做的是混合COM和FireBreath,它不會有一個好的結果。相反,創建一個與您的COM對象交談並使用您的JSAPI對象的類。在你的對象中處理這個事件並讓它調用一個函子(看看boost :: bind和boost :: function),或者使用來自boost的信號和套接字。有很多方法可以處理它,但關鍵在於您需要先獲得知道如何與COM交談的C++對象,然後使用FireBreath中的對象將變得很容易。直接使用帶有firebreath事件的VARIANT或任意結構類型將無法工作。

+0

當然知道boost :: function和boost :: bind.But你可以給我們一個鏈接/提供一個例子(在C++中處理COM事件),以及你在說什麼這個語句「讓它調用一個仿函數(看看boost :: bind和boost :: function)「 –

+0

我還沒有做過任何處理C++中的COM事件。要查看使用仿函數的示例,請查看FireBreath代碼庫中的SimpleStreamsHelper類 - 它使用boost :: function回調函數。要查看它的使用情況,請查看它使用SimpleStreamsHelper的FBTestPlugin。 – taxilian