游戏如何阻止人们运行自己的多个实例?


Answers:


15

除了《星际争霸2》外,对此的一般答案是:从操作系统中获取(并锁定(如果获取本身还不等同于锁定))。如果获取/锁定失败,请退出游戏。此类资源的示例是:

  1. 特定的TCP或UDP端口。
  2. 互斥锁(“ mutexes”)或信号灯(这两个通常在操作系统级别上相关)
  3. 文件(日志文件通常是最明显的选择)

在高端方式上,对于客户而言,最痛苦的是,也只能以这种方式使用专用硬件(有时必须像某些机器人控制组件一样)只能由单个线程使用。


5
记住可能的安全复杂性也是有用的:“ 单实例程序就是它自己的拒绝服务 ”。
EnoughTea 2011年

由于它可以在沙盒中工作,因此可能不是第一个。2或3是很好的可能性,看看哪些文件可以打开进程。
道格W

3
@ Doug-W我看不到它在沙盒中的工作方式是否排除了#1。
AttackingHobo

@AttackingHobo除非我想念了解sandboxie的复杂性,否则将端口绑定到sandboxie之外的事实是否会阻止它绑定在其内部?还是sandboxie为其中运行的每个程序提供虚拟接口?
道格W

@Vigil就我而言,您可能会整天引用Raymond Chen,但请不要在他的引用中添加语法错误。:P(只需复制/粘贴即可。)
hheimbuerger 2011年

4

我建议使用互斥锁方法,但是:

经常使用的另一种方法是简单地检查是否正在运行同名的另一个进程。

优点是,它非常简单-您不必担心文件权限或知道什么是互斥体。不利的一面是,如果机器上正在运行另一个名为的程序,则您将得到假阳性starcraft2.exe


2
呵呵,或者如果用户决定重命名该程序。
布兰登

@乔纳森:然后不要硬编码可执行文件的名称...
BlueRaja-Danny Pflughoeft

1
我的意思是,如果用户复制程序并重命名并运行两次,该怎么办?
布兰登

3

如果您使用的是C ++和Windows API,则可以使用的一种方法,您可以FindWindow在其中传递类名和/或窗口名之类的参数。然后,如果找到匹配项,则在加载或创建窗口之前退出程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.