2011-05-19 72 views
6

我在delphi中創建了一個windows服務。我的代碼在ServiceExecute中運行在delphi中創建Windows服務

procedure TMyService.ServiceExecute(Sender: TService); 
while not Terminated do 
begin 
     CallSomeProcedure; 
     Sleep(1000); 
     ServiceThread.ProcessRequests(false); 
end; 
end; 

不幸的是,我無法獲得該代碼的運行。即使在我正在調試時,我似乎也不會調用該過程。 Myservice.exe中的代碼如下所示。

begin 
    if not Application.DelayInitialize or Application.Installing then 
     Application.Initialize; 
    Application.CreateForm(TMyService, MyService); 
    Application.Run; 
end. 

我可以得到serviceExecute跑,如果我添加

MyService.ServiceExecute(nil); 

到MyService.exe但是如果我安裝它,因爲它似乎不是一個服務運行作爲Application.Run什麼都不做

不知道我在做什麼錯,但任何幫助將不勝感激。

謝謝

+1

沒有什麼看起來不對我。 – 2011-05-19 15:08:34

回答

8

你不能只從IDE運行服務來調試它;在那種情況下,它將會退出。該服務必須由服務控制管理器啓動。另外,你不應該直接調用ServiceExecute。

這裏是documentation如何調試服務。

+0

感謝您的快速回復。我現在已經調試過了,我只是遇到了我正在使用的ADOQuery問題。應該能夠解決現在我可以調試的問題。謝謝 – user761275 2011-05-20 09:41:57

+0

歡迎,很高興提供幫助。 :-) – 2011-05-20 09:54:53

4

如果您已經創建了一個服務,您可以通過參數運行它/install

之後安裝,服務應該會顯示您的其他服務之間(去start/run/並進入services.msc)。

然後,您可以啓動它,並且可以通過將調試器附加到它進行調試。

但是,這樣工作很痛苦。我無法相信有些人實際上是這樣工作的。我通常將所有的業務邏輯放在獨立的單元中,我可以從「普通」應用程序運行。只有當這一切順利時,我纔會把它包裝在一個服務中,然後嘗試。

有時候我甚至會創建一個既可以作爲服務也可以作爲GUI運行的應用程序。你可以簡單地實例化你的服務類。您只需要自己啓動它,但調試起來要容易得多。

1

commercial solution專爲簡化服務調試過程而開發的。您可以直接從Delphi IDE登錄debug your code,包括服務的OnStart事件。

+0

svCom不僅僅是調試。它是一個完整的服務框架,作爲TService的替代品。在我的TService項目中,我只需在OnStart事件處理程序的開頭放置一個IsDebuggerPresent()'循環,然後在SCM啓動後將調試程序附加到服務進程。工作正常。 – 2011-05-24 08:51:33