worki2k1
Erfahrenes Mitglied
Hallo Leute,
ich schreibe gerade an einem kleinen Tool, womit ich Dienste (genauer Apache und MySQL) vom Tray aus steuern kann. Diverse andere Tools möchte ich nicht verwenden weil ich spezielle Funktionen benötige. Das ist ja auch nicht das Problem an dieser Stelle. Alles funktioniert soweit sehr gut. Ich kann die Dienste starten und teilweise auch beenden. Ich poste dazu mal die Funktion zum beenden eines Dienstes:
Die Funktion wird also aufgerufen und der Name des Computers und des Dienstes übergeben. Das erste Parameter bleibt leer damit es der lokale Rechner ist.
Mein genaues Problem besteht nun darin:
Wenn ich das ganze für den Apache aufrufe, also der Dienstname ist "Apache", dann funktioniert alles super, wenn ich aber "MySql" angebe bleibt das Proggi in der Schleife stecken wo er den Status abfragt und erzeugt eine Endlosschleife. Der Dienstname "MySql" ist aber richtig, da ich ihn ja über diesen Namen auch starten kann.
Ich vermute fast, dass MySql beim beenden nicht die richtigen Statusmeldungen zurückgibt, wodurch mein Proggi damit nicht anfangen kann. Hat jemand noch eine andere Lösung um den Dienst zu beenden oder zufällig das gleiche Problem?
Wäre für Tipps schonmal sehr dankbar.
gruß
worka
ich schreibe gerade an einem kleinen Tool, womit ich Dienste (genauer Apache und MySQL) vom Tray aus steuern kann. Diverse andere Tools möchte ich nicht verwenden weil ich spezielle Funktionen benötige. Das ist ja auch nicht das Problem an dieser Stelle. Alles funktioniert soweit sehr gut. Ich kann die Dienste starten und teilweise auch beenden. Ich poste dazu mal die Funktion zum beenden eines Dienstes:
Code:
function ServiceStop(
sMachine,
sService : string ) : boolean;
var
schm, schs : SC_Handle;
ss : TServiceStatus;
dwChkP : DWord;
begin
// connect to the service
// control manager
schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT);
// if successful...
if(schm > 0)then
begin
// open a handle to
// the specified service
schs := OpenService(
schm,
PChar(sService),
SERVICE_STOP or SERVICE_QUERY_STATUS);
// if successful...
if(schs > 0)then
begin
if(ControlService(
schs,
SERVICE_CONTROL_STOP,
ss))then
begin
// check status
if(QueryServiceStatus(
schs,
ss))then
begin
while(SERVICE_STOPPED
<> ss.dwCurrentState)do
begin
//
// dwCheckPoint contains a
// value that the service
// increments periodically
// to report its progress
// during a lengthy
// operation.
//
// save current value
//
dwChkP := ss.dwCheckPoint;
//
// wait a bit before
// checking status again
//
// dwWaitHint is the
// estimated amount of time
// the calling program
// should wait before calling
// QueryServiceStatus() again
//
// idle events should be
// handled here...
//
Sleep(ss.dwWaitHint);
if(not QueryServiceStatus(
schs,
ss))then
begin
// couldn't check status
// break from the loop
break;
end;
if(ss.dwCheckPoint <
dwChkP)then
begin
// QueryServiceStatus
// didn't increment
// dwCheckPoint as it
// should have.
// avoid an infinite
// loop by breaking
break;
end;
end;
end;
end;
// close service handle
CloseServiceHandle(schs);
end;
// close service control
// manager handle
CloseServiceHandle(schm);
end;
// return TRUE if
// the service status is stopped
Result :=
SERVICE_STOPPED =
ss.dwCurrentState;
end;
Die Funktion wird also aufgerufen und der Name des Computers und des Dienstes übergeben. Das erste Parameter bleibt leer damit es der lokale Rechner ist.
Mein genaues Problem besteht nun darin:
Wenn ich das ganze für den Apache aufrufe, also der Dienstname ist "Apache", dann funktioniert alles super, wenn ich aber "MySql" angebe bleibt das Proggi in der Schleife stecken wo er den Status abfragt und erzeugt eine Endlosschleife. Der Dienstname "MySql" ist aber richtig, da ich ihn ja über diesen Namen auch starten kann.
Ich vermute fast, dass MySql beim beenden nicht die richtigen Statusmeldungen zurückgibt, wodurch mein Proggi damit nicht anfangen kann. Hat jemand noch eine andere Lösung um den Dienst zu beenden oder zufällig das gleiche Problem?
Wäre für Tipps schonmal sehr dankbar.
gruß
worka