2

XP での Windows サービスの機能に関する優れたガイドを持っている人はいますか? 特に、サービスとして実行されているプログラムがウィンドウを開こうとしたときに何が起こるかを調べようとしていますが、デスクトップと対話する許可が与えられていません。

基本的に、私はGUIアプリケーションである/だったプログラムを持っています。これは、長期的なバックグラウンド処理のサービスとして実行できるはずです。バックグラウンド処理時にGUI要素を表示しないようにプログラムを書き直すのは大変な作業なので、UI要素を無視するだけの方法がないかどうかを確認したいと思います。あまりにも多くのウィンドウが開かれていない限り、現在は機能しています。私は、どのような限界に達している可能性があるかを理解しようとしています。理想的には、これについて説明する MSDN ページがあればよいのですが、まだ見つけることができませんでした。

4

5 に答える 5

8

一般に、サービスは UI が表示されないように設計する必要があります。サービスの要点は、UI を使用せず、無人でバックグラウンドで実行することです。(SQL Server、IIS などを考えてください)

ほとんどのシナリオでは、GUI が必要な場合に、別のアプリケーションがサービスの操作を制御します。(前述のサンプル、SQL Server Management Studio、IIS Manager などの続き) これらの個別のアプリケーションは、サービスを構成および操作します (必要に応じて、そのサービスをバウンスすることもあります)。

サービスが不定期の UI を必要とし、UI を制御アプリに分離できないと述べた場合は、最初からサービスを使用しているという事実を再考する必要があります。おそらく、システム通知領域に常駐する UI アプリケーションは、使用する適切なパターンでしょうか? (例: Windows Live コミュニケーター)

于 2008-09-22T21:00:31.507 に答える
2

Microsoft Windowsのサービスは、コンピュータがオペレーティング システムを実行しているときに実行されるプログラムです。ユーザーがログオンする必要はありません。ディレクトリの複製、プロセスの監視、インターネット HTTP プロトコルのサポートなど、ネットワーク上の他のマシンへのサービスなど、ユーザーに依存しないタスクを実行するには、サービスが必要です。

通常、バックグラウンドで実行され、ユーザーの操作を必要としないタスクを実行するコンソール アプリケーションとして実装されます。

Control Panel --> Administrative Toolsインストールされたサービスは、Windows 2000/XPから利用可能なサービス アプレットを介して構成できます 。

オペレーティング システムの起動時にサービスを自動的に開始するように構成できるため、システムの再起動後に各サービスを手動で開始する必要はありません。

  1. シンプルなサービスの作成 - MSDN の記事
  2. Windows サービスの作成が簡単に - コード プロジェクトの記事
  3. C で Windows サービスを記述するための 5 つのステップ - DevX 記事
于 2008-09-22T20:57:35.070 に答える
1

最終的に Vista や Server 2008 などの新しい OS に移行することを検討している場合は、サービスにデスクトップと対話するためのアクセス許可をまったく付与できないことに気付くでしょう。したがって、前方互換性の観点から、サービスを必要としないように設計する必要があります。

于 2008-09-22T21:04:35.973 に答える
1

Windows XP のサービスは、[デスクトップとの対話をサービスに許可する] プロパティ (MMC -> サービス プロパティ -> [ログオン] タブ) がチェックされている場合、デスクトップと対話できます。また、次のようにして行うこともできます。

hWinstation = OpenWindowStation("winsta0", FALSE, MAXIMUM_ALLOWED);
SetProcessWindowStation(hWinstation);
hDesktop = OpenDesktop("default", 0, FALSE, MAXIMUM_ALLOWED);
SetThreadDesktop(hDesk);

ただし、Windows XP でサービス プロセスから UI を提示すると、ほとんどの場合、セキュリティの問題が発生することに注意してください (シャッター攻撃を参照)。アプリケーションの UI 部分をサービスから分割するようにしてください。

于 2008-09-22T21:13:53.020 に答える
0

通常、サービスにはウィンドウ ステーションとデスクトップへの書き込み権限がないため、失敗します。user32.dll をロードする実行中のアプリケーションでさえ失敗する可能性があります。これは、user32 にウィンドウ ステーションと通信する必要がある初期化コードがあり、サービスが管理者として実行されていない限りアクセスできないためです。

于 2008-09-22T21:08:51.020 に答える