历史
我正在构建Windows Service
作为Platform Application
的一部分来处理更新和服务器功能,因此可以安装在与Client Application
不同的机器上}已安装。它使用UDP发送和接收广播消息,使用TCP来处理更敏感和最重要的消息。
目的
我希望最终用户可以轻松安装我的应用程序,只需复制计算机中的可执行文件并执行它们即可。主应用程序应验证用户是否为管理员,创建配置文件,然后安装Windows服务并运行它,因此当非管理用户登录时,他们不会从我的应用程序收到有关管理权限的任何错误。目标是在不需要现有技术人员的情况下进行大多数配置,因为数据库将是远程的。
问题
我的服务正在使用命令MyService.exe /install
正常安装,但它没有自动启动。启动它的唯一方法是继续Control Panel > Admin Tools > Services
并手动完成。我尝试通过我的应用程序调用{{1}}但我在shell中收到net start MyService
。我试用了服务的invalid service name
,executable name
和display 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
调用之后单独使用它,那将是最好的。
答案 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
取得成功。