该过程似乎已陷入僵局。所有线程都已停止工作

时间:2014-01-31 11:27:14

标签: c++ winapi deadlock shellexecute

在我的应用程序中,我有一个服务正在启动一个exe。

在服务代码中,我使用ShellExecuteEx命令启动exe:

BOOL bLaunched = false;



       SHELLEXECUTEINFO ex;
       memset(&ex, 0, sizeof(ex));
       ex.cbSize       = sizeof(ex);
       ex.fMask        = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOCLOSEPROCESS;
       ex.hwnd         = ::GetDesktopWindow();
       ex.lpVerb       = _T("open");
       ex.lpParameters = params;
       ex.lpDirectory  = path;
       ex.nShow        = SW_SHOWNORMAL;
       ex.lpFile       = appName;

       bLaunched = ShellExecuteEx(&ex);
       return bLaunched;

在ShellExecuteEx调用之后,我可以在任务管理器中看到该exe,当我尝试将该exe附加到VS调试器并将其分解时,它会显示消息"the process appears to be deadlocked(or is not running any user-mode code).All threads have been stopped"

VS调试器在winMain函数中显示指向第一行的绿色箭头。

只有当我尝试从服务启动该exe时才会发生这种情况。当我尝试使用相同的参数集从示例应用程序启动该exe时,它可以正常工作。

有任何建议说明为什么它不起作用。

更新: 我想通了。我在exe.I中调用了MessageBox。我删除了MessageBox并且它执行得很好。看起来调用与Windows相关的函数会导致该问题。 实际上服务是在本地系统帐户中运行的,而exe是从该服务启动的。所以我们不能从本地系统帐户调用窗口函数。

我现在面临的另一个问题。在exe中,它无法打开注册表来读取值。我正在尝试打开HKCU但它失败了。

1 个答案:

答案 0 :(得分:1)

您正在尝试启动与桌面交互的可执行文件。服务在会话0中运行,这是一个非交互式会话。您需要确保在该会话中启动的任何进程都不与桌面交互。

顺便说一句,您永远不应该将桌面窗口作为所有者窗口传递:http://blogs.msdn.com/b/oldnewthing/archive/2004/02/24/79212.aspx