中的Windows服务已在Delphi中创建和启动,bot未正常运行

中的Windows服务已在Delphi中创建和启动,bot未正常运行,delphi,service,Delphi,Service,您好,我已经在Delphi中创建了windows服务。我已经安装并启动了这些服务。一切正常。我甚至可以在任务管理器中检查它。我的服务正在运行 但是我在OnExecute方法中包含的代码不起作用 我的全部代码: unit MyService; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.

您好,我已经在Delphi中创建了windows服务。我已经安装并启动了这些服务。一切正常。我甚至可以在任务管理器中检查它。我的服务正在运行

但是我在OnExecute方法中包含的代码不起作用

我的全部代码:

unit MyService;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs,
  Vcl.ExtCtrls,Jira;

type
  TJiraTestlink = class(TService)
    procedure ServiceExecute(Sender: TService);

  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  JiraTestlink: TJiraTestlink;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  JiraTestlink.Controller(CtrlCode);
end;

function TJiraTestlink.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TJiraTestlink.ServiceExecute(Sender: TService);
const
  SecBetweenRuns = 10;
var
  Count: Integer;
begin
  Count := 0;
  while not Terminated do
  begin
    Inc(Count);
    if Count >= SecBetweenRuns then
    begin
      Count := 0;

      { place your service code here }
      { this is where the action happens }
      ShowMessage(DateTimeToStr(Now));

    end;
    Sleep(1000);
    ServiceThread.ProcessRequests(False);
  end;
end;
end.

我不知道我哪里出错了。任何帮助都将不胜感激。谢谢。

自从Vista以来,服务被隔离并在会话0(非交互式会话)中运行。交互进程在不同的会话中运行,从第一个登录用户的会话1开始

这意味着您不能使用服务来显示UI。根据设计,对ShowMessage的调用在服务中无法工作


您需要找到其他方法来调试服务。例如,将消息记录到文本文件。或者OutputDebugString和类似SysInternals DebugView的查看器,该查看器能够从不同会话捕获这些调试字符串

不算吗?或者它没有显示消息?对于后者,请将OutputDebugString与DebugView或类似工具一起使用,或写入文件或搜索service desktop interaction vista…如果您在XP或W2000上运行它,则必须设置interactive标志以启用来自服务的ShowMessage。在Vista和更高版本上,您不能像David在回答中所说的那样使用交互式服务。我使用的是Windows 7。虽然您所说的通常是正确的,但在您只想显示服务弹出消息框的特定情况下,您可以使用带有MB_service_通知标志的MessageBox,或WTSSendMessage。MSDN上记录了这一点:该文档称Vista和更高版本不支持MB_服务_通知。是的,您可以使用WTSSendMessage,但这对于调试来说是一个可怕的选择,这就是askers消息框的全部内容。事实上,文档本身并没有这样说,但用户对文档的评论确实如此。然而,WTSSendMessage自Win2000以来就已经存在,所以如果您需要支持Vista之前的系统,您可以动态加载WTSSendMessage,如果不可用,则返回MessageBox。但不管怎样,我并不是建议使用消息框来调试服务,我只是说它通常是一个可用的选项。@Remy实际上文档中确实这么说。但是我想你提到的MessageBox文档大概忽略了这一点。呵呵。我在发布之前看过了那个页面。它没有明确指出Vista和更高版本不支持MB_服务_通知。它所做的只是省略MessageBox本身作为这些版本的建议。这与不受支持不是一回事。当别人对细节不感兴趣时,你喜欢吹毛求疵。你也需要注意自己的细节。