# Programme beenden



## Konstantin (2. Dezember 2003)

Ich hab da folgendes Problem!

Wie kann man ein Programm beenden, welches man vorher mit ShellExecute gestartet hat?

Ich muss es mit ShellExecute starten, weil ich das Programm mit dem Hauptprogramm schließen will(Muss)!

Hat da jemand eine Idee?

Konstantin

Ich hab mein Programm einfach mal angehängt


----------



## chibisuke (2. Dezember 2003)

1.) Wenn du ShellExecute benutzt um ein programm zu starten kannst du es nicht einfach so wieder beenden.  Da du keinen handle für das programm bekommst, das HINSTANCE ist nur für rückwertskompatiblität da hatt aber keinen wirklichen nutzen mehr in Win32 programmen.
Starte das programm besser mit CreateProcess, und übergib als letzten parameter einen pointer auf eine variable mit dem typ dieser struktur.
Dadurch bekommst du informationen über den prozess.

```
typedef struct _PROCESS_INFORMATION { // pi 
    HANDLE hProcess; 
    HANDLE hThread; 
    DWORD dwProcessId; 
    DWORD dwThreadId; 
} PROCESS_INFORMATION;
```

2.) Um das programm zu beenden musst du die notwendigen berechtigungen anfordern und dann den prozess Terminieren.

```
HANDLE OpenProcess(
  DWORD dwDesiredAccess,  // access flag
  BOOL bInheritHandle,    // handle inheritance flag
  DWORD dwProcessId       // process identifier
);
```
dwDesiredAccess = PROCESS_TERMINATE
und die Prozess ID die bekommst du aus der struktur von oben.
Zurück bekommst du den Handle für den prozess, und nun hast du die berechtigungen die du brauchst..
beenden tust du den prozess indem du 

```
BOOL TerminateProcess(
  HANDLE hProcess, // handle to the process
  UINT uExitCode   // exit code for the process
);
```
auifrufst

Achtung: der prozess hatt keine möglichkeit noch irgendwie daten zu speicher oder ähnliches nachdem dieses komando ausgeführt wurde!
Aber das ist die einzige form die algemein gültig ist...

Alternativ kannst du dir bei einem fenster pasiertem prozess auch erlauben die ID des hauptfenster zu bestimmen entsprechend prozess rechte zu hohlen und dann ein WM_DESTROY senden.. aber wie gesagt, funktioniert nur bei Windows Programme die fenster offen haben


----------



## BadMourning (2. Dezember 2003)

Es gibt auch eine andere Möglichkeit.

Nimm statt ShellExecute ShellExecuteEx.

Wenn du in SHELLEXECUTE_INFO
bei Mask das Flag SEE_MASK_NOCLOSEPROCESS
setzt, dann erhältst in dwProcessId die
Prozess-ID mit der du dann, wie von chibisuke beschrieben,
TerminateProcess rufen kannst...

Greets, BadMourning


----------



## Konstantin (3. Dezember 2003)

Die Funktion ShellExecuteEx kennt mein compiler nicht! Oder muss ich da eine bestimmte Header Datei includieren.

MfG Konstantin


----------



## Konstantin (3. Dezember 2003)

Hab grad was gefunden zu ShellExecuteEx. 

was meinst du mit dwProcessld?  Wie wendet man das an?


----------



## chibisuke (3. Dezember 2003)

1.) Doppelposts sind gar nicht gern gesehen

2.)
ShellExecuteEx is dafür ungeeignet, du benötigst das dwProcessID nicht das hProcess.. denn der prozesshandle den ShellExecuteEx zurückgibt ist NICHT berechtigt den prozess zu beenden, zumindest éntnehm ich das so der MSDN

3.) dwProcessID ist die Numerische ID eines prozesses, die du in einem prviligierten Handle für den prozess umwandeln must, mit dem kannst du das programm beenden

beispiel: 


```
PROCESS_INFORMATION ProcInfo; //struktur zum empfangen der prozess-daten
HANDLE hProc; //Temporaervariable zum speichern des Prozess Handles
CreateProcess("myapp.exe", "comandlineparameter", NULL, NULL, false, 0, NULL, NULL, NULL,  &ProcInfo); //Prozess starten
hProc = OpenProcess(PROCESS_TERMINATE, false, ProcInfo.dwProcessId); //Handle des Prozesses aus der ProzessID abfragen und berechtigungen anfordern
TerminateProcess(hProc, -1); //Prozess mit rückgabecode -1 abschießen.
```


----------

