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


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

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

一丶編寫思路.

在編寫互斥體防止多開的時候.我們要查詢下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;
}

我們打開同樣的兩個程序

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM