在我的应用程序中,我有一项服务正在启动一个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

10-07 19:10
查看更多