tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
2625
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von AckiB
    AckiB AckiB ist offline Mitglied Silber
    Registriert seit
    Apr 2004
    Ort
    (NRW)
    Beiträge
    69
    Hallo,
    ich habe eine Funktion geschrieben, mit der eine beliebige Datei mit dem assoziierten Programm angezeigt/abgespielt werden kann...
    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);
    }
    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/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)
    -----------------------------------------------------------------------------

  2. #2
    Beichtpfarrer Beichtpfarrer ist offline Mitglied Brokat
    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).aspx
    Geä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.

  3. #3
    Avatar von AckiB
    AckiB AckiB ist offline Mitglied Silber
    Registriert seit
    Apr 2004
    Ort
    (NRW)
    Beiträge
    69
    danke, für deine Antwort
    das habe ich mir auch schon gedacht und wird auch in dem Thread erwähnt...
    Code :
    1
    2
    3
    
      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...
     
    -----------------------------------------------------------------------------
    using Code::Blocks with Win7 home-premium (64bit)
    -----------------------------------------------------------------------------

  4. #4
    Beichtpfarrer Beichtpfarrer ist offline Mitglied Brokat
    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.

  5. #5
    Avatar von AckiB
    AckiB AckiB ist offline Mitglied Silber
    Registriert seit
    Apr 2004
    Ort
    (NRW)
    Beiträge
    69
    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 :
    1
    
    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
     
    -----------------------------------------------------------------------------
    using Code::Blocks with Win7 home-premium (64bit)
    -----------------------------------------------------------------------------

  6. #6
    Beichtpfarrer Beichtpfarrer ist offline Mitglied Brokat
    Registriert seit
    Jan 2004
    Ort
    Wannweil
    Beiträge
    302
    Zitat Zitat von AckiB Beitrag anzeigen
    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.


    Zitat Zitat von AckiB Beitrag anzeigen
    außerdem bin ich mir nicht sicher, wie man da mehrere Flags angibt, ich dachte mit "or", also so:
    Code :
    1
    
    sei.fMask = flag1 | flag2;
    Genau so.
    Mit dem bitweisen oder.


    Zitat Zitat von AckiB Beitrag anzeigen
    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?
     
    Noch weiter helfen jetzt nur noch google, msdn, Tutorials, Forumssuche, Eingebungen, Glück und ein wenig Hirnanstrengung.

  7. #7
    Avatar von AckiB
    AckiB AckiB ist offline Mitglied Silber
    Registriert seit
    Apr 2004
    Ort
    (NRW)
    Beiträge
    69
    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)
    -----------------------------------------------------------------------------

  8. #8
    Beichtpfarrer Beichtpfarrer ist offline Mitglied Brokat
    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)

    Zitat Zitat von msdn
    . 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)
    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.

  9. #9
    Avatar von AckiB
    AckiB AckiB ist offline Mitglied Silber
    Registriert seit
    Apr 2004
    Ort
    (NRW)
    Beiträge
    69
    Zitat Zitat von Beichtpfarrer Beitrag anzeigen
    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...
    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)
    -----------------------------------------------------------------------------

  10. #10
    Avatar von AckiB
    AckiB AckiB ist offline Mitglied Silber
    Registriert seit
    Apr 2004
    Ort
    (NRW)
    Beiträge
    69
    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

  1. C#: Beenden von Anwendung verhindern?
    Von lordfritte im Forum .NET Windows Forms
    Antworten: 7
    Letzter Beitrag: 11.10.07, 16:27
  2. Windows 98 per Anwendung beenden
    Von MarkusG im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 04.10.05, 10:08
  3. Beenden der Anwendung nach Ausnahme-Wie?
    Von Asterix15 im Forum .NET Café
    Antworten: 5
    Letzter Beitrag: 25.08.05, 14:34
  4. [C] beenden der anwendung verhindern
    Von daleIlowmo im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 23.08.03, 14:30
  5. beenden der anwendung
    Von thecooper im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 26.07.03, 16:04