function MySteupService : Boolean;
var
ServiceBinaryPathName : String;
SCManager, SCService : SC_Handle;
ss : TServiceStatus;
//dwNumServiceArgs : DWORD;
lpServiceArgVectors: PChar;
lpBytesReturned : DWORD;
begin
Result:=False;
ss.dwCurrentState := 0;
SCManager := OpenSCManager(nil, // 电脑名。如果为NULL,则为本机
nil, // SCM数据库标识,应该为SERVICES_ACTIVE_DATABASE或者如果为NULL,则SEVICES_ACTIVE_DATABASE数据库作为默认数据库被打开。
SC_MANAGER_ALL_ACCESS); // 以何种权限打开
// 本函数返回一个SC_HANDLE的句柄以便作为其他函数的参数来操作SCM数据库。
SCService:=OpenService(SCManager, 'nxemc', SERVICE_ALL_ACCESS);
if SCService = 0 then // Service 不存在
begin
SCService := CreateService(SCManager, // 是OpenSCManager得到的返回值,即服务管理器的句柄。
'MyService', // Service的名字,这个Service的相应信息存放在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service\lpServiceName子键下;
'MyService', //Service在服务控制面板中显示的名字
SERVICE_ALL_ACCESS, // 访问Service的权限类型
SERVICE_WIN32, // Service的类型,可以是SERVICE_FILE_SYSTEM_DRIVER、SERVICE_KERNEL_DRIVER、SERVICE_WIN32_OWN_PROCESSS、SERVICE_WIN32_SHARE_PROCESS之一;
SERVICE_BOOT_START, // Service启动类型,可以是自动(SERVICE_ATUO_START)、手动(SERVICE_DEMAND_START)、禁止(SERVICE_DISABLED);
SERVICE_ERROR_IGNORE, // 出错控制,SERVICE_ERROR_IGNORE和SERVICE_ERROR_NORMAL表示出错时在日志中纪录并继续。两个参数的区别是SERVICE_ERROR_NORMAL将会在出错时向用户显示一条出错信息,SERVICE_ERROR_SERVER和SERVICE_ERROR_CRITICAL告诉系统在失败时重启;
Pchar(StrSystemDir + 'MyService.exe'), // 驱动的路径,也是服务的路径;
nil, // 如果这个服务是加载服务组中的一个,这个指针指向这者字符串数组,一般为NULL;
nil, // 指针,指向的变量,接收的值用於区别lpLoadOrderGroup服务组中的不同服务,一般为NULL;
nil, // 这个Service所依赖的其他服务,在启动本Service之前需要先启动这些服务;
nil, // 帐号
nil);
// 密码
ServiceBinaryPathName:=SysErrorMessage(GetLastError);// 到这里出错了, 说参数不正确
end
else
begin
ControlService(SCService, SERVICE_CONTROL_STOP, ss);
end;
//GetLastError
ServiceBinaryPathName:=SysErrorMessage(GetLastError);
QueryServiceStatus(SCService, SS);
if SS.dwCurrentState <> SERVICE_RUNNING then
begin
lpServiceArgVectors:=nil;
Result:=StartService(SCService, // Service的句柄;
0, // 指定在lpServiceArgVectors指向的数组中参数的个数,如果lpServiceArgVectors为NULL,这个值为0;
Pchar(lpServiceArgVectors)); // 指向传递给Service的参数字符串数组的指针,可以为NULL;
// Str:=SysErrorMessage(GetLastError);
end
else Result:=True;
//if not Result then Showmessage(Inttostr(GetLastError));
if SCService > 0 then
CloseServiceHandle(SCService);
if SCManager > 0 then
CloseServiceHandle(SCManager);
end;
不知什么参数导致不正确, 我这个只是一个简单的服务,只要求开机运行,不是驱动服务。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!