![]() |
aufhängen nach dienstbeendigung
hallo
ich habe bei euch die funktionen für die windows dienste gefunden und bei mir im programm ausprobiert. ich experimentier grad rum: es gibt 4 buttons und ein memo. 2 buttons starten jeweils Apache/MySql (und gibt den status aus) und die anderen beiden sollen die beiden wieder beenden (und status ausgeben) mein problem ist: das programm hängt nach jedem button klick. und zwar sehr lange. und nach dem beenden von mysql reagiert das programm absolut nicht mehr zum zweck des ganzen: ich habe eine lokale datenbank-applikation die mit mozillas prism läuft. ich möchte nun ein programm bauen, das überprüft, ob apache/mysql laufen (falls nicht: sie startet), danach prism startet und wenn prism beendet wird, apache/mysql wieder killt (und sich selbst zwischendurch in den tray minimiert). ich weiß, dass das ganze mit batch schneller geht, aber ich will keine nervigen terminal fenster rumschwirren haben und meiner app einen schönen icon verpassen ;)
Delphi-Quellcode:
*sorry für den stil - es ist ziemlich schnell hingefrickelt*
////////////////////////////////////////////////////////////////////////////////
// Procedure : ServiceGetStatus // Comment : Author: DieHardMan function ServiceGetStatus(sMachine, sService: PChar): DWORD; {******************************************} {*** Parameters: ***} {*** sService: specifies the name of the service to open {*** sMachine: specifies the name of the target computer {*** ***} {*** Return Values: ***} {*** -1 = Error opening service ***} {*** 1 = SERVICE_STOPPED ***} {*** 2 = SERVICE_START_PENDING ***} {*** 3 = SERVICE_STOP_PENDING ***} {*** 4 = SERVICE_RUNNING ***} {*** 5 = SERVICE_CONTINUE_PENDING ***} {*** 6 = SERVICE_PAUSE_PENDING ***} {*** 7 = SERVICE_PAUSED ***} {******************************************} var SCManHandle, SvcHandle: SC_Handle; SS: TServiceStatus; dwStat: DWORD; begin dwStat := 0; // Open service manager handle. SCManHandle := OpenSCManager(sMachine, nil, SC_MANAGER_CONNECT); if (SCManHandle > 0) then begin SvcHandle := OpenService(SCManHandle, sService, SERVICE_QUERY_STATUS); // if Service installed if (SvcHandle > 0) then begin // SS structure holds the service status (TServiceStatus); if (QueryServiceStatus(SvcHandle, SS)) then dwStat := ss.dwCurrentState; CloseServiceHandle(SvcHandle); end; CloseServiceHandle(SCManHandle); end; Result := dwStat; end; /////////////////////////////////////////////////////////////////////////////// function ServiceRunning(sMachine, sService: PChar): Boolean; begin Result := SERVICE_RUNNING = ServiceGetStatus(sMachine, sService); end; function ServiceStart(Machine, ServiceName: string): Boolean; // Machine is UNC path or local machine if empty var h_manager, h_svc: SC_Handle; ServiceStatus: TServiceStatus; dwCheckPoint: DWORD; ServiceArgVectors: PChar; begin h_manager := OpenSCManager(PChar(Machine), nil, SC_MANAGER_CONNECT); if h_manager > 0 then begin h_svc := OpenService(h_manager, PChar(ServiceName), SERVICE_START or SERVICE_QUERY_STATUS or SC_MANAGER_ALL_ACCESS); if h_svc > 0 then begin if (StartService(h_svc, 0, ServiceArgVectors)) then { succeeded } begin if (QueryServiceStatus(h_svc, ServiceStatus)) then begin while (SERVICE_RUNNING <> ServiceStatus.dwCurrentState) do begin dwCheckPoint := ServiceStatus.dwCheckPoint; Sleep(ServiceStatus.dwWaitHint); if (not QueryServiceStatus(h_svc, ServiceStatus)) then // couldn't check status break; if (ServiceStatus.dwCheckPoint < dwCheckPoint) then break; end; end; end; CloseServiceHandle(h_svc); end; CloseServiceHandle(h_manager); end; Result := (SERVICE_RUNNING = ServiceStatus.dwCurrentState); end; //////////////////////////////////////////////////////////////////////////////// function ServiceStop(Machine, ServiceName: string): Boolean; // Machine is UNC path or local machine if empty var h_manager, h_svc: SC_Handle; ServiceStatus: TServiceStatus; dwCheckPoint: DWORD; begin h_manager := OpenSCManager(PChar(Machine), nil, SC_MANAGER_CONNECT); if h_manager > 0 then begin h_svc := OpenService(h_manager, PChar(ServiceName), SERVICE_STOP or SERVICE_QUERY_STATUS); if h_svc > 0 then begin if (ControlService(h_svc, SERVICE_CONTROL_STOP, ServiceStatus)) then begin if (QueryServiceStatus(h_svc, ServiceStatus)) then begin while (SERVICE_STOPPED <> ServiceStatus.dwCurrentState) do begin dwCheckPoint := ServiceStatus.dwCheckPoint; Sleep(ServiceStatus.dwWaitHint); if (not QueryServiceStatus(h_svc, ServiceStatus)) then // couldn't check status break; if (ServiceStatus.dwCheckPoint < dwCheckPoint) then break; end; end; end; CloseServiceHandle(h_svc); end; CloseServiceHandle(h_manager); end; Result := (SERVICE_STOPPED = ServiceStatus.dwCurrentState); end; //////////////////////////////////////////////////////////////////////////////// procedure TForm1.Button1Click(Sender: TObject); begin ServiceStart('','Apache2.2'); if (ServiceRunning('','Apache2.2')) = true then Memo1.Lines.add ('a ok') else memo1.Lines.add ('a not'); end; procedure TForm1.Button2Click(Sender: TObject); begin ServiceStart('','mysql'); if (ServiceRunning('','mysql')) = true then Memo1.Lines.add ('m ok') else Memo1.Lines.add ('m not'); end; procedure TForm1.Button5Click(Sender: TObject); begin ServiceStop('','Apache2.2'); if (ServiceRunning('','Apache2.2')) = true then Memo1.Lines.add ('a not tot') else memo1.Lines.add ('a tot'); end; procedure TForm1.Button6Click(Sender: TObject); begin ServiceStop('','mysql'); sleep(50); if (ServiceRunning('','mysql')) = true then Memo1.Lines.add ('m not tot') else Memo1.Lines.add ('m tot'); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz