Функции CreateMutex() и ReleaseMutex()
Создается Mutex функцией CreateMutex():
HANDLE CreateMutex
(
LPSECURITY_ATTRIBUTES lpMutexAttributes, // атрибут безопастности
BOOL bInitialOwner, // флаг начального владельца
LPCTSTR lpName // имя объекта
);
Результатом будет дескриптор объекта mutex, если такое имя есть, то дескпритор существующего. Функция GetLastError() при вызове будет выдавать ERROR_ALREADY_EXISTS.
Для освобождения объекта нужно вызвать функцию ReleaseMutex():
BOOL ReleaseMutex
(
HANDLE hMutex // дескриптор mutex
);
При успешном выполнении вернет ненулевое значение.
По окончанию дескриптор нужно закрыть вызвав CloseHandle(). Давайте посмотрим пример использования Mutex для запрета запуска двух приложений.
// CreateMutex.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "windows.h"
#include "iostream.h"
void main()
{
HANDLE mut;
mut = CreateMutex(NULL, FALSE, "FirstStep");
DWORD result;
result = WaitForSingleObject(mut,0);
if (result == WAIT_OBJECT_0)
{
cout << "programm running" << endl;
int i;
cin >> i;
ReleaseMutex(mut);
}
else
cout << "fail programm running" << endl;
CloseHandle(mut);
}
При запуске программы она создает объект с именем "FirstStep", если захватить его удается WaitForSingleObject(), то программа выполняется якобы, ждет пока Вы введете число и нажмете Enter. Если захватить его не удается, то выходит с надписью fail. Если Вы попробуете, то Вы сможете запустить только одну копию.