Announcement

Collapse
No announcement yet.

Dienst zuverlässig beenden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Dienst zuverlässig beenden

    Von einem Vorgänger habe ich ein in Delphi geschriebenes Installations-Programm geerbt. (Bitte jetzt nicht über Sinn oder Unsinn dieses Programmes diskutieren, wo's doch soviele Install-Programme gibt. Es ist nun mal so.)

    Das Programm, das installiert wird, braucht OpenStep. Während der Installation wird der OpenStep-Installer aufgerufen. Genauso bei der Deinstallation wird der OpenStep-Deinstaller aufgerufen. Leider arbeitet dieses Teil sehr schlampig. Läßt Einträge in der Registry zurück, etc. Das schlimmste ist jedoch, dass es zwei Dienste nämlich machd.exe und nmserver.exe nicht beendet. Die Dienste werden automatisch beim Systemstart gestartet. Leider laufen sie auch noch nachdem der OpenStep-Deinstaller beendet ist. Der läßt dann ein Verzeichnis namens NeXT zurück. Dieses Verzeichnis wird weitgehends geleert aber nicht gelöscht.

    Und genau dieses Verzeichnis möchte ich jetzt mit meinem Deinstaller löschen. Die noch laufenden Prozesse, die aus diesem Verzeichnis gestartet werden, lassen dies aber nicht zu, bzw. Windows läßt das nicht zu.

    Wie kille ich diese Prozesse/Dienste zuverlässig unter XP/Win2000/NT.

    Was nur selten funktioniert ist:

    WinExecAndWait32('net stop "NeXT Netname Server"', SW_HIDE);
    WinExecAndWait32('net stop "NeXT Mach Daemon"', SW_HIDE);

    Oder wie kann ich Windows sagen, dass es unter allen Umständen dieses Verzeichnis nun löschen, auch wenn weiß der Kuckuck wer noch drauf sitzt.

    Gruß

    Wolfgang

  • #2
    > Von einem Vorgänger habe ich ein in Delphi geschriebenes Installations-Programm geerbt.

    Wieso Unsinn? Wir sind froh das wir uns nicht auf Installshield verlassen haben und was eigenes Implementiert haben was sicher ohne BS-Updates auch auf älteren BS-Versionen läuft.

    > Wie kille ich diese Prozesse/Dienste zuverlässig unter XP/Win2000/NT.

    Such mal bei der <a href="http://www.delphipraxis.net/search.php">Delphi-Praxis</a> nach "Dienst beenden". Dort gibt es einigen Beispielcode zur verwendung des Dienstemanager

    Comment


    • #3
      Moin Wolfgang,

      Wenn Du bei der Deinstallation admin-Rechte hast, sollte es in etwa so funktionieren.

      uses Windows, WinSvc;
      var iSCM, iSrvHdl: SC_HANDLE; pServiceStatus : TServiceStatus;
      iSCM := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
      iSrvHdl := OpenService(iSCN, PChar(sServiceName), SERVICE_ALL_ACCESS);
      FillChar(pServiceStatus , SizeOf(TServiceStatus), 0);
      QueryServiceStatus(iSrvHdl, pServiceStatus );
      if (pServiceStatus.dwServiceType <> 0) then begin
      if ((pServiceStatus.dwCurrentState <> SERVICE_STOPPED) and
      (pServiceStatus.dwCurrentState <> SERVICE_STOP_PENDING)) then
      begin
      ControlService(iSrvHdl, SERVICE_CONTROL_STOP, ServiceStatus);
      end;
      Hinterher CloseServiceHandle nicht vergessen ...

      Gruß,

      Geer

      Comment

      Working...
      X