私は.NETのライブラリを持っています。これは、非同期操作を含むCOM相互運用性のために公開する必要があります。したがって、私はイベントを実装する必要があります。C++の.NETイベントを実装する最も簡単な方法
[ComVisible(true)]
[Guid("...")]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(IClass1Event))]
public class Class1: IClass1
{
public delegate Int32 IntIntFunc(Int32 arg);
public event IntIntFunc Event;
public Int32 RaiseEvent(Int32 param)
{...}
}
[ComVisible(true)]
[Guid("...")]
public interface IClass1
{
Int32 RaiseEvent(Int32 param);
}
[ComVisible(true)]
[Guid("...")]
public interface IClass1Event
{
Int32 Event(Int32 param);
}
しかし、私はC++イベントシンクの実装に問題があります。 私は様々な例を用意していますIConnectionPoint::Advise
から単なる "VBを使う"までの範囲ですが、それらを実装しようとするあらゆる種類の問題を抱えています(VBでは使用できません) - ATLが私にはAddRef
、または私は心配してVTablesを理解できません(私は非常に基本的にCフレームワークに精通しています、残念ながら)。 私はどのフレームワークが望ましいかについての情報がなく、そのクライアントだけがC++です。
私の質問は、.NETイベントをC++に公開するための最善の方法とは何なのでしょうか。その結果、テストシンクを実装する最も簡単な方法は何ですか?
P .:実際にはIDispatchにするにはイベントインターフェイスが必要ですか?
あなたが唯一のC++であなたのCOMオブジェクトを使用する場合は、あなたがJavaScriptや他のスクリプト言語から同じオブジェクトを使用して起動した場合しかし、あなたが、あなたのイベントのインタフェース 'IDispatch'を行う必要はありません。 – Justin
イベントハンドラのための多くのC++実装がありますが、私はboost.signals2をお勧めします(用語は異なりますが、何が何であるかを説明するのは非常に良いです、http://www.boost.org/doc/ libs/1_48_0/doc/html/signals2.html) –