Internet Explorer öffnen und wieder schließen ?



  • Hallo,

    bin noch neu in der C++ CLI Programmierung.
    Ich versuche derzeit aus einem Programm heraus den Internet Explorer zu öffnen und danach wieder zu schließen. Der Internet Explorer startet auch in meiner Schleife wie gewünscht. Nur er bleibt geöffnet und lässt sich nicht mehr schließen. Ich benutze Visual Studio 2008 Pro. Hier mal mein Code aus dem Loop.

    Process^ p = gcnew Process(); ProcessStartInfo^ ie = gcnew ProcessStartInfo( "IExplore.exe" );
    ie->WindowStyle = ProcessWindowStyle::Normal;
    ie->Arguments = "http://meineurl/


    p->Start(ie);
    p->WaitForExit();

    Wait for Exit endet in einem Fehler. Ich habe es auch bereits mit p->Kill() und p->CloseMainWindow() probiert. Klappt auch nicht alles Endet in einem Fehler.

    Bei waitforExit() lautet der Fehler: InvalidOperationException wurde nicht behandelt. Diesem Objekt ist kein Process zugeordnet. Die Fehlermeldung kommt nicht beim kompilieren, sondern beim öffnen des ersten IE Fensters vom Debugger.

    Bei kill() und bei CloseMainWindow kommt der selbe Fehler.

    Habe dann mal probiert mit try und catch (Exception ^e) die Meldung ab zu fangen. Die Meldung lautet: Diesem Objekt ist kein Process zugeordnet.

    Was habe ich falsch gemacht, das das Fenster nicht wieder geschlossen wird ?

    Habe ich irgendwas vergessen zu erwähnen ?



  • Habe mal p->Start(ie); durch p = Process::Start(ie); ersetzt und siehe da, die Fehlermeldung kommt nicht mehr.
    Allerdings schließt sich das Fenster des Internet Explorers nicht. Wie kann ich es anstellen das sich das/die Fenster wieder schließt ?

    Weiß denn keiner Rat ?

    Danke



  • per WaitForExit() blockiert dein programm, bis der ie geschlossen wird.
    -> WaitForExit(Int32 x) sollte den ie nach x millisecunden beenden.



  • Erstmal Danke für deine Antwort.

    Ich habe auf der Microsoft Seite schon im MSDN gelesen, das diese Variante versucht werden sollte. Also habe ich laut MS Quellcode p->WaitForExit(timeout); gesetzt. Timeout habe ich vom Typ int timeout = 5000; definiert. Leider gehen die Fenster nicht zu. Es kommt aber nachdem ich p = Process::Start(ie); eingetragen hatte, zumindest keine Fehlermeldung mehr vom Debugger.

    Ich habe auch gedacht, das dies die korrekte Möglichkeit ist. Vielleicht ist Sie es auch. Nur dann muss in den paar Zeilen Code von mir doch ein Fehler sein.

    Ich habe bei MS auch gelesen, das man es mit kill machen kann und das man diese hasexited abfrage rein basteln kann, aber das hat auch nicht zum Erfolg geführt.



  • Na, dann lest noch mal aufmerksam nach. Wie kommt ihr auf die Idee das WaitForExit den Prozess beendet ?!

    Bei mir funktioniert z.B. dieser Aufruf:

    Process p = Process.Start("iexplore.exe");
                p.WaitForInputIdle();
                p.WaitForExit(250);
                p.CloseMainWindow();
    
    Process p = new Process(); 
                ProcessStartInfo ie = new ProcessStartInfo( "IExplore.exe" );
                ie.WindowStyle = ProcessWindowStyle.Normal;
                ie.Arguments = "http://www.google.de";
                p.StartInfo = ie;
                p.Start();
                p.WaitForInputIdle();
                p.WaitForExit(250);
                p.CloseMainWindow();
    

    Einfach mal die Doku lesen!



  • Ich habe deinen Code probiert. Ich musste ihn allerdings umbauen.

    Process^ p = gcnew Process();
    ProcessStartInfo^ ie = gcnew ProcessStartInfo( "IExplore.exe" );
    ie->WindowStyle = ProcessWindowStyle::Normal;
    ie->Arguments = "http://www.google.de";
    p->StartInfo = ie;
    p->Start();
    p->WaitForInputIdle();
    p->WaitForExit(2500);
    p->CloseMainWindow();

    So ließ sich das ganze kompilieren.
    Ich arbeite mit einer clr Windows Form Anwendung.

    Die Exception Meldung lautet beim Aufruf:
    Die angeforderten Informationen sind nicht verfügbar, da der Prozess beendet wurde.

    Was mir aufgefallen ist, ist das wenn ich statt der IExplorer.exe die notepad.exe eintrage und das Argument rauslasse, dann gehts. Es scheint also in Verbindung mit dem IE Probleme zu geben.
    Ich habe google benutzt un eine ganz Interessante Sache gefunden, mit der ich allerdings wenig anfangen kann. Dort wird gesagt, das closemainwindow eine wm_close Message an den Prozess schickt. Dort wird beschrieben, das der Internet Explorer scheinbar nur mit einer sc_close message geschlossen werden kann. Nur da ich neu in Sachen c++ net bin, kann ich noch nicht also viel damit anfangen.
    Ist das so korrekt ? Und wenn ja wie kann ich damit mein Problem lösen ?

    Habe den Internet Explorer 8 drauf. Mit anderen Versionen noch nicht getestet.


Anmelden zum Antworten