2009-06-12 15 views
1

Ich habe den folgenden CodeC++ Systemfunktion hängt Anwendung

 
void reportResults() 
    { 
    wstring env(_wgetenv(L"ProgramFiles")); 
    env += L"\Internet Explorer\iexplore.exe"; 
    wstringstream url; 
    url << "\"\"" << env.c_str() << "\" http://yahoo.com \""; 
    wchar_t arg[BUFSIZE]; 
    url.get(arg, BUFSIZE); 
    wcout << arg << endl; 
    _wsystem(arg); 
    } 

Wo arg ist: "" C: \ Programme \ Internet Explorer \ iexplore.exe "http://yahoo.com"

Das Programm funktioniert wie erwartet, startet IE und navigiert zu Yahoo, aber die aufrufende Funktion (reportResults) wird nie beendet. Wie bekomme ich das Programm zum Verlassen des Browsers am Leben? Danke.

Antwort

7

Sie möchten _wspawn() anstelle von _wsystem() verwenden. Dies erzeugt einen neuen Prozess für den Browserprozess. _wsystem() blockiert den Befehl, den Sie erstellen; Deshalb kommen Sie nicht zu Ihrem Code zurück. _wspawn() erstellt einen neuen, separaten Prozess, der sofort zu Ihrem Code zurückkehren sollte.

0

Wenn Sie die aktuelle Implementierung verwenden möchten, müssen Sie fork() den Prozess und lassen Sie ein Kind den Browser-Launch behandeln. Somit wird der Hauptprozess fortgesetzt und die Funktion verlassen.

0

Anstelle des Ausführens

"C:\Program Files\Internet Explorer\iexplore.exe" "http://yahoo.com" 

ausführen

start "C:\Program Files\Internet Explorer\iexplore.exe" "http://yahoo.com" 
6

_wsystem Der Befehl für den Befehl in Arg- warten zurückkehren und gibt den Rückgabewert des Befehls. Wenn Sie das Internet Explorer-Fenster schließen, wird der Befehl an Ihr Programm zurückgegeben.

+0

scheint wie die einzige Antwort, die tatsächlich erklärt, was falsch ist, anstatt nur das zu geben einfache Lösung. +1 –

5

Warum nicht einfach ShellExecute verwenden, um den Standardbrowser mit einer bestimmten URL zu starten?

Synopsis:

LONG r = ShellExecute(NULL, "open", "http://www.microsoft.com", NULL, NULL, SW_SHOWNORMAL); 

EDIT:

Ich nehme an, da es muss IE sein, dies funktionieren könnte (beachten Sie, ungetesteten Code):

LONG r = ShellExecute(NULL, NULL, "iexplore.exe", "http://www.microsoft.com", NULL, SW_SHOWNORMAL); 
+0

+1 Die anderen Plakate sind richtig in Bezug auf die Blockierung von _wsystem, aber das ist, ohne Zweifel, der richtige Weg, um zu erreichen, was Sie versuchen zu tun. Sich auf einen hardcoded Pfad zu IE eine wirklich schlechte Idee zu verlassen. (Sicher, es ist dort auf den meisten Maschinen, aber was ist, wenn sie FireFox verwenden? Was ist, wenn der Benutzer IE irgendwie aus irgendeinem Grund verschoben hat?). – DarkSquid

+0

Der Kunde hat IE angegeben, also muss es sein. – Jon

Verwandte Themen