exe ausführen und processid bekommen
-
Hi!
Ist es möglich eine exe auszuführen und davon direkt die ProzessId zu bekommen? Mit dem Spy++ komm ich leider nicht drann, sonst würde ich es über FindWindow machen. Geht es überhaupt anders?
-
Schau dir mal CreateProcess() und seine Parameter an, vor allem die PROCESS_INFORMATION Struktur.
mfg
-
Hi!
Danke, das ist genau das, was ich gesucht hab. Hab mir die MSDN durchgelesen, allerdings will CreateProcess nicht wirklich funktionieren. Ich möchte den Windows Taschenrechner probeweise wartend ausführen und mit einem resume befehl "durchstarten" lassen. (Der resume befehl ist noch nicht im code also nicht wundern!)hier ein Schnippsel:
#include "stdafx.h" #include <windows.h> #include <string> int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { PROCESS_INFORMATION pi; STARTUPINFO si; BOOL bRet; bRet = CreateProcess("calc.exe", " ", NULL, NULL, NULL, CREATE_SUSPENDED, NULL, "C:\\Windows\\System32\\", &si, &pi); char buf[255]; itoa(GetLastError(),buf,10); MessageBox(0,buf,0,0); return 0; }Ich erhalte nach CreateProcess leider den Fehler 998 (Unzulässiger Zugriff auf einen Speicherbereich.) Ich weiß leider nicht woran das liegen kann, weiß jemand was?
-
wie wäre es wenn Du als 5. Paramter ein TRUE oder FALSE übergibst ?
wähle für den 6. Parameter einen sinvollen DWORD Wert.beste Grüße
RBPS: hast Du mal PHP programmiert ?
-
Ja ich habe mal PHP programmiert, aber nur kurz. Habe allerdings vorher schon in C++ programmiert. Ich glaube du willst darauf hinaus, ob ich mir den saumäßigen stil von PHP abgeschaut hab?
Der PHP interpreter ist nämlich ziemlich tollerant muss ich sagen.Ich habe jetzt etwa 3 Monate nichtmehr programmiert, deswegen steh ich im mom etwas auf dem Schlauch. FALSE und NULL dürften das selbe sein. Ich glaube beide sind mit einem #define als 0 definiert. Was meinst du mit Sinnvollen DWORD wert? CREATE_SUSPEND ist eine Kontante Zahl und zwar 4.
Trotz ändern von NULL zu FALSE gab es keine Besserung.
Ich hab schon in der MSDN rumgelesen aber ich finde einfach keine logische erklärung dafür, woran es zumindest liegen könnte. Gerade mit dem Fehler "zugriff auf einen ungültigen Speicherbereich" kann ich null anfangen. Die calc.exe wird ja nichtmal ausgefüht!?
-
Als zweiten Parameter darfst du kein Literal angeben, weil CreateProcess möglicherweise da reinschreibt. Was soll dieser String mit dem einzelnen Leerzeichen überhaupt?
-
Ich möchte keine Commandline übergeben. Ich dachte erst das es daran liegt, dem war aber nicht so deshalb die " " habe sie allerdings schon durch ein NULL ersetzt.
Ich habe jetzt herausgefunden wie es funktioniert. Ich habe einfach eine weitere Messagebox vor der Ausführung von CreateThread gemacht. Plötzlich kam nach CreateThread fehler 0, die calc.exe wurde gestartet. Nehm ich die Messagebox wieder weg kommt wieder der 998!? Häääää!?!?!?
Hier der Code:int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { char buf[255]; int error = 0; PROCESS_INFORMATION pi; STARTUPINFO si; itoa(GetLastError(),buf,10); // Komischerweise funktioniert CreateProcess MessageBox(0,buf,0,0); // Ohne diese beiden Zeilen nicht. CreateProcess("calc.exe", NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi); itoa(GetLastError(),buf,10); MessageBox(0,buf,0,0); ResumeThread(pi.hThread); //Hier kackt die calc.exe ab return 0; }Solche phänomene hatte ich aber schon öfters in c++. Wer mir jetzt erklären wie sowas zu stande kommt, der hat n Orden verdient.
-
Du solltest wohl vor dem Aufruf von CreateProcess si noch irgendwie initialisieren - z.B. mit ZeroMemory, oder so:
STARTUPINFO si = {0}; si.cb = sizeof(STARTUPINFO);
-
so ich habs wieder rausgefunden. Ich habe jetzt mal die arraygröße vom Buf char von 255 auf 32 geändert und zack funktionierts. Was hat das damit zu tun? Es scheint, als hätte das char array irgendwo was reingeschrieben wo es nichts reinschreiben darf. Durch das schreiben in die Buf variable durch atoi, scheint der Fehler durch die Nullterminierung durch verhindert worden zu sein.
-
danke flanders, das war des rätsels lösung! Ich wusste noch nicht, wie man ein klasse initialisiert. Jetzt funktionierts auch mit nem 255ger char.

-
hansdampf schrieb:
Ich wusste noch nicht, wie man ein klasse initialisiert.
Das ist eine Struktur

Allgemein kannst du dir merken, dass du zumindest bei Strukturen, die als Eingabe-Parameter verwendet werden alle Member irgendwie sinnvoll initialisieren solltest. Wenn du nichts spezielles setzen willst (aber eine Struktur angeben musst), dann setzt du eben alles auf 0. Damit du nicht jeden Member einzeln auf 0 setzen musst, kannst du das direkt bei der Deklaration mit = {0} tun - oder eben mit ZeroMemory. Wenn du eine Struktur (wie in diesem Fall) hast, die einen Member für die Größe hat, dann musst du diesen auch befüllen...
-
flenders schrieb:
hansdampf schrieb:
Ich wusste noch nicht, wie man ein klasse initialisiert.
Das ist eine Struktur

Ist eine Struktur nicht das Selbe wie eine Klasse, nur das standardmäßig private und public vertauscht sind?
Danke für die Hilfe, jetzt funktioniert alles, sogar die ResumeThread funktion.
