1. 程式人生 > >使用互斥體防止程序多開技術

使用互斥體防止程序多開技術

根據 mat windows 進行 很多 pau val strong obj

          使用互斥體防止程序多開技術

學習完線程的同步函數. 互斥體的應用.那麽我們可以使用互斥體進行放多開設置.

一丶編寫思路.

在編寫互斥體防止多開的時候.我們要查詢下MSDN.看下互斥體的介紹.

看到互斥體MSDN返回值說的一段話.

If the function succeeds, the return value is a handle to the mutex object. If the named mutex object existed before the function call, the function returns a handle to the existing object and GetLastError

returns ERROR_ALREADY_EXISTS. Otherwise, the caller created the mutex.

If the function fails, the return value is NULL. To get extended error information, call GetLastError

上面的英文意思是.如果函數成功.則返回互斥體的句柄.如果調用此函數.發現名字已經有了.表示這個函數在之前已經調用過了.所以則會返回 ERROR_ALREADY_EXISTS的宏. 這個宏的意思就是已經存在.

如果函數失敗.則返回NULL. 返回的宏必須調用 GetlastError獲取.

根據上面返回值的意思我們明白了. 這個函數如果調用過則會返回 已經存在的宏. 那麽我們可以寫程序來校驗一下.

#include "stdafx.h"
#include <Windows.h>
//創建臨界區結構

int main(int argc, char *argv[])
{
    //初始化臨界區全局原子變量
    HANDLE MutexHandle = CreateMutex(NULL, FALSE, TEXT("AAA"));  //創建互斥體. 信號量為0. 有信號的狀態.wait可以等待
    DWORD ErrorCode = 0;
    ErrorCode = GetLastError();
    
if (ERROR_ALREADY_EXISTS == ErrorCode) { printf("對不起,程序已經啟動一份了.這份即將關閉\r\n"); CloseHandle(MutexHandle); system("pause"); } if (NULL == MutexHandle) { return 0; //表示句柄獲取失敗 } for (size_t i = 0; i < 10; i++) { Sleep(1000); printf("當前程序運行中. EIP 位置 等於 %d \r\n", i); } system("pause"); return 0; }

我們打開同樣的兩個程序

技術分享圖片

一份提示正在執行.一份提示即將關閉.這個則是互斥體防止多開的原理.

當然有很多這樣的方法.這個只是其中一種.

使用互斥體防止程序多開技術