原理
首先要了解什么是内核同步对象。
在多线程的情况下,如果存在多个线程要使用同一个资源的情况时,则需要在线程之间进行协调(同步)才能使程序完成预定的工作,而不会出现灾难性的冲突。
总结,同步对象的目的是解决多线程同时访问资源问题,功能是在一段时间内独占资源。
下面是同步对象的种类:
HANDLE CreateEventA(
LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset,
BOOL bInitialState,
LPCSTR lpName
);
HANDLE CreateMutexA(
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCSTR lpName
);
HANDLE CreateSemaphoreA(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
LONG lInitialCount,
LONG lMaximumCount,
LPCSTR lpName
);
这几个 api 都有一个共同的参数 lpName
,当同名的 lpName
被再次创建的时候,api 调用就会失败,因此可以根据 api 的返回结果判断是否多开,但是这种方法只适用于单实例防多开。
验证方法
- 如果应用只能打开一个,那么最有可能是这种首先方式
以下代码在 pchunter 中的存在方式:
#include <iostream>
#include <Windows.h>
using namespace std;
int main()
{
HANDLE hMutex = CreateMutex(
NULL, // 不继承句柄
TRUE, // 创建互斥锁
"LYSM_Mutex" // 名字
);
HANDLE hEvent = CreateEvent(
NULL, // 不继承句柄
TRUE, // 创建手动重置对象
TRUE, // 标志事件对象的初始状态
"LYSM_Event" // 名字
);
HANDLE hSemaphore = CreateSemaphore(
NULL, // 进程不继承句柄
1, // 信号量初始计数
1, // 信号量最大计数,这个值必须大于0
"LYSM_Semaphore" // 名字
);
cout << "finished." << endl;
getchar();
return 0;
}