2009-06-12 125 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