El argumento lpServiceArgVectors no es mas que un array de PChar. Así que no tenemos mas que declarar un array y pasarlo como parámetro. Para esto supongo que podremos declarar un array fijo, uno dinámico, o por las malas utilizando punteros
Esta es la función que aparece en los trucos, pero modificada para admitir parámetros:
Código Delphi
[-]
procedure StartSrv(Nombre: String; Params: TStringList);
var
ServiceControlManager: SC_HANDLE;
Service: SC_HANDLE;
ServiceStatus: SERVICE_STATUS;
Argv, P: ^PChar;
i: integer;
begin
ServiceControlManager:= OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
if ServiceControlManager <> 0 then
begin
Service:= OpenService(ServiceControlManager,PChar(Nombre),
SERVICE_QUERY_STATUS or SERVICE_START);
if Service <> 0 then
begin
if QueryServiceStatus(Service, ServiceStatus) then
begin
if ServiceStatus.dwCurrentState <> SERVICE_RUNNING then
begin
if (Params <> nil) and (Params.Count > 0) then
begin
GetMem(Argv,Params.Count * Sizeof(PChar));
try
P:= Argv;
for i:= 0 to Params.Count - 1 do
begin
P^:= PChar(Params[i]);
inc(P);
end;
StartService(Service,Params.Count,Argv^);
finally
FreeMem(Argv);
end;
end else
begin
Argv:= nil;
StartService(Service,0,Argv^);
end;
end;
end;
CloseServiceHandle(Service);
end;
CloseServiceHandle(ServiceControlManager);
end;
end;
var
Params: TStringList;
begin
Params:= TStringList.Create;
try
Params.Add('Uno');
Params.Add('Dos');
Params.Add('Tres');
StartSrv('Service1',Params);
finally
Params.Free;
end;
end;
Ahora si alguien se anima, que lo implemente con arrays dinámicos