2014-10-27 64 views
0

我有一個服務在客戶上運行,特別是我注意到一個奇怪的行爲。在關閉服務之前,必須執行關閉例程(OnStop),然後在FormDestroy中輸入。然而,在這個客戶中,服務意外終止(我知道這是因爲FormDestroy一直在調用),但是沒有進入服務關閉的例程。意外調用表單銷燬

望着堆,似乎一切正常:

 
01388f14 ****.exe Main****.  32766 TF****.FormDestroy 
00506cbd ****.exe Forms    TCustomForm.DoDestroy 
00506b23 ****.exe Forms    TCustomForm.BeforeDestruction 
00404c95 ****.exe System    @BeforeDestruction 
007a6a02 ****.exe dxRibbonForm  445 TdxCustomRibbonForm.Destroy 
00487eaa ****.exe Classes    TComponent.DestroyComponents 
00504a33 ****.exe Forms    DoneApplication 
0045da9d ****.exe SysUtils    DoExitProc 
00405683 ****.exe System    @Halt0 
01435465 ****.exe Main****   289 initialization 
75773388 kernel32.dll     BaseThreadInitThunk 

我可以看到在Windows事件查看器此消息:

從源事件ID 0說明***不能找到。引發此事件的組件未安裝在本地計算機上或安裝已損壞。您可以在本地計算機上安裝或修復組件。

如果事件發生在另一臺計算機上,顯示信息必須與該事件一起保存。

以下信息包括與事件:

擴展處理程序註冊

你能不能給我一個提示,找出可能發生的?

+1

讓我們從您的代碼開始。你能分享一下你的服務如何停止嗎?沒有它,我懷疑除了你自己以外的任何人都能猜出問題所在。 – 2014-10-27 13:32:05

+1

@DavidHeffernan服務可以有圖形用戶界面...也許這對他們來說不是「明智的」,但是說他們是「不允許的」是錯誤的,在這裏沒有幫助。 – Ian 2014-10-27 13:46:09

+2

@ Ian號服務不能有GUI。它們在會話零時運行,這不是交互式的。 – 2014-10-27 13:58:27

回答

0

事件查看器中的消息沒有意義。這只是事件的標準錯誤文本,其中事件源的應用程序未提供包含適當的錯誤消息來描述特定事件的DLL。

由於您的服務似乎試圖以交互方式運行(與UI),你大概已經爲您服務的互動屬性設置爲TRUE 。這意味着您的服務從SERVICE_INTERACTIVE_PROCESS標誌設置開始。基於系統設置as described in this MSDN article,以該標誌開始的服務可能會被系統阻止運行。

綜上所述,在HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \註冊表的控制\視窗鍵,如果NoInteractiveServices值被設置爲(零),那麼這種服務是無法運行。在使用Delphi實現的服務的情況下,這意味着服務進程已經啓動,但是當它嘗試註冊服務本身時會終止服務,如果它包含假設服務用戶界面初始化的話,這可能會導致UI銷燬代碼出現問題那是成功的。

在您受影響的客戶系統,此註冊表值更改爲0 (零)允許互動服務。如果您的服務能夠啓動,那麼這證實這是您問題的根源。

但是,您的客戶可能因爲有效的原因而特意選擇拒絕此類服務(請參閱該文章中有關初始者的說明)。

如果是這種情況,並且這確實是問題的原因,那麼您將被迫爲您的服務/應用程序的UI需求找到另一種方法。同時,如果您的服務的使用對該客戶很重要,那麼如果他們準備在受影響的系統上在有限的時間內啓用此設置,同時對您的應用程序體系結構進行必要的更改,則這可能會提供臨時解決方案。

+0

有趣的答案,考慮。 – 2014-10-28 19:58:22