- 締切済み
vb6.0でプログラム間のイベント受送信処理
初めまして、VB6.0プログラミング初心者です。 CreateEvent、SetEventを利用して、プログラム間でのイベント受送信処理をしようとしています。 また、受ける側でTimer関数を利用してイベントを監視し、イベントを受け取った際にMSG表示するようにもしたいのです。 いろいろ調べて、ActiveDLLを使用してみたりしたのですが、うまくいきませんし、 API関数の定数やどうやってプログラム間でイベントを受送信するのかがわかりませんでした。 ご教授よろしくお願いいたします。
- みんなの回答 (10)
- 専門家の回答
みんなの回答
- kumatti1
- ベストアンサー率60% (73/121)
旧VBはもう十数年前の言語で、こちらも動作確認出来る環境がありませんので、 想像と微かな記憶に頼っています。^^; > hEvent = OpenEvent(EVENT_ALL_ACCESS, 0, "Width") 'やはりEmpty値が返る 宣言が例によってありませんので、なぜ0でなくてEmptyなのか分かりません。 先に書いた > (どの様なエラー内容なのか)Err.LastDLLError をFormatMessage で調べるとか。 で確認されて後はご自身で頑張られてください。 では。
- kumatti1
- ベストアンサー率60% (73/121)
- kumatti1
- ベストアンサー率60% (73/121)
失礼、読み間違えてました。EVENT_ALL_ACCESS は定数です。 MSDNを見る習慣は付けた方が良いと思いますよ。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms682396%28v=vs.85%29.aspx # Long型はEmptyにはならないですね。Variant型ならなります。
- kumatti1
- ベストアンサー率60% (73/121)
# APIの宣言がありませんが。 戻り値のイベントのハンドルで0を返されると言うことですか? (どの様なエラー内容なのか)Err.LastDLLError をFormatMessage で調べるとか。 気休めですがANSI版でなくてUnicode版のAPIを使うとか。
- kumatti1
- ベストアンサー率60% (73/121)
> セットプロパティで、Windows内の.text等を開くっていうことですか? hEvent = CreateEvent(0, 1, 0, vbNullString) (名前付きイベントオブジェクトでなくて) 無名イベントオブジェクトをお望みならイベントのハンドルを ウィンドウプロパティに設定すれば別プロセスから取得するのが簡単かなと思っただけです。 # 何がどう上手く行かないのかこちらには一向に伝わってないのですが?
補足
伝え方が曖昧ですいません。 今現在、イベントを受け取るプログラム側で うまくOPENEVENTでhEventにイベントハンドルが返らない状況です。 イベント発生側(Formコード) Dim hEvent As Long Public Sub Command1_Click() hEvent = CreateEvent(0, 1, 0, "Width") Do While MsgWaitForMultipleObjects(1, hEvent, 0, INFINITE, QS_ALLINPUT) = WAIT_OBJECT_0 + 1 DoEvents Loop MsgBox "nuketa" CloseHandle hEvent End Sub イベント受け取る側(Formコード) Option Explicit Public Sub Command1_Click() Dim EVENT_ALL_ACCESS As Long Dim hEvent As Long hEvent = OpenEvent(EVENT_ALL_ACCESS, 0, "Width") 'ここがうまくいかない SetEvent hEvent CloseHandle hEvent End Sub イベントハンドルを受け取る側の、 EVENT_ALL_ACCESSがEMPTY値 、hEVENTへの戻り値が0になってしまいます。 クラスオブジェクトにイベントを作成してみて、設定してみたり したのですがうまくいきませんでした。 両方のプログラムは標準EXEプロジェクトで 作成しているのですが そのことが、原因なのでしょうか? イベントを受け取る側のプログラムを ActiveXDLLやActiveXEXEにかえてみても うまくイベントを開いてくれませんでした。 何が原因かよくわからなくて困っております。 なにとぞよろしくお願いします
- kumatti1
- ベストアンサー率60% (73/121)
おっと書き忘れてた! SetProp 等を使ってイベントのハンドルって意味です。
補足
返信が遅くなってすいません。 セットプロパティで、Windows内の.text等を開くっていうことですか? 無知な質問で、本当に申し訳ないのですが ご教授よろしくお願いします。
- kumatti1
- ベストアンサー率60% (73/121)
example 以外の名前にするとか無名オブジェクトなら (プロセス間なので)ウィンドウプロパティにでも設定・保持するとか。
- kumatti1
- ベストアンサー率60% (73/121)
第一引数が構造体になってるからでは。 Long型にしては。
補足
Long型にしてもダメでした。 hEvent = CreateEvent(0, 1, 0, "example") のexampleとはイベントオブジェクトの名前とわかったのですが、実際にexampleで何らかの動作を起こすよう自分でプログラムを作らないといけないのでしょうか?
- kumatti1
- ベストアンサー率60% (73/121)
こんな感じ。 Dim hEvent As Long hEvent = OpenEvent(EVENT_ALL_ACCESS, 0, "example") SetEvent hEvent CloseHandle hEvent --- Dim hEvent As Long hEvent = CreateEvent(0, 1, 0, "example") Do While MsgWaitForMultipleObjects(1, hEvent, 0, INFINITE, QS_ALLINPUT) = WAIT_OBJECT_0 + 1 DoEvents Loop CloseHandle hEvent
補足
コードを入力していただきありがとうございます。 これを、参考に勉強していきます。 ただ、使用しているAPI関数をモジュールに入力し 実行してみると、 hEvent = CreateEvent(0, 1, 0, "example") ここの部分で、”型が一致しません”とエラー表示が 出ます。 宣言文等いじってみましたが、変化なしでした。 何が原因か教えていただきたいです。 よろしくお願いいたします。
- kumatti1
- ベストアンサー率60% (73/121)
> ActiveDLL ActiveX DLLかな。 > 受ける側でTimer関数を利用してイベントを監視し 待機関数の事なら WaitForSingleObject / WaitForMultipleObjects 辺りを使うのではないかと。
補足
ご返信ありがとうございます。 WaitForMultipleObject関数とか使用する関数はなんとなくわかるのですが、イベント作成の仕方やプログラム間での受け渡しかたが、いまいちうまくいきません。 イベント作成側 Public Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" (lpEventAttributes As SECURITY_ATTRIBUTES, ByVal bManualReset As Long, ByVal bInitialState As Long, ByVal lpName As String) As Long Public Declare Function SetEvent Lib "kernel32" (ByVal hEvent As Long) As Long イベント受け取る側 Dim hEvent As Long Private Sub Form_Load() hEvent = CreateEvent(Null,True,True,Null) End Sub Private Sub Command1_Click() Dim i As Long ResetEvent hEvent Do i = MsgWaitForMultipleObjects これ以降、どうしたらいいのか調べてみてもあまりわかりません。 どうかご助言お願いいたします。
補足
MSDN等のVB関連はよく見ているのですが、いまいちわからない状況です、、、 プログラム間のアクセスは、標準EXEどうしのプログラム間でも可能なのでしょうか? 待機関数を抜けた後のMSGを最終的に表示させたいのですが、 やはり、ActiveX DLLでイベントを受ける側のプログラムを書く必要があるのですか? イベント発生側(Formコード) Dim hEvent As Long Public Sub Command1_Click() hEvent = CreateEvent(0, 1, 0, "Width") Do While MsgWaitForMultipleObjects(1, hEvent, 0, INFINITE, QS_ALLINPUT) = WAIT_OBJECT_0 + 1 DoEvents Loop MsgBox "nuketa" CloseHandle hEvent End Sub イベント受け取る側(Formコード) Public Sub Command1_Click() Dim hEvent As Long hEvent = OpenEvent(EVENT_ALL_ACCESS, 0, "Width") 'やはりEmpty値が返る SetEvent hEvent CloseHandle hEvent End Sub