在我的应用程序中,我有一个服务正在启动一个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但它失败了。
答案 0 :(得分:1)
您正在尝试启动与桌面交互的可执行文件。服务在会话0中运行,这是一个非交互式会话。您需要确保在该会话中启动的任何进程都不与桌面交互。
顺便说一句,您永远不应该将桌面窗口作为所有者窗口传递:http://blogs.msdn.com/b/oldnewthing/archive/2004/02/24/79212.aspx。