如何在RunTime或OnAfterInstall上启动Windows服务

时间:2013-08-19 22:31:57

标签: delphi windows-services

历史

我正在构建Windows Service作为Platform Application的一部分来处理更新和服务器功能,因此可以安装在与Client Application不同的机器上}已安装。它使用UDP发送和接收广播消息,使用TCP来处理更敏感和最重要的消息。

目的

我希望最终用户可以轻松安装我的应用程序,只需复制计算机中的可执行文件并执行它们即可。主应用程序应验证用户是否为管理员,创建配置文件,然后安装Windows服务并运行它,因此当非管理用户登录时,他们不会从我的应用程序收到有关管理权限的任何错误。目标是在不需要现有技术人员的情况下进行大多数配置,因为数据库将是远程的。

问题

我的服务正在使用命令MyService.exe /install正常安装,但它没有自动启动。启动它的唯一方法是继续Control Panel > Admin Tools > Services并手动完成。我尝试通过我的应用程序调用{​​{1}}但我在shell中收到net start MyService。我试用了服务的invalid service nameexecutable namedisplay name,但没有一个能够运作。这是我的TService的目标:

object name

问题

我应该怎么做才能通过代码而不是用户手来启动我的服务?如果我可以在我的客户端应用程序中执行此操作,或者在object ServiceMainController: TServiceMainController OldCreateOrder = False OnCreate = ServiceCreate DisplayName = 'PlatformUpdateService' Interactive = True AfterInstall = ServiceAfterInstall AfterUninstall = ServiceAfterUninstall OnShutdown = ServiceShutdown OnStart = ServiceStart OnStop = ServiceStop Height = 210 Width = 320 调用之后单独使用它,那将是最好的。

1 个答案:

答案 0 :(得分:6)

以下是StartService事件中的AfterInstall示例调用:

procedure TServiceMainController.ServiceAfterInstall(Sender: TService);
var
  Manager, Service: SC_HANDLE;
begin
  Manager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  Win32Check(Manager <> 0);
  try
    Service := OpenService(Manager, PChar(Name), SERVICE_ALL_ACCESS);
    Win32Check(Service <> 0);
    try
      Win32Check(StartService(Service, 0, PChar(nil^)));
    finally
      CloseServiceHandle(Service);
    end;
  finally
    CloseServiceHandle(Manager);
  end;
end;

但是我不确定它是否会对你有用,因为通常你也应该net start取得成功。