意外调用形式破坏

时间:2014-10-27 13:27:40

标签: delphi

我在客户上运行了一项服务,特别是我注意到了一种奇怪的行为。始终在关闭服务之前,执行关闭例程(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 个答案:

答案 0 :(得分:0)

事件查看器中的消息毫无意义。这只是一个事件的标准错误文本,其中作为事件源的应用程序没有提供包含适当错误消息的DLL来描述特定事件。

由于您的服务似乎尝试以交互方式运行(使用用户界面),因此您可能已将服务的交互式属性设置为 TRUE 。这意味着您的服务以 SERVICE_INTERACTIVE_PROCESS 标志设置开始。根据系统设置as described in this MSDN article,系统可能会阻止以此标志启动的服务运行。

总之,在注册表的 HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Windows 键中,如果 NoInteractiveServices 值设置为 1 (零),然后阻止此类服务运行。对于Delphi实现的服务,这意味着服务进程已启动但在尝试注册服务本身时将终止,如果它包含假设您的服务UI初始化,则可能会导致UI销毁代码出现问题很成功。

在受影响的客户系统上,将此注册表值更改为 0 (零)到允许交互式服务。如果您的服务能够启动,则确认这是您的问题的根源。

但是,您的客户可能出于正当理由特别选择禁止此类服务(请参阅该文章中的说明,了解初学者)。

如果是这种情况,这确实是您的问题的原因,那么您将被迫找到替代方法来满足您的服务/应用程序的UI需求。与此同时,如果您的服务的使用对该客户很重要,那么如果他们准备在受影响的系统上在有限的时间内启用此设置,同时您对应用程序架构进行必要的更改,则可以提供临时解决方案。