Похоже, вы используете существование мьютекса как критерий для определения того, запущен ли уже процесс, а не то, кто владеет мьютексом. ReleaseMutex
используется, чтобы отказаться от владения мьютексом, если он сейчас принадлежит вам. Но ваш код на самом деле нигде не восстанавливает право собственности на мьютекс.
Я вижу следующие способы решения вашей проблемы:
- Уничтожьте мьютекс вместо того, чтобы пытаться его освободить.
Вместо ReleaseMutex
используйте CloseHandle
для уничтожения мьютекса. Если вы единственный, кто держит дескриптор мьютекса, он исчезнет впоследствии.
Для этой цели запомните исходный дескриптор, возвращенный CreateMutex
, и не открывайте мьютекс второй раз.
Используйте мьютексы по назначению
Вместо использования простого существующего мьютекса, попробуйте получить право собственности, вызвав для него WaitForSingleObject
. Затем вы можете освободить его, позвонив по номеру ReleaseMutex
.
Внешняя программа должна подождать (мой предпочтительный метод)
Попросите внешнюю программу дождаться, пока старый экземпляр приложения не будет полностью завершен, прежде чем пытаться запустить новый экземпляр.