首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何发现服务的依赖项是什么?

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

Stack Overflow用户
提问于 2013-03-11 12:34:39
回答 2查看 769关注 0票数 2

我有一个Windows服务,它使用:

  • Midas.dll (datasnap ClientDataSet)
  • Indy组件(TCP和FTP)
  • DbExpress
  • CreateProcessAsUser
  • 手柄使IPC

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

检查Windows事件日志,我找到了事件I:70227036

机器启动后,我手动启动服务,一切都很好!

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

我的问题是:

如何找到服务所需的依赖项?

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

更新

我已经有日志了..。

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

这个插件管理器有一个句柄(AllocateHWnd)可以从服务接收消息(通过sendmessange),如下所示:

  • 开始
  • 重新加载插件库
  • 停止播放

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

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

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

代码语言:javascript
复制
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');

在日志中,出现上述异常:无法从插件管理器接收回调句柄。

似乎服务句柄没有接收到插件管理器句柄,从而启动IPC (进程间通信)。

奇怪的是,如果我在电脑启动后手动启动服务,它就会正常启动。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-12 18:34:02

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

我将ServicePipeTimeout从30秒(默认)提高到2分钟,一切都好起来了。

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

票数 1
EN

Stack Overflow用户

发布于 2013-03-11 12:41:32

最简单的启动方式是在服务中实现日志机制。只需将您所做的一切写入TextFile。然后,您可以很容易地找到您的服务挂在哪里。

您与DBExpress连接的是什么?像Server这样的数据库引擎?如果是这样的话,也许您的服务是在RDBMS之前启动的.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15338698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档