2009-03-19 6 views
0

が、私はWindowsのサービスは何のデスクトップを持っていないことを理解し、Windowsサービスに失敗し、(ロードなしデスクトップがない場合に実際に、彼らは実行することができます)、直接ユーザーのデスクトップのいずれかにアクセスすることはできません。なぜWindowのサービスでフォームを起動するとエラーになるのですか?なぜフォームは

答えて

1

あなたのWindowsサービスは、(メッセージボックスポップアップを含む)は、特定の(デスクトップなど)に直接フォルダやショーのフォームにアクセスすることを可能にするために有効にする必要があります設定があります:「デスクトップとの対話をサービスに許可」

へこれを見て、マイコンピュータ=>管理=>サービスとアプリケーション=>サービスを右クリックしてください。プロパティを表示するには、サービスをダブルクリックします。 [ログオン]タブには、この設定のチェックボックスがあります。スティーブン・マーティンとして

Here is C#でプログラム的

それを設定する方法についての記事[編集]はコメントで指摘:これは、WindowsのVistaより前のバージョンでのみ有効なアドバイスです。

+1

デスクトップサービスと対話する許可サービスは、フォルダアクセスとは何の関係もなく、Vista以降のOSで動作しなくなり、重大なセキュリティ上のリスクとなり、Vista以前のOSで使用してはいけません。 –

+0

十分に良い。しかし、「Vistaに先立つすべてのOS」は間違いである。今日の時点(3-23-09)は、VistaまたはWindows 7のベータだけを意味します。私と私が知っているほとんどの人は、まだXPを使用しているので、これはかなり有効なアドバイスだと思います。私はもっ​​と明確にするために私の投稿を更新します。 – Dinah

+1

XPとW2K3で使用することはできますが、マイクロソフトとサービスについて何も知らない人は、この設定を10年以上使用しないようにアドバイスしています。この設定はデバッグの目的で導入されたもので、ライブで使用する予定はありませんでした。 –

1

誰もがフォームを見るつもりなら、誰もそれを却下することはないでしょう - モーダルダイアログを実行することはハングのレシピです - あなたが殺すまで静かにそこに座るよりも大声で文句を言いたいプロセス(または何が起こっているかを判断するスタックトレースを見てください)。 (別の明白な問題は、複数の可能性がある場合に誰がDialogResultを選択するのか?)これがいつ起きているか知りたい。 (何も表示できない場合はスローしないアサートダイアログは、人々を怒らせる楽しい方法です)。言い換えれば

、あなたは物事は、ダイアログがサービスコンテキスト内で表示されているコード内で十分に混乱している時に知りたいので。

あなたは正しく、サービスがデスクトップと対話することが許可されているようなものを設定している場合(

を(私は前夜は、あなたがそのようにタグ付けdidntのが、あなたは.NETのWindowsフォームを使用していると仮定しています) 、あなたは)例外を取得することはありません

+0

対話型ユーザーがいなくても、プログラムでフォームとやり取りすることは可能です。 –

+0

これは決して考えなかった - とても良い点! [一般的に私は現在のimplがサービスのための良いデフォルトであるという一般的な点を理解しようとしていました。 (これは最初の回答で、私が書いた時にすでに他のものが提出されていれば別のものを書いていたでしょう)] –

+0

私の考えは主にOld PainのATLASSERT凍結サービスに基づいていました:D –

2

うーん...何とそのデスクトップそのフォームが正確に、上に表示するために起こっていますか? 「デスクトップ」はオペレーティングシステムの概念です。各ウィンドウハンドルは、単一の(対話型)ユーザーに属するウィンドウステーション内の特定のデスクトップによって所有されています。サービスが実行されているプロセスでは、ウィンドウステーションにユーザーのデスクトップが表示されません。かなり乾燥した参照の場合、MSDNを見てください。

実際には、it's even nastierです。デスクトップを作成できるようにサービスのアクセス許可を設定できるかもしれませんが、誰もそれを見ることはできません!あるいは、プロセスにデスクトップを切り替える権限を与えることができ、ユーザーの混乱を混乱させる可能性があります。

+0

それを作成するスレッドのデスクトップに表示されます。 Windows NTベースのOSのすべてのスレッドは、デスクトップに関連付けられています。 –

+0

OKですが、非対話型ウィンドウステーションです。修正する。修正する。 –

2

サービスはユーザーの操作なしで実行する必要があるため、フォームは必要ありません。サービスがユーザーからのフィードバックを待つ必要がある場合は、おそらくそれが想定していたことをやっていない可能性があります。

0

オペレーティングシステムがウィンドウをペイントする必要があるときに、フォームを描画するものがないためです。

2

セッション、ウィンドウステーション、およびデスクトップの3つの関連概念を理解する必要があります。しかし、セッションとステーションとの間には1対1の関係があるため、この説明のためにステーションを広く無視することができます。セッションにはステーション(winSta0は唯一の対話ステーション)があり、ステーションには1つ以上のデスクトップが含まれています。

セッションのアーキテクチャは、Windowsのバージョンによって異なります。 NT < = 5(XP/2003とその前のすべて)サービスは、対話型ユーザーのアプリケーションと共にセッション0で実行されます。このため、これらのWindows NTバージョンのデスクトップと対話するようにサービスを構成することができます。これらのサービスは同じセッションにあります。 NT> = 6(Vista、Server 2008が進む)では、サービスはセッション0に存在しますが、対話型デスクトップは別のセッションにあります。これは「サービス強化」と呼ばれ、基本的にはセキュリティ上の修正です。

セッション0のアプリは、インタラクティブコンソールで取得することはできませんので、彼らはどのような種類のユーザーインターフェイスを表示しようとするので、それは意味がありません。

これをもっと混乱させるように、Vistaではこのような状況に対処するための一時的な問題があります。セッション0のアプリケーションがダイアログを作成しようとすると、Windowsはこれをトラップしてユーザーに警告を表示し、 (私は一時的に仮定します)、ダイアログと対話できるデスクトップがあります。ただし、この措置は明示的に一時的なものであり、将来のWindowsリリースではこの措置に頼ることはできません。私はこれがネイティブコードで動作するのを見たことがありますが、あなたはマネージコードであり、ランタイムはあなたの行動を捕らえて、隠れ場への比喩的な叩き打ちを与えるほどスマートになっていると思われます。

1

Windowsサービスが開始されると、Windowsサービスは、よく説明されているように、やや不明瞭なルールに基づいて、ウィンドウステーションとデスクトップに割り当てられます。別のところで述べたように、それはインタラクティブデスクトップに割り当てられていません(Vista以前のOSでデスクトップと対話するように設定されていない限り)が、デスクトップでは必ず実行されます。

サービスではUI要素を使用できないというのはよくある誤解です。実際、多くのサービス(SQL Serverなど)では、これまで、スレッドの同期や作業の配布のために、隠されたウィンドウやウィンドウメッセージが使用されていました。サービスにフォームを表示できない理由はありません。エラーが発生した場合は、フォーム上にある何らかのコンポーネントまたはフォーム上にあるコンポーネントが原因です。最も可能性の高い問題は、フォーム用のSTAスレッドが必要かどうか、フォーム用のメッセージポンプなどを作成しているかどうかによって異なります。

もちろん、Windowsサービスでフォームを使用することはできますが、ほとんど間違いないはずです。スレッドの問題、クロスアパートコールの問題、ブロッキングUIの問題などがあります。サービス内のウィンドウを使用することは良い選択ですが、UIを持たないより良い方法が99.99%すべての場合。

関連する問題