2009-06-12 8 views
1

je le code suivantC++ fonction du système se bloque l'application

 
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); 
    } 

Où arg est: "" C: \ Program Files \ Internet Explorer \ iexplore.exe "http://yahoo.com"

Le programme fonctionne comme prévu, en lançant IE et naviguant vers Yahoo, mais la fonction d'appel (reportResults) ne se ferme jamais. Comment puis-je sortir le programme en laissant le navigateur en vie? Merci.

Répondre

7

Vous souhaitez utiliser _wspawn() au lieu de _wsystem(). Cela générera un nouveau processus pour le processus du navigateur. _wsystem() bloque sur la commande que vous créez; C'est pourquoi vous ne revenez pas à votre code. _wspawn() crée un nouveau processus séparé, qui devrait retourner immédiatement à votre code.

0

Si vous souhaitez utiliser l'implémentation actuelle, vous devrez fork() le processus et laisser un enfant s'occuper de la génération du navigateur. Ainsi, le processus principal continuera et quittera la fonction.

0

Au lieu d'exécuter

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

execute

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

La commande _wsystem attendra la commande en arg pour revenir et retourne la valeur de retour de la commande. Si vous fermez la fenêtre Internet Explorer, la commande retournera à votre programme.

+0

semble comme la seule réponse qui explique réellement ce qui ne va pas au lieu de simplement donner le solution directe. +1 –

5

Pourquoi ne pas simplement utiliser ShellExecute pour lancer le navigateur par défaut avec une URL donnée?

Synopsis:

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

EDIT:

je suppose, car il doit être IE, cela pourrait fonctionner (note, code non testé):

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

+1 Les autres affiches ont raison concernant la nature bloquante de _wsystem, mais c'est, sans aucun doute, la bonne façon d'accomplir ce que vous essayez de faire. S'appuyant sur un chemin codé en dur pour IE une très mauvaise idée. (Bien sûr, il est là sur la plupart des machines, mais que se passe-t-il si elles utilisent FireFox? Que se passe-t-il si l'utilisateur a déplacé IE en quelque sorte pour une raison quelconque?). – DarkSquid

+0

Le client a spécifié IE, c'est ce que cela doit être. – Jon