2

我正在尝试使用 TerminateProcess 来终止 ShellExecuteEX 启动的应用程序,如下所示:

SHELLEXECUTEINFO ExecuteInfo;
ExecuteInfo.fMask = SEE_MASK_FLAG_NO_UI; /* Odd but true */
ExecuteInfo.hwnd = NULL;
ExecuteInfo.cbSize = sizeof(ExecuteInfo);
ExecuteInfo.lpVerb = NULL;
ExecuteInfo.lpFile = "http://www.microsoft.com";
ExecuteInfo.lpParameters = "";
ExecuteInfo.lpDirectory = NULL;
ExecuteInfo.nShow =  SW_SHOW;;
ShellExecuteEx(&ExecuteInfo);
//WaitForSingleObject(ExecuteInfo.hProcess, 0);
Sleep(4000);
TerminateProcess(ExecuteInfo.hProcess, 0);

IE 被打开但它永远不会关闭。难道我做错了什么?

4

2 回答 2

5

根据MSDNfMask必须设置为SEE_MASK_NOCLOSEPROCESSfor.hProcess才能设置。我会添加一个测试以查看它是否为 NULL。作为旁注,我总是有更好的运气使用CreateProcess.

编辑:

这是您使用 CreateProcess 执行此操作的方式:

PROCESS_INFORMATION pi = {0};
STARTUPINFO si = {0};
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;


CreateProcess(  NULL,
                "C:\\Program Files\\Internet Explorer\\iexplore.exe http://www.google.com/",
                NULL,
                NULL,
                FALSE,
                NORMAL_PRIORITY_CLASS,
                NULL,
                NULL,
                &si,
                &pi );


Sleep(4000);
TerminateProcess(pi.hProcess, 0);

您应该添加错误检查并可以使用以下方式查询默认浏览器的路径AssocQueryStringAssocQueryString(0,ASSOCSTR_EXECUTABLE,"http","open", szExe, &cchExe);

于 2011-05-19T21:18:49.407 回答
0

您可以通过检查返回的 hProcess 获得更多信息(例如,在调试器中)。还要确保你SEE_MASK_NOCLOSEPROCESS设置了标志。

但我的精神力量说:打开一个 IE 文档并不一定会创建一个新进程。而且,如果确实如此,它可能不是您认为的那样:您可能创建的进程可能已经产生了另一个进程来实际托管文档。Raymond Chen 在这篇博文的中途提到了这一点。

于 2011-05-19T21:39:25.603 回答