1

历史

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

客观的

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

问题

我的服务正在使用该命令正常安装,MyService.exe /install但它没有自动启动。启动它的唯一方法是继续Control Panel > Admin Tools > Services手动操作。我试图通过我的应用程序调用,但我在 shell 中net start MyService收到。invalid service name我尝试了服务的executable name, thedisplay name和 the object name,但没​​有一个起作用。这是我的 TService 的对象:

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 

问题

我应该怎么做才能通过代码而不是用户手来启动我的服务?如果我可以在我的客户端应用程序中执行此操作,或者在OnServiceAfterInstall调用后自行执行,那将是最好的。

4

1 回答 1

7

这是一个示例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

于 2013-08-20T00:29:05.210 回答