【问题标题】:How to know if the process is running from service如何知道进程是否从服务运行
【发布时间】:2013-02-01 08:52:02
【问题描述】:

我制作了一个 GUI 应用程序,它必须在我的 DELL 服务器上运行才能在 24 小时内发送查询。

如果应用程序被随机用户或其他任何原因停止,我创建了一个服务程序来检测它何时停止运行并再次执行。

问题是,在服务中,FindWindow() 不能正常工作(总是返回 nullptr),因为微软在 XP 之后改变了它的操作系统服务策略。并且我的服务程序无法找到该程序是否在进程列表中。

我在网上找到了一些解决方案,就是“允许服务与服务面板上的桌面交互”,但由于是很久以前的,所以不太适合当前的操作系统版本。

我应该改用 IPC 吗?还是有其他办法解决?

我相信一定有办法做到这一点,因为使用 CreateProcessAsUser() 也可以从服务执行进程。

我们将不胜感激任何建议。

提前致谢。

【问题讨论】:

  • 你不能使用 EnumProcesses (msdn.microsoft.com/en-us/library/windows/desktop/…) 吗?
  • 为什么不完全从服务中运行它并取消 GUI 和任何看门狗?
  • 另一种选择是让 GUI 应用程序在开始运行时在全局命名空间中创建一个命名互斥锁。如果应用程序因任何原因关闭,互斥锁将消失,即使应用程序没有明确关闭它。然后,该服务可以定期检查该互斥体是否存在。
  • @RemyLebeau 我现在将尝试该选项。我很感激。

标签: winapi service findwindow


【解决方案1】:

所以我按照 Remy Lebeau 的建议做了,它在 Windows 7 和 2008 中都能正常工作。

我是这样一步一步来的。

  1. 在 GUI 应用程序的 global 命名空间中创建一个命名互斥锁。

    ::CreateMutex(nullptr, false, L"Global\\MyMutex");
    
  2. 定期检查互斥锁是否消失 通过使用 CreateMutex(),不要忘记处理 引用计数到句柄。

    HANDLE hDetector = ::CreateMutex(nullptr, false, L"Global\\MyMutex");
    
    if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
            // The GUI application is still running.
            // ...  
    
            ::CloseHandle(hDetector); 
    }
    else
    {
            // The GUI application is not running.
            // ...
    
            ::CloseHandle(hDetector);
    }
    
  3. 看看效果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多