Prozess abschießen klappt nicht!



  • Hi,
    bin mir nicht sicher, vielleicht muss ich auch in WinAPI! Also evtl. bitte verschiben!

    Nun zu meinem Problem:

    if (!TerminateProcess(temp->pi.hProcess, 0))
    	  MessageDlg("Fehler! Prozess konnte nicht beendet werden!", mtError, TMsgDlgButtons() << mbOK, 0);
     else
     {
    	CloseHandle(temp->pi.hProcess);
    	CloseHandle(temp->pi.hThread);
     }
    

    Dieser Code endet bei mir immer in der MsgBox!
    In temp->pi ist die Process_information Structur von CreateProzess! Warum funktioniert diese Anweisung also nicht?

    (die andere Anwendung bleibt offen!)

    Danke

    MFG

    PS: Bitte keine Diskussionen, ob das zu hart ist! Ich progge grade eine kleine IDE für Pascal! Und das ist für Programme die in einer Endlosschleife festhängen, also auf WM_CLOSE nicht reagieren!



  • GetLastError();
    lalala



  • TerminateProcess arbeite asynchron, das heißt es kehrt zurück, bevor der Prozess eventuell beendet ist.

    Hier mal etwas Delphi Code von mir, wie man es macjen könnte:

    procedure KillProcess(dwProcID: DWORD);
    var
      hProcess : Cardinal;
      dw       : DWORD;
    begin
      { open the process and store the process-handle }
      hProcess := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, dwProcID);
      { kill it }
      TerminateProcess(hProcess, 0);
      { TerminateProcess returns immediately, so wie have to verify the result via
        WaitForSingleObject }
      dw := WaitForSingleObject(hProcess, 5000);
      case dw of
        { everythings's all right, we killed the process }
        WAIT_OBJECT_0: Messagebox(Application.Handle, 'Prozess wurde beendet.', 'Prozess beenden',
          MB_ICONINFORMATION);
        { process could not be terminated after 5 seconds }
        WAIT_TIMEOUT:
        begin
          Messagebox(Application.Handle, 'Prozess konnte nicht innerhalb von 5 Sekunden beendet werden.',
            'Prozess beenden', MB_ICONSTOP);
          exit;
        end;
        { error in calling WaitForSingleObject }
        WAIT_FAILED:
        begin
          RaiseLastOSError;
          exit;
        end;
      end;
      { and refresh listbox contend }
      Form1.Button1Click(Form1);
    end;
    


  • MSDN schrieb:

    The handle must have the PROCESS_TERMINATE access right.

    CloseHandle(temp->pi.hProcess);
    CloseHandle(temp->pi.hThread);
    
    if(HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, temp->pi.dwProcessId)) {
     TerminateProcess(hProcess,0);
     CloseHandle(hProcess); 
    }
    


  • Hi,
    danke erstmal!

    Nur noch ein Probelm! Nach CreateProcess ist die ProcessID 0??! Was soll ich da machen? Auch im Taskmanager wird keine PID angezeigt!

    Danke

    Alexander Sulfrian



  • Hi,
    nochwas:
    Wenn ich die Datei über die Console ausführe (also mit z.B. cmd /cdatei.exe), erhalte ich eine ProcessID! Nur die ist dann von der Console!

    Wenn ich die jetzt abschieße, läuft das eigentliche Programm weiter!

    Wenn ich allerdings die ProcessID vor dem abschießen auf den Wert des eigentlichen Programms (hat jetzt auch eine) setze, klappt alles wunderbar!

    Wie bekomme ich nun die ProcessID vom eigentlichen Programm?

    Danke

    Alexander Sulfrian



  • CreateToolHelp32SnapShot und such dir dein Programm raus.


Anmelden zum Antworten