【问题标题】:TerminateProcess() doesn't close the applicationTerminateProcess() 不会关闭应用程序
【发布时间】:2014-02-24 08:52:17
【问题描述】:

我正在尝试使用 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 被打开但它永远不会关闭。我做错了吗?

【问题讨论】:

  • 未验证 ShellExecuteEx 返回的 TRUE 是错误的。 ;-]
  • 根据MSDN,它不会退出,直到所有挂起的 I/O 完成或取消。作为浏览器,可能会发生大量 I/O。我知道您永远不应该尝试终止进程,尤其是以这种方式。也许您应该这样做,而是请求进程退出(以任何方式完成)?
  • @JeffMercado :通常会向主线程发送WM_CLOSE 消息。

标签: c++ visual-studio-2010 terminate shellexecute


【解决方案1】:

根据MSDNfMask 必须设置为SEE_MASK_NOCLOSEPROCESS.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);

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

【讨论】:

  • 同意,考虑 CreateProcess。
  • @Robb :我将 fMask 更改为 SEE_MASK_NOCLOSEPROCESS 并且 hProcess 仍然是 NULL,也尝试了 CreateProcess,并且 hProcess 仍然是 null :S
  • @riviraz - 我已更新以展示如何使用 CreateProcess 进行操作,除非现有窗口已经打开,否则它可能会失败。
【解决方案2】:

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

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

【讨论】:

  • 我试过调试,在 shellexecuteex 和 createprocess 中 hProcess 总是为空。
  • 这与我的理论一致,即 IE 没有创建新进程来打开文档。 (或者它启动的进程导致另一个进程托管文档,并且原始进程退出。)换句话说,你不能做你想做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2015-07-03
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多