Для подробного ознакомления лучше прочитать MFC: "Шаг 332 - MFC и синхронизация", MSDN: "Шаг 82 - Что такое взаимоисключение (Mutex)", WinAPI: "Шаг 118 - Функции CreateMutex() и ReleaseMutex()".
В MFC для работы с Mutex есть соответствующий класс CMutex. Конструктор у этого класса всего один:
CMutex ( BOOL bInitiallyOwn = FALSE, // флаг владельца объекта LPCTSTR lpszName = NULL, // Имя объекта LPSECURITY_ATTRIBUTES lpsaAttribute = NULL // флаг защиты );
Давайте реализуем тот же прием, что в шаге API. Запретим запуск двух приложений. Для этого создаем приложение MFC AppWizard на базе диалогового окна с именем TestMutex.
Работать мы будем в классе приложения. Вот так он у Вас должен называться - CTestMutexApp. Первое это надо включить заголовочный файл класса CMutex:
...... #include "resource.h" // main symbols #include "afxmt.h" ////////////////////// // CTestMutexApp: ......
Для работы нам нужно два объекта классов. Мы их создадим. Сначало опишем:
...... class CTestMutexApp : public CWinApp { public: CTestMutexApp(); CMutex* mutex; CSingleLock* si; // Overrides .......
Потом проинициализируем:
CTestMutexApp::CTestMutexApp() { mutex = new CMutex(FALSE,"FirstStep",NULL); si=new CSingleLock(mutex); }
При окончании работы их нужно удалить:
int CTestMutexApp::ExitInstance() { delete si; delete mutex; return CWinApp::ExitInstance(); }
Все готово, чтобы написать основной код:
/////////////////////////////////// // CTestMutexApp initialization BOOL CTestMutexApp::InitInstance() { if (!si->Lock(1)) { AfxMessageBox("Error Running"); return FALSE; } AfxEnableControlContainer(); ......
Все просто. Если нам удается заблокировать объект if (!si->Lock(1)), то программа запускается и объект блокируется. А вот если кто-то сделал это ранее, то мы прекращаем инициализацию программы сообщая пользователю. Первый экземпляр запускается без проблем. А вот второй не как, чего и требовалось.