Announcement

Collapse
No announcement yet.

Anderes Programm Terminieren?

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

  • Anderes Programm Terminieren?

    Hallo Leute folgendes Problem :
    Ich habe ein UpdateProgramm geschrieben das völlig Autag läuft.
    Dieses schaut nach welche der programme die Aktualisiert werden sollen
    noch laufen. Es Sendet dann das Beenden Signal an diese Programme. Sollten
    diese sich nicht in einem bestimmten Timeout beenden, sollen diese
    mit "TerminateProcess" beendet werden. Wie bekomme ich die Process-Handles
    meiner noch laufenden Programme raus ? Vorher einen Mutex oder Ähnliches Createn/Registrieren ?

    Hat einer von euch einen Lösungsvorschlag ?

    Danke im Vorraus
    Sascha

  • #2
    Hallo,

    wenn die anderen Anwendungen über <b>CreateProcess</b> gestartet werden, erhält man die Handles zum Nulltarif:
    <pre>
    var
    aSI : TStartupInfo; // Win32 : STARTUPINFO
    aPI : TProcessInformation; // Win32 : PROCESS_INFORMATION
    aProc : THandle; // Win32
    begin
    // Struktur initialisieren
    FillChar(aSI, SizeOf(aSI), 0);
    // Größe der Struktur in Byte eintragen
    aSI.cb := SizeOf(aSI);
    // ShowWindow-Konstante zuweisen
    aSI.dwFlags := STARTF_USESHOWWINDOW;
    aSI.wShowWindow := wShow;
    // neuen Prozess starten.
    Win32Check(CreateProcess(PChar(sApp), PChar(sParams), nil, nil,
    False, Normal_Priority_Class, nil, nil, aSI, aPI));
    // in TProcessInformation.hProcess liegt das Prozess-Handle bereit
    aProc := aPI.hProcess;
    ...
    </pre&gt

    Comment


    • #3
      Hallo Andreas,
      nein die Programme werden über AUTOSTART direkt mit Windows gestartet.
      das Update-Programm wird in einem Automatismus auf dem System gestartet. Das Update-Programm schickt and meine Anwendungen eine Windows-Message das diese sich doch bitte beenden sollen. Wenn das dann innerhalb eines Timeouts nicht geschieht, sollen die Anwendungs-Prozesse von dem Update-programm terminiert werden. Dies ist auch kein Problem, da der Rechner nach dem Update automatisch neu gebootet wird. Wie kommen ich nun an die Prozesshandles der anderen Anwendungen ? Ich hätte die möglichkeit das die programme sich mit ihrem handle beim start zentrale registrieren. Nur wie bekomme ich das Prozesshandle raus ?

      Gruß
      Sasch

      Comment


      • #4
        Hi Sascha.<br><br>
        Wenn es deine eigenen Programme sind, wozu dann der Aufwand? Ich meine, du hast sie selbst geschrieben und müsstet daher ihre Klassennamen kennen (oder ihre Formularnamen, etwa "TMeineForm", wenn du die VCL nutzt).<br><br>
        Wie wäre es, wenn du die Close-Message also direkt an diese Programme schickst?:

        <PRE>
        if(findwindow(pchar('TMeineForm'),nil) <> 0) then
        SendMessage(findwindow(pchar('TMeineForm'),nil),WM _CLOSE,0,0);
        </PRE>

        Wenn du natürlich für alle Programme den Formularnamen <b>TForm1</b> benutzt hast, dann hast du ein Problem. ;o)<br><br>
        Also bei mir klappt das Stoppen meiner Programme auf die Weise ganz wunderbar.<br><br>
        Gruß,<br>Mathias

        Comment


        • #5
          Hallo,

          das Problem ist nur, was ist wenn diese Programme gerade beschäftigt sind ? Was ist wenn... Ich möchte als letzte Instanz, nachdem ich alles probiert habe dieses Programm zu beenden, das Programm mit all seinen Thread Terminieren. Klar gebe ich vorher über eine Message-Queue bekannt das sich alle bitte beenden sollen. Aber was ist wenn...

          Gruß
          Sasch

          Comment

          Working...
          X