Mutex для GameMaker Studio

Часто приходится сталкиваться с проблемой когда случайно запускается вторая копия (уже скомпилированной) игры. В возможностьях GameMaker не никакого функционала что бы предотвратить данное событие. Поэтому я написал небольшое DLL расширение на c++ к мейкеру.

Суть его заключается в использовании функции CreateMutex: она используется для защиты общего ресурса от одновременного доступа несколькими потоками или процессами.

#define func extern "C" __declspec(dllexport)
#include <windows.h>

func double GM_CreateMutex(char* mu)
{
    HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, mu);
    if (hMutex == NULL) 
    { 
        hMutex = CreateMutex(0, 0, mu);
        if (hMutex == NULL) { return -2; }
        else { return 1; }
    }
    else { return -1; }
}

 

Теперь достаточно только добавить забилденную DLL в проект:

 

И можно использовать в коде в событии Create любого объекта в комнате(либо в коде создании первой комнаты):

if GM_CreateMutex(game_project_name + string(game_id))==-1 then game_end();

 

Функция GM_CreateMutex получает текстовый параметр нашего mutex который мы хотим оставить за данным приложением. Можно использовать любой НО уникальный строковой параметр, в данном примере я использую имя проекта и его уникальный игровой id.

Возвращает значение -1 если mutex создать не удалось(т.е. он уже был зарезервирован первой копией запущенной игры)

Возвращает значение  1 если mutex создать удалось, т.е. имя было свободно, и семафор был зарезервирован текущей программой.

 

Скачать архив готовых DLL с функцией Mutex под х86 и х64.