Как узнать, запущен ли процесс из сервиса

Я создал приложение с графическим интерфейсом, которое должно запускаться на моем сервере DELL для отправки запросов в течение 24 часов.

В случае, когда приложение остановлено случайными пользователями или кем-то еще, я создал служебную программу, которая определяет, когда оно перестает работать, и запускает его снова.

Проблема в том, что служба FindWindow() не работает должным образом (всегда возвращает nullptr), поскольку Microsoft изменила свои политики службы ОС начиная с XP. И моя сервисная программа не может найти, находится ли программа в списке процессов или нет.

В Интернете я нашел некоторые решения, которые "позволяют сервису взаимодействовать с рабочим столом на сервисной панели", но так как это было давно, поэтому не совсем вписывается в текущую версию ОС.

Должен ли я использовать IPC вместо этого? или есть другие способы исправить?

Я считаю, что должен быть способ сделать это, потому что выполнение процесса из службы также возможно с помощью CreateProcessAsUser().

Любой совет будет по достоинству оценен.

Заранее спасибо.

1 ответ

Решение

Итак, я сделал то, что предложил мне Реми Лебо, и это правильно работает в Windows 7 и 2008.

Вот как я пошёл шаг за шагом.

  1. Создайте именованный мьютекс в глобальном пространстве имен в приложении с графическим интерфейсом.

    ::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. Вижу это работает.

Другие вопросы по тегам