こんにちは。VB6で開発を行っているのですが…
NETコマンドで NET SEND ユーザ名 メッセージ と入力すると
ネットワークにつながっているPCにメッセージを送れますよね
APはタスクトレイに常駐の状態にしておいて、
メッセージの受信時に送り元、メッセージの取得をしたいのですが、
可能でしょうか??
よろしくおねがいします。
API関数の
CreateMailslot
GetMailslotInfo
ReadFile
を使用して
\\.\mailslot\messngr
を監視すれば出来ると思いますよ
メールスロットの作成を以下のようにやったのですが、戻り値=-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)
です。
サーバマシン→端末Aでクライアントマシン→端末Bとして
端末Bから
CreateMailslot("\\端末A\mailslot\messngr",〜
と実行するということでしょうか?
自分の知識内では...出来ないと思います
また端末BがWin9*系だとすると「ポップアップメッセージ」が
起動ていると動作しないらしいのですがこれはWin9*環境が
手元に無い為EXEなのかサービスなのかもわかりません。
仮に自分(妥協する開発者)が端末Bから
CreateMailslot("\\端末A\mailslot\messngr",〜
のような処理を開発しなければいけなくなったら
端末Aにメッセージを端末Bに転送するAPを組み込んで逃げますね
36NETさんたびたびありがとうございます。
>サーバマシン→端末Aでクライアントマシン→端末Bとして…
そうです。
>また端末BがWin9*系だとすると「ポップアップメッセージ」が
>起動ていると動作しないらしいのですが
OSがWin9*系でなければ、クライアントでもCreateMailslotが動作する
ということでしょうか??
私の端末(クライアント)はWIN2000ですが失敗してしまいました(><)
またOSがNTSERVERのマシンでもメッセンジャーサービスを停止しないと
失敗するみたいです。
サーバにはAPを組み込まずにクライアント側で処理したい理由は、
・APの実行範囲をクライアント側のみにとどめたい(サーバ側でこのAPのための処 理をするのは避けたい)
・サーバにVB実行環境があるとは限らない(クライアントもそうですが…)
・受信トレイ機能を実現したい
からなんです(^^;)
う〜む…
・
・
・
>クライアントマシンでは動作しない関数なのでしょうか??
そんなことはありません、私もMailslotでアプリ間の
データーの受け渡しをしています。(あまりお勧めではありません
Win2000以降でしたら、NamedPipeの方がお勧めかも)
CreateMailslotで(−1)が返るということですが
この関数が失敗するのは殆どの場合2重起動です、
Err.LastDllErrorでエラー番号を取得してみては、
ERROR_ALREADY_EXISTS -> 183
になっていませんか。
"\\.\mailslot\messngr"でCreateMailslotをするなら
メッセンジャーサービスが"\\.\mailslot\messngr"を既に
CreateMailslotしている為,サービスは必ず停止しないとエラーになります
>OSがWin9*系でなければ〜
OSがなんであれ他端末のスロットを監視するのは無理だと思いますよ(知らないだけ?)
全ての条件を網羅するには送信側の送信方法を変えるしかないかと...
>Err.LastDllErrorでエラー番号を取得してみては、
>ERROR_ALREADY_EXISTS -> 183
>になっていませんか。
確かに183になっていました。
これはAPの2重起動ではなく、既にMailslotがあるのでCreateしようとしてエラーになっているということでしょうか?
ちょっと私の理解であいまいな点があるのですが、”2重起動している”=”サーバ側でメッセンジャサービスが開始されている”というふうに理解していますが、あってます?? とすると、ハンドルを取得して、GetMailslotInfoで情報取得できるのでしょうか?
どうもサーバの解釈に違いがあるような気が?
>”2重起動している”=”サーバ側でメッセンジャサービスが開始されている”
”2重起動している”=”エラーとなった端末でメッセンジャサービスが開始されている”
>ハンドルを取得して、GetMailslotInfoで情報取得できるのでしょうか?
ハンドルを取得する関数がCreateMailslotなのでは。
「コンパネ」の「管理ツール」で「Messenger」を無効にしてもMailslotは
作成できませんか?
36NETさん、ねろさん、何度もありがとうございますm(_ _)m
CreateMailslotでMailslotを作成しハンドルを取得することはできますが、そのためにはMessengerサービスを停止しないとだめですよね?
サービスを停止してしまうと、通常の"NET SEND"によるメッセージの送受信ができなくなってしまうのです。つまり今作って入るAPを持っている人同士でしか、送信も受信もできなくなってしまいます(>_<) なので、もともとサービスであがっているMailslotのハンドルを取得して、情報を取得したい ということです。
だいぶ遠回りをしてしまいましたが、
要するにMessengerサービスで送られてくるメッセージを
受け取り側のアプリで横取りして読む為に、「services.exe」が持っている
Mailslotのハンドルを何らかの方法で取得することが出来ないか?と言うことですね。
質問は解りましたが、方法はわかりません。m(_ _)m
方法もわかりませんがたとえサービスのハンドルが取得出来たとしても
どちらかが情報を取得したらデータが消えてしまうため両方ともまともに動かないと思いますよ
>どちらかが情報を取得したらデータが消えてしまうため
あ〜よく考えればそうですよね…
ねろさん、36NETさん、長々とどうもありがとうございました。
受信トレイ機能を実現したかったのですが、できたとしても色々と制約がつきそうですね(~~;) でもまぁ頑張ってみます。ありがとうございましたm(_ _)m
え〜遅ればせながら…
一応解決しました。
実現したかったのは受信トレイ機能だったので、
SendmessegeにWM_GETTEXTを投げてみて、ウィンドウ内のメッセージを
取得する という方法で実現しました。
みなさんどうもありがとうございました!
解決押し忘れた〜〜
編集 削除