2008-09-22 39 views
2

有沒有人有一個很好的XP指導Windows服務的功能?特別是,我試圖找出當一個作爲服務運行的程序嘗試打開窗口時會發生什麼情況,但是沒有被授予與桌面交互的權限。服務在Windows下可以做什麼?

基本上,我有一個程序是/是一個GUI應用程序,它應該能夠作爲服務運行以進行長期後臺處理。重寫程序在做後臺處理時不顯示GUI元素是一項重大的工作,所以我想看看是否有一種方法可以忽略UI元素。現在有些工作,只要太多的窗戶沒有打開。我試圖找出我可能遇到的限制。理想情況下,會有一個MSDN頁面來討論這個問題,但我還沒有找到一個好運氣。

回答

2

A 服務在Microsoft Windows中是一個程序,只要計算機運行操作系統就會運行。它不需要用戶登錄。需要執行與用戶無關的任務(例如目錄複製,進程監視或對網絡上其他計算機的服務),例如支持Internet HTTP協議,需要服務

通常它是作爲一個控制檯應用程序背景並執行不需要用戶交互的任務。

安裝的服務可以通過Windows 2000/XP中的 Control Panel --> Administrative Tools的服務小程序進行配置。

服務可以配置爲在操作系統啓動時自動啓動,因此您不必在系統重啓後手動啓動它們中的每一個。

  1. Creating a Simple Service - MSDN Article
  2. Writing Windows Services Made easy - Code Project Article
  3. Five Steps to Writing Windows Services in C - DevX Article
+0

問題與具有Windows服務的用戶界面有關。你的答案根本不涉及UI方面。 – Jaywalker 2010-11-23 10:48:50

8

一般情況下,服務的設計應該沒有任何可見的UI。整個服務點是在後臺運行,無需UI,無人值守。 (Think SQL Server,IIS等)

在大多數情況下,如果需要GUI,單獨的應用程序將控制服務的操作。 (繼續我剛剛提到的示例,SQL Server Management Studio,IIS管理器等)。這些獨立的應用程序配置和操作服務(並且偶爾如果需要的話還原所述服務)。

如果你的服務需要偶爾的UI,並表示UI不能被隔離到控制應用程序,那麼你或許應該重新考慮你正在使用的服務開始的事實。也許一個駐留在系統通知區域的UI應用程序是正確的使用模式? (例如Windows Live Communicator)

+0

作爲服務運行時,UI不是必需的,但重新編寫程序時不會彈出信息窗口,因此需要進行重大改寫。我試圖看看在做後臺工作時是否可以忽略GUI。 – 2008-09-22 21:03:53

+0

我認爲應用程序不能轉換爲服務?如果是這樣的話,你可能會最好的做你上面提到的東西 - 但我會評論這個非常徹底,所以你或維護程序員理解這個場景! – 2008-09-22 21:06:42

+0

不容易。基本上應用程序的GUI是用於配置後臺處理。你配置它,然後永遠運行。把它分解成一個服務和一個控制程序是理想的,但是這個處理與UI代碼交織在一起的這個巨大的事情...... – 2008-09-22 21:12:26

1

如果您應該考慮最終遷移到較新的操作系統(如Vista或Server 2008),您會發現根本無法提供與桌面交互的服務權限。因此,從向前兼容的角度來看,你應該設計你的服務而不需要它。

0

通常服務沒有權限寫入窗口工作站和桌面,所以會失敗;即使運行加載user32.dll的應用程序可能會失敗,只是因爲user32具有想要與窗口站通信的初始化代碼,並且無法訪問它,除非該服務以管理員身份運行。

1

如果選中「允許服務與桌面交互」屬性(MMC - >服務屬性 - >登錄選項卡),Windows XP中的服務可以與桌面進行交互。也可以做這樣做如下:

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

但要知道,在Windows XP服務進程呈現UI幾乎總是導致安全問題(見Shatter attack)。你應該嘗試從服務中分解應用程序的UI部分。

相關問題