2009-06-12 4 views
1

私持っているが、次のコードC++のシステム機能は、アプリケーション

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

argがあるハングIEを起動してYahooにナビゲートしますが、呼び出し関数(reportResults)は決して終了しません。ブラウザーを残してプログラムを終了させるにはどうすればよいですか?おかげさまで

答えて

7

_wsystem()の代わりに_wspawn()を使用します。これにより、ブラウザプロセスの新しいプロセスが生成されます。作成したコマンドの_wsystem()ブロック。これがあなたのコードに戻ってこない理由です。 _wspawn()は新しいプロセスを作成します。プロセスはすぐにコードに戻るべきです。

0

現在の実装を使用する場合は、プロセスをfork()にして、子プロセスがブラウザを生成するようにします。したがって、メインプロセスは継続して機能を終了します。代わり

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

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

。 Internet Explorerウィンドウを閉じると、プログラムにコマンドが返されます。

6

_wsystemコマンドを返す引数にコマンドを待機する実行し、コマンドの戻り値を返す実行

+0

はそう実際に何が間違っているかを説明する唯一の答えのように、ストレートフォワードソリューション。 +1 –

5

ShellExecuteを使用して、指定したURLのデフォルトブラウザを起動しないのはなぜですか?

はあらすじ:

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

EDIT:

私はそれが IEでなければならないことから、これはうまくいくかもしれないと仮定(ノート、未テストコード):

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

+1他のポスターは、_wsystemのブロック性質に関しては正しいですが、これは間違いなくあなたがしようとしていることを達成する正しい方法です。 IEへのハードコーディングされたパスに依存することは、本当に悪い考えです。 (確かに、ほとんどのマシンにはありますが、FireFoxを使用している場合はどうなりますか?何らかの理由でユーザーが何らかの理由でIEを移動したらどうなりますか?) – DarkSquid

+0

カスタマーはIEを指定していますので、必要なものです。 – Jon

関連する問題