2010-11-30 25 views
4

私はLinuxプログラマーであり、COMプログラミングには新しく、私は今修正しようとしているプログラムを継承しました。私は、次のdispinterfaceとIDLファイルを持っていると私はC + +でコールバックを設定しようとしている。私はウェブを検索していて、接続ポイントがあるものを見つけましたが、私が従うことができる簡単な例は見当たらないので、誰かが私を助けてくれるのだろうかと思っていました。Visual C++で単純なコールバック

ディスパッチ:

[ 
    helpstring("Event interface"), 
    helpcontext(0x00000006) 
] 
dispinterface _DEvents { 
    properties: 
    methods: 
     [id(0x00000001), helpstring("Occurs when about to begin."), helpcontext(0x0000000d)] 
     void Starting(); 
     [id(0x00000002), helpstring("Occurs at the beginning."), helpcontext(0x00000011)] 
     void Begin(); 
     [id(0x00000003), helpstring("Occurs at the end."), helpcontext(0x00000012)] 
     void End(); 
}; 

コクラス:

[ 
    helpstring("C Class"), 
    helpcontext(0x0000009e) 
] 
coclass C { 
    [default] interface IE; 
    [default, source] dispinterface _DEvents; 
}; 

シンクインターフェイス:

[ 
    odl 
] 
interface INotifySink : IUnknown { 
    HRESULT _stdcall Starting(); 
    HRESULT _stdcall Begin(); 
    HRESULT _stdcall End(); 
}; 

私は、これら二つの記事を見つけたが、私は頭を作ることができませんまたはそれらの尾:

私はINotifySinkを拡張する新しいクラスを作成する必要があり、かつ機能を実装していますが、その後、私は後に何をしますか想像?

おかげで、 Jayen

P.S.私がもっと情報を提供する必要があるかどうか教えてください。私はこの質問を編集します。ありがとう。

+0

http://www.codeproject.com/KB/COM/intro_connectionpoints.aspx –

+0

をご覧ください。それはあまり役に立ちません。 1)私はすでにコクラスを持っています(私は今質問に追加しました)。 2)VS2008が私に 'Implementing Connection Point ...'オプションを表示していない – Jayen

+0

コクラスを実装するために何を使用していますか? MFC? ATL? MFCとATLにはIConnectionPointContainerとIConnectionPointの実装を行うための機能があります。 –

答えて

1

現存するコクラスの出来事をどのように消費するか尋ねていますか?これを行うには、新しいインターフェイスではなく、_DEventsインターフェイスを実装するオブジェクトを作成する必要があります。以下のような

何か:意味をなさない

class EventSink : public _DEvents 
{ 
    AddRef() { ... } 
    Release() { ... } 
    QueryInterface(...) { ... } 
    Starting() { printf("Starting happend\n"); } 
    Begin() { ... } 
    End() { ... } 
} 
EventSink *es = new EventSink; 
IE *objectOfInterest = ...; 
IConnectionPointContainer *cpc; 
objectOfInterest->QueryInterface(&cpc); 
IConnectionPoint *cp; 
cpc->FindConnectionPoint(__uuidof(_DEvents), &cp); 
cp->Advise(es, &cookie); 
objectOfInterest->somethingthatfiresanevent(); 

していますか?

+0

はい、それは理にかなっています。私はそれを試し、あなたに知らせるでしょう。 AddRef、Release、QueryInterfaceをオーバーライドする必要がありますか?今では、サードパーティ製ソフトウェアのINotifySinkインターフェイスがどのような目的で役に立つのだろう... – Jayen

+0

何とか実装する必要があります(純粋な仮想です)。 –

関連する問題