Как сделать приложение одиночку на winapi?

Приложение должно запускаться в одном экземпляре. Как это сделать с помощью разделяемой памяти? Если приложение уже загружено, то новый экземпляр должен закрыться, выкинув MessageBox.


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

Автор решения: Виктор

Вот вариант LPSTR szName — некоторая определенная заранее константа, например

#define MY_PROGRAMM "MyApplication_<тут GUID сгенерированный для уникальности>"

HANDLE hMutex = NULL;

BOOL Alone (LPSTR szName)
{
    hMutex = CreateMutex (NULL, TRUE, szName);
    if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
        CloseHandle(hMutex);
        return FALSE;
    }
    return TRUE;
}

С разделяемой памятью (есть свои особенности):

#pragma comment(linker, "/SECTION:.shr,RWS")
#pragma data_seg(".shr")
HWND hGlobal = NULL;
#pragma data_seg()

Если переменная hGlobal установлена, значит запущена копия

А если нет, то устанавливаем её и значит экземпляр запущен

→ Ссылка