ERLEDIGT
NEIN
NEIN
ANTWORTEN
9
9
ZUGRIFFE
2625
2625
EMPFEHLEN
-
Hallo,
ich habe eine Funktion geschrieben, mit der eine beliebige Datei mit dem assoziierten Programm angezeigt/abgespielt werden kann...
OK, das funktioniert...Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// 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); }
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/13...e-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-----------------------------------------------------------------------------
using Code::Blocks with Win7 home-premium (64bit)
-----------------------------------------------------------------------------
-
02.04.08 17:40 #2
- Registriert seit
- Jan 2004
- Ort
- Wannweil
- Beiträge
- 302
Das SHELLEXECUTEINFO struct hat ein Member, das heißt "hProcess".
Wenn ShellExecuteEx erfolgreich war, kannst du das verwenden.
Achja: dafür musst du natürlich noch zusätzliche Flags setzen.
siehe am besten immer msdn bzgl. WinApi:
http://msdn2.microsoft.com/en-us/lib...84(VS.85).aspxGeändert von Beichtpfarrer (02.04.08 um 17:43 Uhr)
Noch weiter helfen jetzt nur noch google, msdn, Tutorials, Forumssuche, Eingebungen, Glück und ein wenig Hirnanstrengung.
-
danke, für deine Antwort

das habe ich mir auch schon gedacht und wird auch in dem Thread erwähnt...
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...Code :1 2 3
HANDLE ProcessId_Exit = OpenProcess(PROCESS_TERMINATE, 0, (DWORD)sei.hProcess); TerminateProcess(ProcessId_Exit, 1); CloseHandle(ProcessId_Exit);
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...
-----------------------------------------------------------------------------
using Code::Blocks with Win7 home-premium (64bit)
-----------------------------------------------------------------------------
-
02.04.08 18:26 #4
- Registriert seit
- Jan 2004
- Ort
- Wannweil
- Beiträge
- 302
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..Noch weiter helfen jetzt nur noch google, msdn, Tutorials, Forumssuche, Eingebungen, Glück und ein wenig Hirnanstrengung.
-
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:aber MSDN sagt, dass fMask ein Array ist:Code :1
sei.fMask = flag1 | flag2;
aber warum ist fMask dann als ULONG definiert, sollte ein Array nicht als Zeiger (z.B. ULONG*) definiert sein ?fMask
An array of flags that indicate the content and validity of the other structure members.
Wahrscheinlich übersehe ich da wieder was ganz einfaches/einleuchtendes...
Auf jeden Fall hast Du mich ein gutes Stück weiter gebracht
-----------------------------------------------------------------------------
using Code::Blocks with Win7 home-premium (64bit)
-----------------------------------------------------------------------------
-
02.04.08 19:47 #6
- Registriert seit
- Jan 2004
- Ort
- Wannweil
- Beiträge
- 302
Das reicht auch aus.
Ich hatte übersehen, dass du es gesetzt hattest.
Wollte dich nur darauf hinweisen.
Genau so.
Mit dem bitweisen oder.
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?Noch weiter helfen jetzt nur noch google, msdn, Tutorials, Forumssuche, Eingebungen, Glück und ein wenig Hirnanstrengung.
-
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
-----------------------------------------------------------------------------
using Code::Blocks with Win7 home-premium (64bit)
-----------------------------------------------------------------------------
-
02.04.08 20:49 #8
- Registriert seit
- Jan 2004
- Ort
- Wannweil
- Beiträge
- 302
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)
Wenn du das Flag nicht setzt, kann es gut sein, dass ShellExecuteEx sich gar nicht um das hProcess-Member des structs kümmert.
Zitat von msdn
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)Geändert von Beichtpfarrer (02.04.08 um 20:52 Uhr)
Noch weiter helfen jetzt nur noch google, msdn, Tutorials, Forumssuche, Eingebungen, Glück und ein wenig Hirnanstrengung.
-
Ja, das wahr mir bekannt, aber Firefox läuft definitiv nicht...
selbst nach einem Systemneustart und direktem Start meines Programms funktioniert es nicht...
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#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; }Geändert von AckiB (02.04.08 um 23:56 Uhr)
-----------------------------------------------------------------------------
using Code::Blocks with Win7 home-premium (64bit)
-----------------------------------------------------------------------------
-
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!
-----------------------------------------------------------------------------
using Code::Blocks with Win7 home-premium (64bit)
-----------------------------------------------------------------------------
Ähnliche Themen
-
C#: Beenden von Anwendung verhindern?
Von lordfritte im Forum .NET Windows FormsAntworten: 7Letzter Beitrag: 11.10.07, 16:27 -
Windows 98 per Anwendung beenden
Von MarkusG im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 1Letzter Beitrag: 04.10.05, 10:08 -
Beenden der Anwendung nach Ausnahme-Wie?
Von Asterix15 im Forum .NET CaféAntworten: 5Letzter Beitrag: 25.08.05, 14:34 -
[C] beenden der anwendung verhindern
Von daleIlowmo im Forum C/C++Antworten: 4Letzter Beitrag: 23.08.03, 14:30 -
beenden der anwendung
Von thecooper im Forum Visual Basic 6.0Antworten: 2Letzter Beitrag: 26.07.03, 16:04





Zitieren
Login






