Как узнать, запущен ли процесс из сервиса
Я создал приложение с графическим интерфейсом, которое должно запускаться на моем сервере DELL для отправки запросов в течение 24 часов.
В случае, когда приложение остановлено случайными пользователями или кем-то еще, я создал служебную программу, которая определяет, когда оно перестает работать, и запускает его снова.
Проблема в том, что служба FindWindow() не работает должным образом (всегда возвращает nullptr), поскольку Microsoft изменила свои политики службы ОС начиная с XP. И моя сервисная программа не может найти, находится ли программа в списке процессов или нет.
В Интернете я нашел некоторые решения, которые "позволяют сервису взаимодействовать с рабочим столом на сервисной панели", но так как это было давно, поэтому не совсем вписывается в текущую версию ОС.
Должен ли я использовать IPC вместо этого? или есть другие способы исправить?
Я считаю, что должен быть способ сделать это, потому что выполнение процесса из службы также возможно с помощью CreateProcessAsUser().
Любой совет будет по достоинству оценен.
Заранее спасибо.
1 ответ
Итак, я сделал то, что предложил мне Реми Лебо, и это правильно работает в Windows 7 и 2008.
Вот как я пошёл шаг за шагом.
Создайте именованный мьютекс в глобальном пространстве имен в приложении с графическим интерфейсом.
::CreateMutex(nullptr, false, L"Global\\MyMutex");
Периодически проверяйте, исчез ли мьютекс с помощью 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); }
Вижу это работает.