Как проверить существование мьютекса

у меня есть две программы в первой создаёться мьютекс

int main()
{
    HANDLE mutex = CreateMutexA(NULL, NULL, "MutexName");
    DWORD result = WaitForSingleObject(mutex, 0);
    if(result == WAIT_OBJECT_0)
    {
        StartProg();
        ReleaseMutex(mutex);
    }
    CloseHandle(mutex);

}

Мне нужно что-бы при запуске второй программы она проверяла существование мьютекса из первой программы по имени т.е. проверила запущен ли мьютекс с именем MutexName и если запущен то ждать пока освободиться и продолжить своё выполнение. Как мне это сделать?


Ответы (2 шт):

Автор решения: user7860670

Вторым аргументов в этой функции выступает флаг обязательности создания объекта. Соответственно для получения желаемого эффекта необходимо попытаться создать объект в обязательном порядке:

LPSECURITY_ATTRIBUTES const p_attributes{};
BOOL const initial{TRUE};
HANDLE const mutex{::CreateMutexA(p_attributes, initial, "MutexName")};
if (NULL == mutex)
{
    auto const last_error{::GetLastError()};
    ::std::abort();
}
{
    auto const last_error{::GetLastError()};
    if (ERROR_ALREADY_EXISTS == last_error)
    {
        // мьютекс уже был создан ранее, ждем...
        auto const result{::WaitForSingleObject(mutex, INFINITE)};
    }

if (FALSE == ::CloseHandle(mutex))
{
    auto const last_error{::GetLastError()}:
    ::std::abort();
}
→ Ссылка
Автор решения: Alex Guteniev

Функция CreateMutexA может создать или октрыть существующий мьютекс.

Отличить создала она мьютекс или открыла можно по ::GetLastError().

Один из редких случаев, когда результат, возвращаемый ::GetLastError() определён для успешно выполнившейся Windows API функции (обычно он валиден только для неуспешных вызовов).

→ Ссылка