メッセンジャサービスの受信時に処理を起動したい

解決


ハナクソース  2004-04-14 11:48:15  No: 112812  IP: [192.*.*.*]

こんにちは。VB6で開発を行っているのですが…

NETコマンドで NET SEND ユーザ名  メッセージ と入力すると
ネットワークにつながっているPCにメッセージを送れますよね

APはタスクトレイに常駐の状態にしておいて、
メッセージの受信時に送り元、メッセージの取得をしたいのですが、
可能でしょうか??

よろしくおねがいします。

編集 削除
36NET  2004-04-14 14:30:16  No: 112813  IP: [192.*.*.*]

API関数の
  CreateMailslot
  GetMailslotInfo
  ReadFile
を使用して
  \\.\mailslot\messngr
を監視すれば出来ると思いますよ

編集 削除
ハナクソース  2004-04-19 13:09:02  No: 112814  IP: [192.*.*.*]

メールスロットの作成を以下のようにやったのですが、戻り値=-1で正常に
メールスロットを作成できません(>_<)

P_hMailslot = CreateMailslot(WIN_POP_SLOT, ByVal 0, MAILSLOT_WAIT_FOREVER, ByVal 0)

サーバマシンでMessengerサービスを停止して実行すると成功するのですが、
クライアントマシンでは動作しない関数なのでしょうか??
クライアントで監視したいんですよ〜〜
ネットワークの知識がないもので、すごい見当外れでしたらすみません。
よろしくおねがいします。

ちなみに、Const定数は
WIN_POP_SLOT = "\\.\mailslot\messngr"
MAILSLOT_WAIT_FOREVER = (-1)
です。

編集 削除
36NET  2004-04-19 15:00:31  No: 112815  IP: [192.*.*.*]

サーバマシン→端末Aでクライアントマシン→端末Bとして
端末Bから
CreateMailslot("\\端末A\mailslot\messngr",〜
と実行するということでしょうか?
自分の知識内では...出来ないと思います

また端末BがWin9*系だとすると「ポップアップメッセージ」が
起動ていると動作しないらしいのですがこれはWin9*環境が
手元に無い為EXEなのかサービスなのかもわかりません。

仮に自分(妥協する開発者)が端末Bから
CreateMailslot("\\端末A\mailslot\messngr",〜
のような処理を開発しなければいけなくなったら
端末Aにメッセージを端末Bに転送するAPを組み込んで逃げますね

編集 削除
ハナクソース  2004-04-19 15:40:32  No: 112816  IP: [192.*.*.*]

36NETさんたびたびありがとうございます。

>サーバマシン→端末Aでクライアントマシン→端末Bとして…
そうです。

>また端末BがWin9*系だとすると「ポップアップメッセージ」が
>起動ていると動作しないらしいのですが

OSがWin9*系でなければ、クライアントでもCreateMailslotが動作する
ということでしょうか??
私の端末(クライアント)はWIN2000ですが失敗してしまいました(><)
またOSがNTSERVERのマシンでもメッセンジャーサービスを停止しないと
失敗するみたいです。

サーバにはAPを組み込まずにクライアント側で処理したい理由は、

・APの実行範囲をクライアント側のみにとどめたい(サーバ側でこのAPのための処      理をするのは避けたい)
・サーバにVB実行環境があるとは限らない(クライアントもそうですが…)
・受信トレイ機能を実現したい

からなんです(^^;)

う〜む…


編集 削除
ねろ  2004-04-19 16:11:03  No: 112817  IP: [192.*.*.*]

>クライアントマシンでは動作しない関数なのでしょうか??
そんなことはありません、私もMailslotでアプリ間の
データーの受け渡しをしています。(あまりお勧めではありません
Win2000以降でしたら、NamedPipeの方がお勧めかも)
CreateMailslotで(−1)が返るということですが
この関数が失敗するのは殆どの場合2重起動です、
Err.LastDllErrorでエラー番号を取得してみては、
ERROR_ALREADY_EXISTS -> 183  
になっていませんか。

編集 削除
36NET  2004-04-19 16:20:36  No: 112818  IP: [192.*.*.*]

"\\.\mailslot\messngr"でCreateMailslotをするなら
メッセンジャーサービスが"\\.\mailslot\messngr"を既に
CreateMailslotしている為,サービスは必ず停止しないとエラーになります

>OSがWin9*系でなければ〜
OSがなんであれ他端末のスロットを監視するのは無理だと思いますよ(知らないだけ?)

全ての条件を網羅するには送信側の送信方法を変えるしかないかと...

編集 削除
ハナクソース  2004-04-19 16:52:28  No: 112819  IP: [192.*.*.*]

>Err.LastDllErrorでエラー番号を取得してみては、
>ERROR_ALREADY_EXISTS -> 183  
>になっていませんか。

確かに183になっていました。
これはAPの2重起動ではなく、既にMailslotがあるのでCreateしようとしてエラーになっているということでしょうか?

ちょっと私の理解であいまいな点があるのですが、”2重起動している”=”サーバ側でメッセンジャサービスが開始されている”というふうに理解していますが、あってます??  とすると、ハンドルを取得して、GetMailslotInfoで情報取得できるのでしょうか?

編集 削除
36NET  2004-04-19 16:57:56  No: 112820  IP: [192.*.*.*]

どうもサーバの解釈に違いがあるような気が?

>”2重起動している”=”サーバ側でメッセンジャサービスが開始されている”
”2重起動している”=”エラーとなった端末でメッセンジャサービスが開始されている”

編集 削除
ねろ  2004-04-20 13:00:46  No: 112821  IP: [192.*.*.*]

>ハンドルを取得して、GetMailslotInfoで情報取得できるのでしょうか?
ハンドルを取得する関数がCreateMailslotなのでは。
「コンパネ」の「管理ツール」で「Messenger」を無効にしてもMailslotは
作成できませんか?

編集 削除
ハナクソース  2004-04-20 13:13:02  No: 112822  IP: [192.*.*.*]

36NETさん、ねろさん、何度もありがとうございますm(_ _)m

CreateMailslotでMailslotを作成しハンドルを取得することはできますが、そのためにはMessengerサービスを停止しないとだめですよね?

サービスを停止してしまうと、通常の"NET SEND"によるメッセージの送受信ができなくなってしまうのです。つまり今作って入るAPを持っている人同士でしか、送信も受信もできなくなってしまいます(>_<) なので、もともとサービスであがっているMailslotのハンドルを取得して、情報を取得したい  ということです。

編集 削除
ねろ  2004-04-20 14:34:25  No: 112823  IP: [192.*.*.*]

だいぶ遠回りをしてしまいましたが、
要するにMessengerサービスで送られてくるメッセージを
受け取り側のアプリで横取りして読む為に、「services.exe」が持っている
Mailslotのハンドルを何らかの方法で取得することが出来ないか?と言うことですね。
質問は解りましたが、方法はわかりません。m(_ _)m

編集 削除
36NET  2004-04-21 00:03:27  No: 112824  IP: [192.*.*.*]

方法もわかりませんがたとえサービスのハンドルが取得出来たとしても
どちらかが情報を取得したらデータが消えてしまうため両方ともまともに動かないと思いますよ

編集 削除
ハナクソース  2004-04-21 10:15:46  No: 112825  IP: [192.*.*.*]

>どちらかが情報を取得したらデータが消えてしまうため
あ〜よく考えればそうですよね…

ねろさん、36NETさん、長々とどうもありがとうございました。
受信トレイ機能を実現したかったのですが、できたとしても色々と制約がつきそうですね(~~;)  でもまぁ頑張ってみます。ありがとうございましたm(_ _)m

編集 削除
ハナクソース  2004-04-27 18:07:48  No: 112826  IP: [192.*.*.*]

え〜遅ればせながら…
一応解決しました。
実現したかったのは受信トレイ機能だったので、
SendmessegeにWM_GETTEXTを投げてみて、ウィンドウ内のメッセージを
取得する  という方法で実現しました。

みなさんどうもありがとうございました!

編集 削除
ハナクソース  2004-04-27 18:08:20  No: 112827  IP: [192.*.*.*]

解決押し忘れた〜〜

編集 削除