我如何发现我的服务依赖项是什么?

时间:2013-03-11 12:34:40

标签: delphi windows-services dependencies

我有一个使用以下内容的Windows服务:

  • Midas.dll(datasnap ClientDataSet)
  • Indy组件(TCP和FTP)
  • 的dbExpress
  • CreateProcessAsUser
  • 处理IPC

在某些机器上(使用旧硬件和Windows XP),它会在启动时挂起。

检查Windows事件日志,我发现了事件ID: 7022 7036

机器启动后,我手动启动服务,一切正常!

我认为问题与我的服务缺少依赖性有关。

我的问题是:

如何为我的服务找到必要的依赖项?

有什么实用工具告诉我这个吗?


更新

我已经有了日志...

我的服务可以通过一些我称之为插件的“子服务”来插件。这个插件以“插件管理器”开头,一个应用程序(exe)加载dll以保证服务内存隔离。

此插件管理器有一个Handle(AllocateHWnd)可以从服务中接收消息(通过sendmessange),例如:

  • 启动
  • 重新加载插件库
  • 停止

插件管理器的引导程序是:

  • 启动并向服务句柄发送消息(通过参数传递),以便在服务和插件管理器之间将IPC内部分配的句柄(由插件管理器)发送回服务。

服务的引导代码是启动插件管理器的代码:

start := now;
while callbackHandle = 0 do
begin
  if PeekMessage(msg, 0, 0, 0, PM_REMOVE) then
  begin
    // need to process a message on WndProc to
    // assign the 'callbackHandle' variable with the
    // handle sent from the plugin manager
    TranslateMessage(msg);
    DispatchMessage(msg);
  end;

  // timeout! Plugin manager doesn't  sent it's handle!!
  if secondsBetween(now, start) > 60 then
     break;
end;

if callbackHandle = 0 then
  raise Exception.Create('Cannot receive the callback handle from plugin manager');

在日志中,发生以上异常:无法从插件管理器

接收回调句柄

似乎服务句柄没有收到pluginmanager句柄,以启动IPC(进程间通信)。

奇怪的是,如果我在计算机启动后手动启动服务,它会正常启动。

2 个答案:

答案 0 :(得分:1)

消息队列处理时间不是问题。 问题是:硬件速度慢

我将ServicePipeTimeout从30秒(默认)增加到2分钟,一切都恢复正常。

现在我将尝试在服务OnStart事件中使用RequestAdditionalTime。唯一的问题是我使用的是Delphi 7。

答案 1 :(得分:0)

最简单的方法是在服务中实现日志记录机制。只需将您正在做的所有内容写入TextFile即可。然后,您可以轻松找到服务的位置。

您与DBExpress有什么联系?像SQL Server这样的数据库引擎?如果是这种情况,也许您的服务正在RDBMS之前启动......