【发布时间】:2013-03-11 12:34:39
【问题描述】:
我有一个 Windows 服务使用:
- Midas.dll (datasnap ClientDataSet)
- Indy 组件(TCP 和 FTP)
- DbExpress
- CreateProcessAsUser
- 制作 IPC 的句柄
在某些机器上(使用旧硬件和 Windows XP),它在启动期间会挂起。
检查 Windows 事件日志,我发现事件 ID:7022、7036。
机器启动后,我手动启动服务,一切正常!
我认为问题与我的服务缺少依赖项有关。
我的问题是:
如何为我的服务找到必要的依赖项?
有什么工具可以告诉我这个吗?
更新
我已经有日志了...
我的服务可以被我称为插件的一些“子服务”插入。这个插件以“插件管理器”开始,一个应用程序 (exe) 加载 dll 以保证服务内存隔离。
这个插件管理器有一个句柄 (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(进程间通信)。
奇怪的是,如果我在电脑启动后手动启动服务,它就可以正常启动。
【问题讨论】:
-
最简单的开始方法是在您的服务中实现日志记录机制。只需将您正在做的所有事情都写入
TextFile。然后,您可以轻松找出您的服务挂起的位置。 -
您很可能在系统准备好之前尝试进行 Internet/TCP/IP 操作。你延迟操作一段时间,看看能不能解决问题。或者,设置对基本内容的依赖。
-
再次检查您的日志。消息发送了吗?什么时候?也许你必须调整你的等待时间,因为系统正在启动,也许另一部分需要超过 60 秒才能发送消息,但确保你的日志可以告诉你。
标签: delphi windows-services dependencies