Отредактировано, чтобы добавить:
Предположим, у вас есть лицензия, позволяющая запускать 20 полнофункциональных копий вашей программы. Тогда у вас может быть 20 мьютексов с именами от MyProgMutex1 до MyProgMutex20. При запуске ваша программа может проходить через мьютексы. Если он находит запасной мьютекс, который может использовать, он прекращает цикл и переходит в режим полной функциональности. Если он проходит через все мьютексы, не имея возможности захватить ни один из них, то он входит в режим ограниченной функциональности.
Оригинальный ответ:
Полагаю, вы хотите убедиться, что одновременно запускается только одна копия вашего процесса. (Или, для Terminal Server, одна копия вашего процесса за сеанс входа в систему).
Ваше именованное решение семафора близко. Правильный способ сделать это - именованный мьютекс. Используйте CreateMutex для создания мьютекса, затем вызовите WaitForSingleObject с таймаутом, равным нулю. Если WaitForSingleObject возвращает WAIT_TIMEOUT, выполняется другая копия процесса. Если он возвращает WAIT_OBJECT_0 или WAIT_ABANDONED, то вы - единственная копия процесса. Вам нужно держать дескриптор мьютекса открытым во время работы вашей программы - либо вызовите CloseHandle , когда ваш процесс собирается завершиться, либо просто намеренно утечка дескриптора и полагайтесь на встроенную очистку Windows, чтобы освободить дескриптор для вас. когда ваш процесс завершается. Windows автоматически увеличит счетчик мьютекса при выходе из вашего процесса.