Process erstellen und wieder schließen (CreateProcess)
-
ähm und das heißt?
[...]
Nur wie zum Teufel bekomm ich eine ID mit der ich was anfangen kann (z.b. mit der ich später die waaagthtv.exe eindeutig identifizieren und schließen kann)?CreateProcess schreibt die Daten, die du suchst, in die Struktur:
PROCESS_INFORMATION pi;
Und zwar die Process ID (PID) in den Member
pi.dwProcessId
.
Siehe http://msdn.microsoft.com/en-us/library/ms684873(VS.85).aspxAber lass die beiden ZeroMemory's stehen!
Wenn Microsoft das so will, dann muß es eben sein, sonst könnte alles mögliche passieren.
Besonderssi.cb = sizeof(si);
sieht so aus, als ob sich CreateProcess darauf verlassen würde.
-
wenn ich allerdings auch ZeroMemory bei pi mache, ist der immer null. Irgendwie bekomm ich einfach keine gescheite id.
EDIT: irgendwie sind alle process_information attribute null
(nach CreateProcess).
-
Du musst aber schon auch aufpassen, was für Fehlermeldungen gemacht werden:
#include <windows.h> int main(int argc, char *argv[]) { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); if (!CreateProcess(NULL, "notepad.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi )) { printf("CreateProcess ging schief wegen Fehler Nr. %d", GetLastError()); // siehe http://msdn.microsoft.com/en-us/library/ms680582%28VS.85%29.aspx return 1; } printf("Alles ok, PID=%d\n", pi.dwProcessId); return 0; }
-
Und nicht vergessen die beiden Handles von PROCESS_INFORMATION wieder zu schliessen.
Simon
-
Genau...
Huh, das wird langsam kompliziert:
(siehe http://msdn.microsoft.com/en-us/library/ms682512(VS.85).aspx )// ... printf("Alles ok, PID=%d\n", pi.dwProcessId); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); return 0; }
-
hm, jetzt dachte ich mal daran, einen process nach einer bestimmten zeit wieder zu schließen.
also habe ich pi.hProcess in ein array geschrieben. ich habe jetzt mehrere processes erstellt und auch deren pi.hProcess ins array gehaut.Um später alles zu schließen wollte ich eine for schleife verwenden, die dann mit TerminateProcess(array[i], 0); alle wieder beendet.
Nur gibts jetzt einen int to HANDLER fehler.
Jemand eine ahnung wie ich die processes später wieder schließen kann?
-
Den Zugriff auf den laufenden Prozess kriegst du erst, wenn du dir ein HANDLE mit OpenProcess geholt hast.
(Kümmert sich um wichtige Dinge, wie ob du überhaupt das Recht dazu hast.)Es wäre aber wahrscheinlich klüger, dein Programm nicht die ganze Zeit laufen zu lassen, sondern nach dem Starten der gewünschten Prozesse einfach wieder zu beenden.
Prinzipiell kannst du Prozesse auch einfach mit
taskkill /pid:nnnn
versenken.
Die PID's kannst du dir ja in einer Datei aufheben oder zur Not auch mittasklist
herausfinden.
-
jop mit taskkill würde es klappen, nur würde ich es gerne mit openprocess machen, weil es mir irgendwie profesioneller und auch sicherer vorkommt, denn die wtvrecorder.exe muss erst einmal intialisieren und das dauert ein paar sekunden, erst dannach ist ein taskkill möglich (was allerdings soweit schon recht gut klappt).
Zu Openprocess: Ich benötige hier ein beisspiel (ich finde auf der microsoft site überhaupt nichts / bzw google).
-
das ganze gewurschtel mit bat-dateien sieht mir nach nem fehlkonzept aus.
seis drum. als einfachste lösung fällt mir da ein: wie wäre es mit einem eigenen thread pro batfile-aufruf, man muss ja nicht gleich mit kanonen auf spatzen schiesen?void start_bat( void *nix ) { system("batfile.bat"); } #include <process.h> int main() { int i; for (i=0; i<5; i++) if ( 0>_beginthread(start_bat,0,NULL)) break; if (i != 5) puts("Konnte nicht alle Threads starten!"); system("PAUSE"); return 0; }
-
konzept0r schrieb:
das ganze gewurschtel mit bat-dateien sieht mir nach nem fehlkonzept aus.
das mit der batch ist schon geschichte. habe das nur als beispiel datei geschrieben.
Nur möchte ich das jetzt unbedingt mit OpenProcess machen.
Folgende situation:
Ich habe eine program id (angenommen 45623) und möchte jetzt das zugehörige programm ohne system("taskkill /pid:45623") schließen.Wie mache ich das, wenn ich OHNE den createprocess anfange (also ich kein Process_information und startup_info habe)?
EDIT:
So geht das xD:HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processid); TerminateProcess(hProcess, 0);