在我的应用程序中,我有一项服务正在启动一个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中调用MessageBox。删除了MessageBox,它执行得很好。似乎调用Windows相关功能导致了此问题。
服务实际上是在本地系统帐户中运行的,并且从该服务启动了exe。因此我们不能从本地系统帐户中调用窗口函数。
我现在正面临另一个问题。在exe中,它无法打开注册表以读取值。我试图打开HKCU,但失败了。
最佳答案
您正在尝试启动与桌面交互的可执行文件。服务在会话0(非交互会话)中运行。您需要确保在该会话中启动的所有进程都不会与桌面交互。
顺便说一句,永远不要将桌面窗口作为所有者窗口传递:http://blogs.msdn.com/b/oldnewthing/archive/2004/02/24/79212.aspx。