0

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

如果应用程序被随机用户停止,或者不管它是什么,我创建了一个服务程序来检测它何时停止运行,并再次执行它。

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

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

我应该改用 IPC 吗?或任何其他解决方法?

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

任何建议将不胜感激。

提前致谢。

4

1 回答 1

0

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

以下是我一步一步进行的。

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

    ::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. 看到它的工作。

于 2013-02-06T08:10:16.383 回答