掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Activex DLLのイベントを拾うには? (ID:61340)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> evtSampleはεπιστημηさんのサイトの例で言うどれにあたるのでしょうか? 太字で強調表示されているFire_changedがVB側(正確にはCOMサーバー側) のRaiseEventに相当します。 ここでInvokeされたイベントがCOMのRPC機構を通して Client側のイベントハンドラクラスに通知されることになります。 > ICounterは、今回のSampleX.Dllだと何にあたるのでしょうか? _clsSampleですね。 イベントハンドリング用のクラスは別にあるように思えます。 oleviewなどで探してみてください。 > evtSampleイベントが発生するとこの関数が よばれません。 それはRPCでCOMサーバーに対してメソッド呼び出しを行うためのコードです。 通常、 1.何らかのメソッドを呼び出す(Client->Server) 2.サーバー内部処理(Server->Server) 3.変更通知イベントハンドラーが接続していたらそいつに対してInvoke(Server->Client) 4.変更通知イベントを受け取って何か処理をする(Client->Client) となります。 επιστημηさんのサイトで紹介しているケースでは ICounterはCOMサーバー(Server側) CounterEventsはイベント受信クラス(Client側) となります。 > SampleX.dll内のイベントの取得法 ですが、IConnectionPointContainerとIConnectionPointを用います。 具体的には、 IConnectionPointContainer* pContainer = NULL; HRESULT hr = comWrapper.m_lpDispatch->QueryInterface(uuid, &pContainer); if(SUCCEEDED(hr)) { IConnectionPoint* pPoint = NULL; hr = pContainer->FindConnectionPoint(イベントクラスのID, &pPoint); if(SUCCEEDED(hr)) { // イベントハンドリングクラスを生成する myEventHandler = new MyEventHandler(); LPUNKNOWN pUnknwon = eventHandler->GetInterface(&IID_IUnknown); if(NULL != pUnknown) { hr = pPoint->Advise(pUnknown, &cookie); } } } といった風になります。 このコードでは後始末をなにもやってないので その辺は適宜補ってください。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.