使用互斥體防止程序多開技術
阿新 • • 發佈:2018-09-02
根據 mat windows 進行 很多 pau val strong obj returns ERROR_ALREADY_EXISTS. Otherwise, the caller created the mutex.
使用互斥體防止程序多開技術
學習完線程的同步函數. 互斥體的應用.那麽我們可以使用互斥體進行放多開設置.
一丶編寫思路.
在編寫互斥體防止多開的時候.我們要查詢下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
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; }
我們打開同樣的兩個程序
一份提示正在執行.一份提示即將關閉.這個則是互斥體防止多開的原理.
當然有很多這樣的方法.這個只是其中一種.
使用互斥體防止程序多開技術