1

Windows Messaging System を使用する Windows サービスを作成しました。デバッガーからアプリをテストすると、メッセージはうまくいきますが、インストールするとメッセージが… 14 分前に質問されました

ウラジミール・トゥガ

4

3 に答える 3

7

通常、サービスはウィンドウ メッセージを受け取りません。必ずしもウィンドウ ハンドルを持っているとは限りません。たとえそうであっても、それらは別のデスクトップで実行されます。プログラムはあるデスクトップから別のデスクトップにメッセージを送信できないため、サービスは別のサービスから、またはサービスによって開始されたプログラムからのみメッセージを受信できます。

Windows Vista より前は、デスクトップと対話するようにサービスを構成できました。これにより、ログインしたユーザーと同じデスクトップでサービスが実行されるため、そのユーザーとして実行されているプログラムは、サービスのウィンドウにメッセージを送信できます。ただし、Windows Vista はサービスを分離します。ユーザーのデスクトップと対話することはできなくなります。

サービスと通信する方法は他にもたくさんあります。これには、名前付きパイプ、メールスロット、メモリ マップ ファイル、セマフォ、イベント、およびソケットが含まれます。

たとえば、ソケットを使用すると、サービスは開いているポートでリッスンでき、それと通信する必要があるプログラムはそのポートに接続できます。これにより、リモート管理への扉が開かれる可能性がありますが、ローカル接続のみをリッスンするようにサービスを制限することもできます.

上記のすべては、あなたが間違ったアプローチを取っていることを伝えようとしています. しかし、目の前の問題の問題もあります。プログラムは、デバッガー内で 1 つの方法で動作し、デバッガー外では別の方法で動作します。インストールされていない場合、そもそもサービスをどのようにデバッグしていますか? サービスを実行しているユーザー アカウントは何ですか? あなたのデバッガ?デバッガーを使用しないで試したデバッグ手法は何writelnですか?

于 2008-12-10T16:44:57.240 に答える
5

Windows Messaging System を「使用する」とはどういう意味ですか? Windows メッセージを使用または送信していますか?

Windows メッセージを送信する場合は、正しく送信していることを確認する必要があります。メッセージが適切にディスパッチされるように、メッセージ ループを作成することをお勧めします。また、メッセージ ループとその仕組みについてもお読みになることをお勧めします。

メッセージ ループとは(タイトルをクリックすると、この情報のソースに移動します)

while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
}
  1. メッセージ ループは、メッセージ キューを調べる GetMessage() を呼び出します。メッセージ キューが空の場合、プログラムは基本的に停止し、1 つ待機します (ブロックします)。
  2. メッセージがキューに追加されるイベントが発生した場合 (たとえば、システムがマウス クリックを登録した場合)、GetMessages() は、処理するメッセージがあり、MSG のメンバーが入力されたことを示す正の値を返します。構造が渡されました。WM_QUIT にヒットした場合は 0 を返し、エラーが発生した場合は負の値を返します。
  3. メッセージを (Msg 変数で) 取得し、それを TranslateMessage() に渡します。これは、仮想キー メッセージを文字メッセージに変換する、少し追加の処理を行います。このステップは実際にはオプションですが、それがないと機能しないものがあります。
  4. それが完了したら、メッセージを DispatchMessage() に渡します。DispatchMessage() が行うことは、メッセージを取得し、それがどのウィンドウに対応しているかを確認し、ウィンドウのウィンドウ プロシージャを検索することです。次に、そのプロシージャを呼び出し、パラメータとしてウィンドウのハンドル、メッセージ、および wParam と lParam を送信します。
  5. ウィンドウ プロシージャで、メッセージとそのパラメーターを確認し、それらを使用して必要なことを行います。特定のメッセージを処理していない場合は、ほとんどの場合、デフォルトのアクションを実行する DefWindowProc() を呼び出します (これは多くの場合、何もしないことを意味します)。
  6. メッセージの処理が完了すると、Windows プロシージャが戻り、DispatchMessage() が戻り、ループの最初に戻ります。
于 2008-12-10T16:37:55.260 に答える
0

回答ありがとうございます。問題はオペレーティング システム (vista) でした。Windows 2000 でテストしたところ、すべて動作しました。

軽いロブをありがとう。

于 2008-12-10T18:21:59.307 に答える