2009-06-12 80 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是: 「」 C:\ Program Files文件\的Internet Explorer \ IEXPLORE.EXE 「http://yahoo.com

程序按預期運行,啓動IE並導航到Yahoo,但調用函數(reportResults)從不退出。如何讓程序退出,使瀏覽器保持活動狀態? 謝謝。

回答

7

您想使用_wspawn()而不是_wsystem()。這將爲瀏覽器進程產生一個新的進程。 _wsystem()會阻止您創建的命令;這就是爲什麼你沒有回到你的代碼。 _wspawn()創建一個新的獨立進程,它應該立即返回到您的代碼。

0

如果你想使用當前的實現,你將不得不fork()的過程,並讓孩子處理瀏覽器產卵。因此,主流程將繼續並退出該功能。

0

代替執行

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

執行

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

的_wsystem命令將等待ARG命令返回,返回命令的返回值。如果您關閉Internet Explorer窗口,它會將命令返回到您的程序。

+0

似乎就像唯一的答案,實際上解釋了什麼是錯的,而不是隻給予直接的解決方案。 +1 – 2009-06-12 16:29:06

5

爲什麼不僅僅使用ShellExecute來啓動具有給定URL的默認瀏覽器?

簡介:

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

編輯:

我想,因爲它必須是IE,這可能工作(注意,未測試的代碼):

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

+1關於_wsystem的阻塞性質,其他海報是正確的,但毫無疑問,這是正確的方式來完成你想要做的事情。 依靠到IE的硬編碼路徑是一個非常糟糕的主意。 (當然,它在大多數機器上都存在,但如果他們使用FireFox呢?如果用戶因某種原因移動了IE,該怎麼辦?)。 – DarkSquid 2009-06-12 17:33:25