DelphiTurk KodBank tan bulduğum ve çok işime yarayan 2 fonksiyonu paylaşmak istedim.
Kod: Tümünü seç
USES ShellApi, WinSvc;
//Servisi Başlatır
function StartNTService(const ServiceName: string): Boolean;
var
SCM: SC_HANDLE;
ServiceHandle: SC_HANDLE;
Res: Boolean;
Temp: PChar;
Status: SERVICE_STATUS;
Err: Integer;
begin
Result := False;
SCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCM = 0 then
raise Exception.Create('Servis Kontrol Yöneticisi açılamadı. Hata: ' + SysErrorMessage(getLastError));
ServiceHandle := OpenService(SCM, PChar(ServiceName), SERVICE_ALL_ACCESS);
if ServiceHandle = 0 then
begin
CloseServiceHandle(SCM);
raise Exception.Create(ServiceName + ' isimli servis açılamadı. Hata: ' + SysErrorMessage(getLastError));
end;
Res := StartService(ServiceHandle, 0, Temp);
if Res then
begin
Res := QueryServiceStatus(ServiceHandle, Status);
while (Res) do
begin
if Status.dwCurrentState = SERVICE_RUNNING then
begin
Result := True;
Break;
end else if Status.dwCurrentState = SERVICE_STOPPED then
begin
Result := False;
Break;
end;
QueryServiceStatus(ServiceHandle, Status);
end;
end else begin
Err := GetLastError;
if Err <> ERROR_SERVICE_ALREADY_RUNNING then
raise Exception.Create(ServiceName + ' isimli servis başlatılamadı. Hata:' + SysErrorMessage(Err));
end;
CloseServiceHandle(SCM);
if not Result then
raise Exception.Create(ServiceName + ' isimli servis başlatılamadı');
end;
// Servisi durdurur
function StopNTService(const ServiceName: string): Boolean;
var
SCM: SC_HANDLE;
ServiceHandle: SC_HANDLE;
Res: Boolean;
Status: SERVICE_STATUS;
begin
Result := False;
SCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCM = 0 then
raise Exception.Create('Servis Kontrol Yöneticisi açılamadı');
ServiceHandle := OpenService(SCM, PChar(ServiceName), SERVICE_ALL_ACCESS);
if ServiceHandle = 0 then
begin
CloseServiceHandle(SCM);
raise Exception.Create(ServiceName + ' isimli servis açılamadı. Hata: ' + SysErrorMessage(getLastError));
end;
Res := ControlService(ServiceHandle, SERVICE_CONTROL_STOP, Status);
if not Res then
begin
if GetLastError <> ERROR_SERVICE_NOT_ACTIVE then
raise Exception.Create('Servis durdurulamadı');
end else Result := True;
end;
İyi çalışmalar.