Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hi!

Hab wieder mal ein Problem:

Wie kann ich einen Prozess (beliebige *.exe) den ich mit CreateProcess() erzeugt hab,

nach bestimmter Zeit killen? (z.B. 1 Minute)

und die verbleibende zeit (bis dieser prozess halt gekillt wird) in einem Textfeld anzeigen??

Hoffentlich könnt ihr mir da helfen!

(ich verwende Visual C++ 6.0 und Programm ist eine dialogfeldbasierende MFC-Anwendung)

Gruß

A.Z.R.A.E.L.

Ich würde einen Timerthread starten, der 1. das Counterfeld updated und am Ende mit ExitProcess() das Programm abschießt oder von mir aus WM_CLOSE ans Prozessfenster schickt.

hi!

das mit dem timer hab ich jetzt schon hinbekommen, nur ich kenn den neuen Prozess nicht killen!


STARTUPINFO sinfo;

PROCESS_INFORMATION pinfo;


ZeroMemory( &sinfo, sizeof(sinfo) );            //keine Ahnung

sinfo.cb = sizeof(sinfo);                               //was diese 3 Zeilen

ZeroMemory( &pinfo, sizeof(pinfo) );           //bedeuten... (Aus Doku abgeguckt...)


if(!CreateProcess(m_SWZielort, NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &sinfo, &pinfo)) 

{

       return;

}


Sleep(1000);


TerminateThread(&pinfo.hThread, GetExitCodeThread(&pinfo.hThread, &pinfo.dwThreadId));

//oder:

TerminateProcess(&pinfo.hProcess, GetExitCodeProcess(&pinfo.hProcess, pinfo.dwProcessId));

//hab beides schon (erfolglos) ausprobiert!

TerminateProcess liefert leider False!

GetLastError 0!

Gibt es Prozesse die ich aufrufe und nicht killen kann????

Original geschrieben von A.Z.R.A.E.L.

TerminateProcess liefert leider False!

GetLastError 0!

Du übergibst bei TerminateProcess die Adresse des Prozess-Handles. Da muss aber das Handle selbst hin:

TerminateProcess(pinfo.hProcess, 0); // ohne &

GetLastError sollte eigentlich 6 (ERROR_INVALID_HANDLE) zurückgeben. Vermutlich hast Du es an der falschen Stelle aufgerufen. Der Aufruf von GetExitCodeProcess an dieser Stelle ist übrigens sinnlos.

Klotzkopp hat Recht, du mußt das ohne "&" schreiben.

Allerdings mußt du trotzdem den Exitcode übergeben, aber in der Funktion

GetExitCodeProcess auch ohne "&".

Also so:


DWORD dwExitCode;
GetExitCodeProcess(pinfo.hProcess,dwExitCode); //Funktion gibt bool Wert zurück!!!!
//Deshalb nicht in TerminateProcess aufrufen.
TerminateProcess(pinfo.hProcess, dwExitCode);
[/PHP]

Das sollte eigentlich funktionieren, trotzdem

wäre die Funktion [i]ExitProcess[/i] eher empfelenswert wenn der Process

ohne Fehler beendet wird.

Gruß

wasweißich

Original geschrieben von wasweißich


DWORD dwExitCode;
GetExitCodeProcess(pinfo.hProcess,dwExitCode); //Funktion gibt bool Wert zurück!!!!
//Deshalb nicht in TerminateProcess aufrufen.
TerminateProcess(pinfo.hProcess, dwExitCode);
[/PHP]

Das ist, wie ich bereits sagte, Unsinn. Mit GetExitCodeProcess kann man, [b]nachdem[/b] ein Prozess terminiert ist, dessen Exit-Code abfragen. Vorher wird da nur STILL_ACTIVE herauskommen. Den tatsächlichen Exit-Code setzt man erst durch den Aufruf von TerminateProcess.

[b]Das sollte eigentlich funktionieren, trotzdem

wäre die Funktion [i]ExitProcess[/i] eher empfelenswert wenn der Process

ohne Fehler beendet wird.[/b]

Auch das ist in diesem Fall Unsinn, weil man mit ExitProcess nur den "eigenen" Prozess beenden kann, keine anderen.

Mit dem Exitcode hast du recht Klotzkopp ich hab das nochmal genau nachgelesen.

Aber das ist egal es klappt auch so, habs nämlich immer so gemacht:D

Zu ExitProcess:

Der Process wurde doch von dem Programm erstellt, also müßte er doch

auch so beendet werden können.

Ich will mich nicht festlegen, ich will nur sagen das ich bisher jeden Process oder Thread

den ich aufgerufen habe mit der Exit anstatt der Terminate Funktion beendet habe und meine

mich erinnern zu können das es einmal mit TerminateProcess nicht geklappt hat, dafür aber

mit ExitProcess.

Gruß

wasweißich

Original geschrieben von wasweißich

Mit dem Exitcode hast du recht Klotzkopp ich hab das nochmal genau nachgelesen.

Aber das ist egal es klappt auch so, habs nämlich immer so gemacht:D

Habe nie bestritten, dass es nicht klappt. :D

Zu ExitProcess:

Der Process wurde doch von dem Programm erstellt, also müßte er doch

auch so beendet werden können.

Ich will mich nicht festlegen, ich will nur sagen das ich bisher jeden Process oder Thread

den ich aufgerufen habe mit der Exit anstatt der Terminate Funktion beendet habe und meine

mich erinnern zu können das es einmal mit TerminateProcess nicht geklappt hat, dafür aber

mit ExitProcess.

Deine Erinnerung in allen Ehren, aber wie willst Du bei ExitProcess angegeben haben, welcher Prozess beendet werden sollte? ;)

@wasweißich: habs grad mit ExitProcess versucht... aber da schieß ich grad den Prozess vom Hauptprogramm ab und der neue Prozesse "lebt" weiter!

Hast du vielleicht einen funktionierenden Beispielcode?

@Crush: willst du damit sagen das mir das BS(ich hab Win2K) verbietet den Prozess zu killen den ICH erstellt hab??

hab mir den Quellcode noch nicht ganz durchgelesen, aber sieht so aus als wäre das ziemlich viel aufwand, wenn man nur einen prozess beenden will!

@all: DAS MUSS DOCH IRGENDWIE LEICHTER GEHEN, ODER?????

@Klotzkopp: Es klappt!! Sorry, hatte das wohl überlesen....

Hab mich nämlich immer auf das ExitProcess und auf CloseHandle konzentriert!

nochmals thx!

Problem gelöst!

:D :D :D

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.