- PR -

COMサーバのイベントを補足する方法について

1
投稿者投稿内容
roku
会議室デビュー日: 2007/03/16
投稿数: 9
投稿日時: 2007-08-09 15:43
VB.NET(2005)でCOMサーバのイベントを拾いたくて
http://support.microsoft.com/kb/810228/ja
の「クラシックCOM接続ポイントモデル」を参考にプログラムを作成したのですがイベントを拾ってくれません。同じCOMサーバをVC++では拾えているのですが...

【手順】
(1)プロジェクトの参照でCOMサーバを指定する。
(2)シンククラスを作成する。
Public Class LogonEvnets
Implements _ILogonEvents
Public Delegate Sub LoginEventHandler(ByVal currLogin As Short)
Public Delegate Sub LogoutEventHandler(ByVal currLogin As Short)
Public Event Login As LoginEventHandler
Public Event Logout As LogoutEventHandler

Public Sub OnLogin(ByVal currLogin As Short) _
Implements _ILogonEvents.OnLogin
RaiseEvent Login(currLogin)
End Sub

Public Sub OnLogout(ByVal currLogin As Short) _
Implements _ILogonEvents.OnLogout
RaiseEvent Logout(currLogin)
End Sub
End Class
(3)Formのnewメソッド内でCOMイベントシンクを確立する
'COMサーバオブジェクト生成
objLogin_ = New Logon()
'COMサーバのキャスト
Dim icpc As IConnectionPointContainer = _
CType(objLogin_, ComTypes.IConnectionPointContainer)
'イベントインタフェースのGUID取得
Dim DIID__ILogonEvents As Guid = GetType(_ILogonEvents).GUID
'接続ポイントの取得(DIM icp_ as IConnectionPoint)
icpc.FindConnectionPoint(DIID__ILogonEvents, icp_)
'シンクはWithEventsで宣言しています。
ev_ = New LogonEvnets()
'接続確立
icp_.Advise(ev_, cookie_)
(4)Formを実行する。
(5)COMサーバのログイン画面でログインする。
(; イベントを拾ってくれない。




[ メッセージ編集済み 編集者: roku 編集日時 2007-08-09 16:14 ]
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-08-09 17:31
こんにちは。

引用:

rokuさんの書き込み (2007-08-09 15:43) より:
VB.NET(2005)でCOMサーバのイベントを拾いたくて
http://support.microsoft.com/kb/810228/ja
の「クラシックCOM接続ポイントモデル」を参考にプログラムを作成したのですがイベントを拾ってくれません。同じCOMサーバをVC++では拾えているのですが...



イベント接続の処理中に例外/エラーメッセージは出ていないのですか?

参考ページの「Microsoft.NET デリゲート イベント モデル」のほうでは、イベントは拾えているのですか?
こっちのモデルのほうがVBらしくて手間がいらないと思いますが。
roku
会議室デビュー日: 2007/03/16
投稿数: 9
投稿日時: 2007-08-09 17:41
こんにちは。Tdnr_Symさん。

引用:

イベント接続の処理中に例外/エラーメッセージは出ていないのですか?

参考ページの「Microsoft.NET デリゲート イベント モデル」のほうでは、イベントは拾えているのですか?
こっちのモデルのほうがVBらしくて手間がいらないと思いますが。




イベント接続は例外が発生しませんでしたのでできていると思います。
またCOMサーバオブジェクトに対するメソッド呼び出し(GetUserIDなど)もできています。

もちろん真っ先に「Microsoft.NET デリゲート イベント モデル」も試してみたのですが、ログインしてもイベントハンドリングされませんでした。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-08-09 19:03
こんばんは。

引用:

rokuさんの書き込み (2007-08-09 17:41) より:
イベント接続は例外が発生しませんでしたのでできていると思います。


icpc.FindConnectionPoint(DIID__ILogonEvents, icp_)
の実行結果でちゃんとConnectionPointが取得できて(icp_がNothing以外)

icp_.Advise(ev_, cookie_)
で、cookie_にちゃんと何らかの値がセットされるということですね。

引用:

もちろん真っ先に「Microsoft.NET デリゲート イベント モデル」も試してみたのですが、ログインしてもイベントハンドリングされませんでした。


私もちょうど、VB6で作ったCOMサーバー(ActiveX EXE)があったので試してみましたが、
「クラシック COM 接続 ポイント モデル」と「Microsoft.NET デリゲート イベント モデル」の両方で
イベントを拾えましたけれども。
roku
会議室デビュー日: 2007/03/16
投稿数: 9
投稿日時: 2007-08-09 19:41
こんばんわ。Tdnr_Symさん。

icp_.Advise(ev_, cookie_)
で、cookie_にはちゃんと正数が入っておりました。

COMサーバ(他社製)が怪しいような気になりました。
うまくいっているサンプルのVC++を眺めながら
別の方法を検討したいと思います。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)