Anwendung starten und beenden

AckiB

Mitglied
Hallo,
ich habe eine Funktion geschrieben, mit der eine beliebige Datei mit dem assoziierten Programm angezeigt/abgespielt werden kann...
Code:
// global
SHELLEXECUTEINFO sei;

void openFile(char* f){
  //  HINSTANCE ProcessId = ShellExecute(NULL, "Open", f, NULL, NULL, SW_SHOWMINNOACTIVE);

  sei.cbSize = sizeof(SHELLEXECUTEINFO);
  sei.fMask = SEE_MASK_NOCLOSEPROCESS;
  sei.hwnd = NULL;
  sei.lpVerb = "Open";
  sei.lpFile  = f;
  sei.lpParameters = "";
  sei.lpDirectory = "";
  sei.nShow = SW_SHOWMINNOACTIVE;
  ShellExecuteEx(&sei);
}
OK, das funktioniert...
Ich möchte das gestartete Programm aber auch wieder beenden können...
Ich habe im Forum gesucht und diesen Thread gefunden:
http://www.tutorials.de/forum/c-c/139174-programme-beenden.html
aber leider funktioniert das nicht, denn da ich nicht weiß welches Programm gestartet wurde habe ich weder die Fenster-Caption noch seine Klasse, also kann ich nicht mit findWindow(...) danach suchen...
und da ich nicht weiß welches Programm gestartet wurde funktioniert das auch nicht mit CreateProcess(...), usw...

hat jemand eine Idee, wie ich das machen könnte ?

danke, Acki
 
danke, für deine Antwort :)
das habe ich mir auch schon gedacht und wird auch in dem Thread erwähnt...
Code:
  HANDLE ProcessId_Exit = OpenProcess(PROCESS_TERMINATE, 0, (DWORD)sei.hProcess);
  TerminateProcess(ProcessId_Exit, 1);
  CloseHandle(ProcessId_Exit);
aber leider geht das wohl nicht (wird in dem Thread auch erwähnt), da sei.hProcess vom Typ HANDLE ist und OpenProcess(...) benötigt aber dwProcessId vom Typ DWORD...

oder kann ich über diesen HANDLE die ProcessId ermitteln, und welche Flags muss ich setzten ?

MSDN habe ich gestern bis zum Erbrechen durchsucht und alles mögliche versucht, darum frage ich hier als letzte Rettung... ;)
 
Du brauchst OpenProcess gar nicht mehr.

OpenProcess brauchst du, wenn du eine Process-Id hast und ein Handle für den Prozess haben willst.

hProcess ist aber schon das Handle. Kannst du direkt für TerminateProcess u.a. benutzen.

Aber nicht die Flags vergessen zu setzen.. Und nicht dass hProcess nur gesetzt wird, wenn wirklich ein neuer Prozess gestartet wird..
 
Ahh, jetzt wo Du es sagst, vielen Dank :)

allerdings bin ich mir immer noch nicht sicher, was Du mit "Flags setzen" meinst...
ich denke Du meinst die fMask, aber welche Flags muss ich da setzen ?
ich dachte, dass SEE_MASK_NOCLOSEPROCESS ausreicht, alle anderen Flags scheinen mir, für meine Zwecke, nicht nötig zu sein...
außerdem bin ich mir nicht sicher, wie man da mehrere Flags angibt, ich dachte mit "or", also so:
Code:
sei.fMask = flag1 | flag2;
aber MSDN sagt, dass fMask ein Array ist:
fMask
An array of flags that indicate the content and validity of the other structure members.
aber warum ist fMask dann als ULONG definiert, sollte ein Array nicht als Zeiger (z.B. ULONG*) definiert sein ?
Wahrscheinlich übersehe ich da wieder was ganz einfaches/einleuchtendes... ;)

Auf jeden Fall hast Du mich ein gutes Stück weiter gebracht :)
 
allerdings bin ich mir immer noch nicht sicher, was Du mit "Flags setzen" meinst...
ich denke Du meinst die fMask, aber welche Flags muss ich da setzen ?
ich dachte, dass SEE_MASK_NOCLOSEPROCESS ausreicht, alle anderen Flags scheinen mir, für meine Zwecke, nicht nötig zu sein...

Das reicht auch aus.
Ich hatte übersehen, dass du es gesetzt hattest.
Wollte dich nur darauf hinweisen.


außerdem bin ich mir nicht sicher, wie man da mehrere Flags angibt, ich dachte mit "or", also so:
Code:
sei.fMask = flag1 | flag2;

Genau so.
Mit dem bitweisen oder.


aber MSDN sagt, dass fMask ein Array ist:aber warum ist fMask dann als ULONG definiert, sollte ein Array nicht als Zeiger (z.B. ULONG*) definiert sein ?

Du hast schon recht.
Aber "array" ist hier nicht im C++ Sinne als Array zu verstehen.
Gemeint ist damit, dass uLong viele Flags enthält.
So gesehen ist ein int ein "Array aus bits"...



Dann müsste jetzt dein Code eigentlich schon funktionsfähig sein?
 
Ja, es funktioniert jetzt, nochmals vielen Dank! :)

ein Problem habe ich zwar noch, aber das scheint am Programm selber zu liegen...
wenn ich eine Internetseite aufrufe wird Firefox gestartet, ich bekomme aber keinen Handle auf Firefox...
allerdings bekomme ich einen Handle, wenn ich SEE_MASK_NOCLOSEPROCESS nicht setze bekomme ich einen Handle, kann damit aber Firefox nicht beenden...
Scheint aber tatsächlich an Firefox zu liege, da es mit Musik-, Bild- und Textdateien funktioniert...

thx, Acki :)
 
Vielleicht liegt es daran, dass schon eine Firefox-Instanz aktiv ist?
Wie gesagt, bekommst du das Handle ja nur, wenn eine neue Instanz gestartet wird... (siehe auch msdn)

msdn hat gesagt.:
. Even if fMask is set to SEE_MASK_NOCLOSEPROCESS, hProcess will be NULL if no process was launched. For example, if a document to be launched is a URL and an instance of Internet Explorer is already running, it will display the document. No new process is launched, and hProcess will be NULL.

Wenn du das Flag nicht setzt, kann es gut sein, dass ShellExecuteEx sich gar nicht um das hProcess-Member des structs kümmert.
Das heißt, du bekommst in dem Fall gar kein Handle, sondern nur zufälligen Datenmüll.
(Auch wenn es laut msdn eigtl auf 0 gesetzt werden sollte)
 
Zuletzt bearbeitet:
Vielleicht liegt es daran, dass schon eine Firefox-Instanz aktiv ist?
Wie gesagt, bekommst du das Handle ja nur, wenn eine neue Instanz gestartet wird...

Ja, das wahr mir bekannt, aber Firefox läuft definitiv nicht...
selbst nach einem Systemneustart und direktem Start meines Programms funktioniert es nicht... :confused:
seltsamerweise funktioniert es auch nicht mit dem IE, auch hier definitiv keine laufende Instanz...

EDIT: zum testen habe ich mein Testprogramm mit Sourcecode bereitgestellt:
http://people.freenet.de/abusoft/bin.zip

der Sourcecode ist ganz simpel:
Code:
#include <windows.h>
#include <stdio.h>

int main(){

  SHELLEXECUTEINFO sei;
  sei.cbSize = sizeof(SHELLEXECUTEINFO);
  sei.fMask = SEE_MASK_NOCLOSEPROCESS;
  sei.hwnd = NULL;
  sei.lpVerb = "Open";
  sei.lpFile = "http://www.google.de";
  sei.lpParameters = "";
  sei.lpDirectory = "";
  sei.nShow = SW_SHOWMINNOACTIVE;
  ShellExecuteEx(&sei);

  Sleep(5000);

  TerminateProcess(sei.hProcess, 0);
  CloseHandle(sei.hProcess);

  return 0;
}
 
Zuletzt bearbeitet:
Ich habe (natürlicht) weiter getestet und folgendes festgestellt:
wenn ich eine Seite im Internet aufrufe schließt sich der Browser (MSIE oder Firefox) nicht...
öffne ich aber eine HTML Seite lokal, dann wird der Browser geschlossen! :suspekt:
 

Neue Beiträge

Zurück