关闭互斥体¶
游戏通常只允许一个客户端同时运行;这叫做单实例限制。你可以用多种方式实现单实例限制,但系统互斥体很常见,因为互斥体是会话级的,可以通过简单的名称访问。用互斥体限制实例很容易,而感谢 Process Explorer,移除这个限制同样容易,让你可以同时运行游戏的多个实例。
首先,这里是一个游戏可能用互斥体处理单实例限制的方式:
int main(int argc, char *argv[]) {
// 创建互斥体
HANDLE mutex = CreateMutex(NULL, FALSE, "
if (GetLastError() == ERROR_ALREADY_EXISTS) {
// 互斥体已存在,退出
ErrorBox("An instance is already
running.");
return 0;
}
// 互斥体不存在;它刚刚被创建,所以
// 让游戏运行
RunGame();
// 游戏结束;关闭互斥体以释放它,
// 供未来的实例使用
if (mutex)
CloseHandle(mutex);
return 0;
}
这段示例代码创建了一个名为 onlyoneplease 的互斥体。接下来,函数检查 GetLastError() 看互斥体是否已经被创建,如果是,就关闭游戏。如果互斥体不存在,游戏创建实例,从而阻止任何游戏客户端运行。在这个示例中,游戏正常运行,结束后调用 CloseHandle() 关闭互斥体,允许未来的游戏实例运行。
你可以用 Process Explorer 关闭限制实例的互斥体,同时运行许多游戏实例。要做到这一点,选择下方窗格的「句柄」视图,查找所有类型为 Mutant 的句柄,确定哪个限制了游戏的实例,然后关闭那个互斥体。
警互斥体也用于跨线程和进程同步数据。只有当你确定它
告的唯一用途正是你想要破坏的那个时,才关闭它!
多客户端破解通常需求量很大,所以能够为新兴游戏快速开发它们,对你作为该市场中的机器人开发者的整体成功至关重要。由于互斥体是实现单实例限制的最常见方式之一,Process Explorer 是原型制作这类破解不可或缺的工具。