1

次のような発信インターフェイスを使用して COM に公開されるイベント署名を持つ ac#.NET クラスがあります::

[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# で上記のイベントを処理する方法は?

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 に答える