gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:42:28 24 4
gpt4 key购买 nike

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

  • Midas.dll (datasnap ClientDataSet)
  • Indy 组件(TCP 和 FTP)
  • 数据库速递
  • CreateProcessAsUser
  • 制作IPC的 handle

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

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

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

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

    我的问题是:

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

    有什么实用程序可以告诉我这个吗?

    更新

    我已经有日志了...

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

    这个插件管理器有一个句柄(AllocateHWnd)可以从服务接收消息(通过 sendmessange),比如:
  • 开始
  • 重新加载插件库
  • 停止

  • 插件管理器的 Bootstrap 是:
  • 启动并向服务的句柄发送一条消息(通过参数传递),以将在服务和插件管理器之间为 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(进程间通信)。

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

    最佳答案

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

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

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

    关于delphi - 如何发现我的服务的依赖项是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15338698/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com