4

VC++ でサービスを作成しました。ここのチュートリアルに従いました。現在、最上位ウィンドウを持つ通常のアプリケーションのように、DBT_DEVICEEARRIVAL、DBT_DEVICEREMOVECOMPLETE、WM_COPYDATA などのメッセージを受信する方法を見つけようとしています。それを検索すると、このMSDNの記事に出くわしました

「メッセージのブロードキャスト」セクションの最後の段落:

アプリケーションは、最上位ウィンドウのウィンドウ プロシージャを介してメッセージを受け取ります。メッセージは子ウィンドウに送信されません。サービスは、ウィンドウ プロシージャまたはそのサービス コントロール ハンドラを介してメッセージを受信できます。

しかし、それを行う方法の例を見つけることはほとんど不可能です.

  1. メッセージを受信できるように、WndProc をサービスに関連付けるにはどうすればよいですか?

  2. または、Windows メッセージを受信するようにサービス コントロール ハンドラー関数を作成するにはどうすればよいですか? 私のサービス コントロール ハンドラには、WndProc の UINT、WPARAM、LPARAM などではなく、DWORD パラメータが 1 つしかありません。

1) 非表示ウィンドウの使用、2) メッセージのみのウィンドウなどについて読みましたが、サービスで使用できるとは思いません。したくない。MSDN が言及している 2 つの方法のいずれかでそれを達成できれば幸いです。

サービスの説明:

このサービスは、USB デバイスの挿入を検出し、いくつかのファイルを USB デバイスにコピーします。また、いくつかのディレクトリとファイルへの変更を追跡して、どれをコピーするかを把握する必要があります。

この基本機能は、将来、他のものを含むように拡張される可能性があります。そのため、現在認識していない他の多くの Windows メッセージを受信できるようにする必要があるかもしれません。

上記のメッセージの例は、通常の Windows アプリを開発するときに私が慣れ親しんだものから取ったものです。サービスを作成するときに、それらが適切でないか安全でないかを理解しています。

4

2 に答える 2

3

Win32 ウィンドウ アプリケーションの純粋な C 実装を作成する場合と同じように、通常のメッセージ ループを作成するだけです。フレームワークは必要ありません。

例:

while(GetMessage(...)) ...

PeekMessageまたはGetMessage(リンクされたドキュメントを参照) を使用できます。ただし、後者はより慣習的であり、メッセージのキューから削除されます。

つまり、ウィンドウさえ必要ありません。すべてのスレッドは、メッセージ ループを持つことができます。したがって、ブロックされますが、現在のスレッドのみです。情報を必要とする他のスレッドに情報を中継する方法を自分で考え出さなければなりません。

しかし、大きな

ただし、下半身を撃ち落とさないように MS が用意したものを妥協する代わりに、ウィキペディアでシャッター攻撃について読み、サービスに適切なIPC手法を使用する必要があります (MMF からパイプまで、利用可能な手法はたくさんあります)。セマフォ、ミューテックス、およびイベントとの組み合わせ)。

この部分は、ユーザーのデスクトップでウィンドウ メッセージを受信するつもりであるが、特権コンテキストを使用する場合に関連します (いずれにせよ、セッションの分離は防ぐ必要があります)。

于 2013-02-28T18:12:08.540 に答える
1

HandlerExコールバック関数でRegisterServiceCtrlHandlerEx関数を使用します。

はい、0xC0000022Lで指摘されているように、名前付きパイプなどの IPC 手法を使用することをお勧めします。:)

于 2013-02-28T18:14:00.320 に答える