我有一个Windows服务,它使用:
在一些机器上(使用旧的硬件和Windows ),它在启动时会挂起。
检查Windows事件日志,我找到了事件I:7022,7036。
机器启动后,我手动启动服务,一切都很好!
我认为问题与缺少对我的服务的依赖有关。
我的问题是:
如何找到服务所需的依赖项?
,有什么实用工具告诉我这个吗?
更新
我已经有日志了..。
我的服务是可插入的一些“子服务”,我称之为插件。这个插件从一个“插件管理器”开始,它是一个加载dll以保证服务内存隔离的应用程序(exe)。
这个插件管理器有一个句柄(AllocateHWnd)可以从服务接收消息(通过sendmessange),如下所示:
插件管理器的引导程序是:
服务中启动插件管理器的引导代码是:
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 (进程间通信)。
奇怪的是,如果我在电脑启动后手动启动服务,它就会正常启动。
发布于 2013-03-12 18:34:02
消息队列处理时间不是问题。问题是:硬件速度慢。
我将ServicePipeTimeout从30秒(默认)提高到2分钟,一切都好起来了。
现在,我将尝试在服务RequestAdditionalTime事件中使用OnStart。唯一的问题是我使用的是Delphi 7。
发布于 2013-03-11 12:41:32
最简单的启动方式是在服务中实现日志机制。只需将您所做的一切写入TextFile。然后,您可以很容易地找到您的服务挂在哪里。
您与DBExpress连接的是什么?像Server这样的数据库引擎?如果是这样的话,也许您的服务是在RDBMS之前启动的.
https://stackoverflow.com/questions/15338698
复制相似问题