C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: イベント取得


(過去ログ 54 を表示中)

[トピック内 20 記事 (1 - 20 表示)]  << 0 >>

■29845 / inTopicNo.1)  イベント取得
  
□投稿者/ ロック (149回)-(2008/12/15(Mon) 18:46:06)

分類:[VB.NET/VB2005 以降] 

VB.NET2005のコンソールアプリで、参照しているDLLがRaiseするイベント(引数あり)取得をしたいのですが、どうすれば良いのでしょうか?

イベントは複数種類あります。

お助け下さい。

Win32ライブラリをリンクしたりするのでしょうか?
引用返信 編集キー/
■29847 / inTopicNo.2)  Re[1]: イベント取得
□投稿者/ やじゅ (864回)-(2008/12/15(Mon) 19:21:46)
やじゅ さんの Web サイト
>■No29845 (ロック さん) に返信

いまいち見えてこないんですけど、WithEventsとかは使えないんですか?
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard49.htm
引用返信 編集キー/
■29960 / inTopicNo.3)  Re[2]: イベント取得
□投稿者/ ソル (10回)-(2008/12/17(Wed) 01:28:40)
No29847 (やじゅ さん) に返信
> >■No29845 (ロック さん) に返信
>
> いまいち見えてこないんですけど、WithEventsとかは使えないんですか?
> http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard49.htm


Consoleアプリなので

while(1)

終了処理に入るまで
ここで複数種類ある(DLLからRaiseEventされた)イベントをハンドルし続ける

loop

ような形を考えているのですが、方向性が違うのですかね?



Formアプリだと

Sub Fnc1() Handles xxx.yy

End Sub

Sub Fnc2() Handles yyy.zz

End Sub

などで既に取得できているので何とかConsoleでも同様の事を実現したいです。

引用返信 編集キー/
■29963 / inTopicNo.4)  Re[3]: イベント取得
□投稿者/ Jitta on the way (249回)-(2008/12/17(Wed) 07:28:33)
No29960 (ソル さん) に返信
> ■No29847 (やじゅ さん) に返信
>>>■No29845 (ロック さん) に返信
>>
>>いまいち見えてこないんですけど、WithEventsとかは使えないんですか?
>>http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard49.htm
>
>
> Consoleアプリなので
>
> while(1)
>
> 終了処理に入るまで
> ここで複数種類ある(DLLからRaiseEventされた)イベントをハンドルし続ける
>
> loop
>
> ような形を考えているのですが、方向性が違うのですかね?
>
>
>
> Formアプリだと
>
> Sub Fnc1() Handles xxx.yy
>
> End Sub
>
> Sub Fnc2() Handles yyy.zz
>
> End Sub
>
> などで既に取得できているので何とかConsoleでも同様の事を実現したいです。
>

while 文の中には sleep
ハンドラーは、form と同じ…addhandler の方がいいかも
引用返信 編集キー/
■29965 / inTopicNo.5)  Re[4]: イベント取得
□投稿者/ たくボン (105回)-(2008/12/17(Wed) 09:33:21)
2008/12/17(Wed) 09:33:33 編集(投稿者)
No29963 (Jitta on the way さん) に返信
> ■No29960 (ソル さん) に返信
>>■No29847 (やじゅ さん) に返信
> >>>■No29845 (ロック さん) に返信
> >>
> >>いまいち見えてこないんですけど、WithEventsとかは使えないんですか?
> >>http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard49.htm
>>
>>
>>Consoleアプリなので
>>
>>while(1)
>>
>>終了処理に入るまで
>>ここで複数種類ある(DLLからRaiseEventされた)イベントをハンドルし続ける
>>
>>loop
>>
>>ような形を考えているのですが、方向性が違うのですかね?
>>

やじゅさんが言ってるようにこんな感じじゃだめなのかな?
イベント発火側のDLLがこんな感じだったら

'HogeClass.vb(RaiseEventDLL.proj)
Public Class HogeClass
    Public Event HogeEvent()

    Public Sub Hoge()
        RaiseEvent HogeEvent()
    End Sub
End Class


呼び出し側のコンソールアプリでは、

'MainModuke.vb(ConsoleApp01.proj)
Imports RaiseEventDLL

Module MainModule
    Private WithEvents _hoge As New HogeClass

    Sub Main()
        _hoge.Hoge()
    End Sub

    Private Sub _hoge_HogeEvent() Handles _hoge.HogeEvent
        Debug.WriteLine("hogeeeeeee")
    End Sub
End Module

こんな感じ。
イベントの発火側には、ちゃんと発火処理やOnXXXも書いてないからいいサンプルではないけどm(..)m


引用返信 編集キー/
■29971 / inTopicNo.6)  Re[5]: イベント取得
□投稿者/ ロック (151回)-(2008/12/17(Wed) 11:27:45)
No29965 (たくボン さん) に返信
> 2008/12/17(Wed) 09:33:33 編集(投稿者)
>

たくボンさんありがとうございます。

>Module MainModule
> Private WithEvents _hoge As New HogeClass
>
> Sub Main()
> _hoge.Hoge()
> End Sub
>
> Private Sub _hoge_HogeEvent() Handles _hoge.HogeEvent
> Debug.WriteLine("hogeeeeeee")
> End Sub
>End Module

この場合、

> Sub Main()
> _hoge.Hoge()
> End Sub

を使用せず、HogeClassで不定期的で複数回RaiseEventした場合、その全てをModule MainModuleで取得したいです。
その為にModele内でwhile(1)を考えております。

ご提示内容で複数回かつ複数種類のイベントを取得するにはどうすれば良いでしょうか?

引用返信 編集キー/
■29978 / inTopicNo.7)  Re[6]: イベント取得
□投稿者/ たくボン (106回)-(2008/12/17(Wed) 12:18:37)
No29971 (ロック さん) に返信
> ■No29965 (たくボン さん) に返信
> ご提示内容で複数回かつ複数種類のイベントを取得するにはどうすれば良いでしょうか?

 うーん、いまいちwhileする意味がわからないけど、さっきのサンプルでも
「複数定義されているイベント」を「複数回呼び出す」事はできると思うの
ですが?


'HogeClass.vb(RaiseEventDLL.proj)
Public Class HogeClass
    Public Event HogeEvent()
    Public Event MogeEvent()

    Public Sub Hoge()
        RaiseEvent HogeEvent()
        RaiseEvent MogeEvent()
        RaiseEvent HogeEvent()
    End Sub
End Class


'MainModuke.vb(ConsoleApp01.proj)
Imports RaiseEventDLL

Module MainModule
    Private WithEvents _hoge As New HogeClass

    Sub Main()
        _hoge.Hoge()
    End Sub

    Private Sub Hoge_HogeEvent() Handles _hoge.HogeEvent
        Console.WriteLine("hogeeeeeee")
    End Sub

    Private Sub Hoge_MogeEvent() Handles _hoge.MogeEvent
        Console.WriteLine("moge???")
    End Sub
End Module


> Sub Main()
> _hoge.Hoge()
> End Sub

を使ってるのは、発火のタイミングがわからないので明示的に書いている
だけなんですけど、使えない理由があれば教えてください。


引用返信 編集キー/
■29984 / inTopicNo.8)  Re[1]: イベント取得
□投稿者/ 渋木宏明(ひどり) (983回)-(2008/12/17(Wed) 12:52:03)
渋木宏明(ひどり) さんの Web サイト
> VB.NET2005のコンソールアプリで、参照しているDLLがRaiseするイベント(引数あり)取得をしたいのですが、どうすれば良いのでしょうか?

DLL はイベントを投げたりしません。

DLL=(.NET の)クラスライブラリですか? あるいはまた別なものでしょうか?

DLL=(.NET の)クラスライブラリだとして、「何の」イベントを処理したいんでしょうか?

単なるクラスですか? それともコンポーネント?

コンソールアプリケーションで Windows.Forms 系のコントロールやコンポーネントを使いたい、ということだと、そもそも正常な動作を期待できないものも多いんですが、そういう話でしょうか?

引用返信 編集キー/
■29990 / inTopicNo.9)  Re[2]: イベント取得
□投稿者/ たくボン (107回)-(2008/12/17(Wed) 12:59:52)
No29984 (渋木宏明(ひどり) さん) に返信
>>VB.NET2005のコンソールアプリで、参照しているDLLがRaiseするイベント(引数あり)取得をしたいのですが、どうすれば良いのでしょうか?
> DLL=(.NET の)クラスライブラリですか? あるいはまた別なものでしょうか?
そもそも2005のコンソールアプリって書いてたので、俺はてっきりこれだと思ってました。
単純に関数みたいな感じでDLL側から呼び出したいだけだと(笑)違うのかな?
引用返信 編集キー/
■29995 / inTopicNo.10)  Re[7]: イベント取得
□投稿者/ 渋木宏明(ひどり) (984回)-(2008/12/17(Wed) 13:12:02)
渋木宏明(ひどり) さんの Web サイト
> うーん、いまいちwhileする意味がわからないけど、さっきのサンプルでも
> 「複数定義されているイベント」を「複数回呼び出す」事はできると思うの
> ですが?

コンソールアプリはメッセージポンプを持ってないから、その代わりのつもりなんじゃないかな?

ただ、そうであったとしても、DLL とやらがワーカースレッドで駆動されているんでもいない限り、いつまで待ってもイベントなんかやってこないと思うけど。

引用返信 編集キー/
■30002 / inTopicNo.11)  Re[3]: イベント取得
□投稿者/ ロック (152回)-(2008/12/17(Wed) 13:28:52)
No29990 (たくボン さん) に返信
混乱させてすみません。

DLLはActiveX DLLでVB6で作成しています。用途は外部端末からの通信待ちうけで、外部から電文を受信したら、.NETアプリに対しRaiseEventして通知しています。

現在は.NETアプリはFormなのでイベントが起きる度に各Subで処理をしています。

Consoleアプリでも同様にMainを終了させずにイベント待ち状態にしたいと考えております。
引用返信 編集キー/
■30003 / inTopicNo.12)  Re[3]: イベント取得
□投稿者/ 渋木宏明(ひどり) (985回)-(2008/12/17(Wed) 13:29:09)
渋木宏明(ひどり) さんの Web サイト
> 単純に関数みたいな感じでDLL側から呼び出したいだけだと(笑)違うのかな?

なら、別にイベントがベストの解てわけじゃないし…

単なる待ちうけなら、それこそ AutoResetEvent みたいな同期オブジェクト使った方が話早いし。

個人的には

> コンソールアプリケーションで Windows.Forms 系のコントロールやコンポーネントを使いたい

のセンかな、と推測してます。

引用返信 編集キー/
■30018 / inTopicNo.13)  Re[4]: イベント取得
□投稿者/ 渋木宏明(ひどり) (986回)-(2008/12/17(Wed) 14:58:38)
渋木宏明(ひどり) さんの Web サイト
> DLLはActiveX DLLでVB6で作成しています。用途は外部端末からの通信待ちうけで、外部から電文を受信したら、.NETアプリに対しRaiseEventして通知しています。

「ActiveX コントロール」ではなく、ActiveX DLL なんですね?

てことは、ActiveX DLL 側で、ワーカースレッドを起してるってことですか?

であれば、ActiveX DLL が公開するイベントにイベントハンドラを関連付けてやった上で、Main で単純ループさせていれば、イベントハンドラは呼び出されるはずです。
(ただし、スレッドコンテキストは ActiveX DLL 側のものになるはず)

ただ、それでも ActiveX DLL 側の作りこみ次第でうまくいかない場合もあり得るし、イベントハンドラがワーカースレッドのコンテキストで呼び出されるとまずいような場合、対処はめんどくさいです。
引用返信 編集キー/
■30027 / inTopicNo.14)  Re[5]: イベント取得
□投稿者/ たくボン (111回)-(2008/12/17(Wed) 15:28:40)
No30018 (渋木宏明(ひどり) さん) に返信
>>DLLはActiveX DLLでVB6で作成しています。用途は外部端末からの通信待ちうけで、外部から電文を受信したら、.NETアプリに対しRaiseEventして通知しています。

通信系のポーリングなら、共有メモリとかにキューとかリングバッファ用意してお互いに監視ってのもあると思うけど、ActiveXDLLの方は変更できないんですよね?
引用返信 編集キー/
■30034 / inTopicNo.15)  Re[5]: イベント取得
□投稿者/ ロック (153回)-(2008/12/17(Wed) 15:53:54)
No30027 (たくボン さん) に返信
> >>DLLはActiveX DLLでVB6で作成しています。用途は外部端末からの通信待ちうけで、外部から電文を受信したら、.NETアプリに対しRaiseEventして通知しています。
>
> 通信系のポーリングなら、共有メモリとかにキューとかリングバッファ用意してお互いに監視ってのもあると思うけど、>ActiveXDLLの方は変更できないんですよね?


ActiveX DLLの変更はしない方向で考えております。現状DLLでRaiseしたEventハンドラを監視・取得する方法が分からず停滞しております。



No30018 (渋木宏明(ひどり) さん) に返信
>>DLLはActiveX DLLでVB6で作成しています。用途は外部端末からの通信待ちうけで、外部から電文を受信したら、.NETアプリに対しRaiseEventして通知しています。
>
> 「ActiveX コントロール」ではなく、ActiveX DLL なんですね?

はい、ActiveX DLLです。


> てことは、ActiveX DLL 側で、ワーカースレッドを起してるってことですか?

ワーカスレッドのことをあまり分かっておりません。


> であれば、ActiveX DLL が公開するイベントにイベントハンドラを関連付けてやった上で、Main で単純ループさせていれば、イベントハンドラは呼び出されるはずです。
> (ただし、スレッドコンテキストは ActiveX DLL 側のものになるはず)

現在Sub Mainで単純ループしており、Module内の別Sub a() Handles _hoge.HogeEventを作っていますが、単純ループ内ですべき処理が不明な為、ループ中にDLLからRaiseEventしても反応無しです。ループの中でイベントを監視するAPIを利用するのでしょうか?


引用返信 編集キー/
■30040 / inTopicNo.16)  Re[6]: イベント取得
□投稿者/ 渋木宏明(ひどり) (987回)-(2008/12/17(Wed) 16:29:06)
渋木宏明(ひどり) さんの Web サイト
>>てことは、ActiveX DLL 側で、ワーカースレッドを起してるってことですか?
>
> ワーカスレッドのことをあまり分かっておりません。

ActiveX DLL の作成者に確認してください。非常に重要なことです。

> 現在Sub Mainで単純ループしており、Module内の別Sub a() Handles _hoge.HogeEventを作っていますが

VB 固有のことには首をつっこみたくないので、イベント接続についてはほかの人のコメントを参照してください。

重要なのは、そのイベントハンドラが「本当にイベントに接続されいているのか?」という点です。

> 単純ループ内ですべき処理が不明な為、ループ中にDLLからRaiseEventしても反応無しです。

とすると、やっぱりメッセージポンプ回してやらないとダメなのかな?

理由は様々考えられます。

この場合は ActiveX DLL の作りこみが、今やろうとしている使い方にマッチしていないから、ぽいですね。



引用返信 編集キー/
■30045 / inTopicNo.17)  Re[6]: イベント取得
□投稿者/ やじゅ (869回)-(2008/12/17(Wed) 16:40:22)
やじゅ さんの Web サイト
2008/12/17(Wed) 17:16:30 編集(投稿者)
No30034 (ロック さん) に返信

追記:
>現在は.NETアプリはFormなのでイベントが起きる度に各Subで処理をしています。
Form側で出来ているなら、下記は無意味だったかも・・・、一応残しておきます。

ActiveX Dll側のイベントとWindowsメッセージ処理の関係がいまいちよく分からんねー。


Visal Basic .NETのコンソールアプリケーションでイベントを受信するサンプルを示します。 
http://www.b21soft.co.jp/bfup/bfupp-user.html#2003.net

上記サイトを参考にした場合、こんなイメージだと思う

Sub Main()
    Dim hoge As New ActiveXHoge.hoge  ' ActiveX DLLインスタンス作成

    Dim onCompleteEvent_handler1 As ActiveXHoge.OnCompleteEventHandler
    onCompleteEvent_handler = AddressOf OnComplete  ' イベント設定
    AddHandler hoge.OnComplete, onCompleteEvent_handler 

    Dim onStopEvent_handler As ActiveXHoge.OnStopEventHandler
    onStopEvent_handler = AddressOf OnStop  ' イベント設定
    AddHandler hoge.OnStop, onStopEvent_handler 

    While(1)
     hoge.Hoge()
    Loop

    Return
End Sub

Sub OnComplete(ByVal xxx As String)   ' OnCompleteEventイベントルーチン
    Console.WriteLine("Complete " + xxx)
End Sub

Sub OnStop(ByVal xxx As String,ByVal yyy As String)   ' OnStopEventイベントルーチン
    Console.WriteLine("Stop " + xxx + yyy)
End Sub

End Module

引用返信 編集キー/
■30066 / inTopicNo.18)  Re[7]: イベント取得
□投稿者/ 渋木宏明(ひどり) (988回)-(2008/12/17(Wed) 17:36:57)
渋木宏明(ひどり) さんの Web サイト
> ActiveX Dll側のイベントとWindowsメッセージ処理の関係がいまいちよく分からんねー。

LPC の根本は Windows メッセージなので、関係はあります。

引用返信 編集キー/
■30073 / inTopicNo.19)  Re[8]: イベント取得
□投稿者/ やじゅ (871回)-(2008/12/17(Wed) 18:19:14)
やじゅ さんの Web サイト
> LPC の根本は Windows メッセージなので、関係はあります。
ありがとうございます。一応、関係はするんですね。

Form側で出来ているってことなので、もしかしたら・・・

コンソール アプリケーションでメッセージを処理する、読み辛い;;
http://msdn.microsoft.com/ja-jp/magazine/cc163417.aspx
引用返信 編集キー/
■30089 / inTopicNo.20)  Re[4]: イベント取得
 
□投稿者/ Jitta on the way (250回)-(2008/12/18(Thu) 07:51:59)
No29963 (Jitta on the way さん) に返信
もっかい書いたろ


> while 文の中には sleep
> ハンドラーは、form と同じ…addhandler の方がいいかも

AddHandler の方がいいみたいね。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -