Как игра может помешать людям запускать несколько экземпляров самого себя?

15

Starcraft II запрещает мне запускать несколько экземпляров, но если я запускаю в песочнице второй экземпляр , он работает. Что может объяснить это?

Как я могу повторить это поведение для моих собственных игр?

Brandon
источник

Ответы:

15

Помимо Starcraft 2, общий ответ на этот вопрос таков: получить (и заблокировать, если само приобретение уже не эквивалентно блокировке) определенный ресурс из операционной системы. Выйдите из игры, если захват / блокировка не удалась. Пример таких ресурсов:

  1. Определенные порты TCP или UDP.
  2. Взаимоисключающие блокировки («мьютексы») или семафоры (эти два часто связаны на уровне ОС)
  3. Файлы (файлы журналов часто являются наиболее очевидным выбором)

На верхнем уровне, наиболее болезненном для потребителя, специализированное аппаратное обеспечение, которое (иногда обязательно, как для некоторых компонентов роботизированного управления) может использоваться только одним потоком, также может использоваться таким образом.

Мартин Сойка
источник
5
Также может быть полезно помнить о возможных осложнениях безопасности: « Программа одного экземпляра - это собственный отказ в обслуживании ».
достаточно
Так как он работает в песочнице, он, вероятно, не первый. 2 или 3 являются хорошими возможностями, и, вероятно, определит, какие файлы открыты для их процессов.
Дуг-У
3
@ Doug-W Я не понимаю, как это работает в песочнице # 1.
AttackingHobo
@AttackingHobo, если я не скучаю, понял сложность песочницы, разве тот факт, что порт связан с песочницей, не препятствует его связыванию внутри? Или sandboxie предоставляет виртуальный интерфейс для каждой программы, работающей внутри него?
Даг-У
@ Vigil Насколько мне известно, вы можете цитировать Раймонда Чена весь день, но, пожалуйста, не добавляйте грамматические ошибки в его цитаты. : P (Просто скопируйте / вставьте их вместо этого.)
hheimbuerger
4

Я рекомендую мьютексный подход, но:

Другой часто используемый метод - просто проверка, запущен ли другой процесс с тем же именем.

Преимущество в том, что это смехотворно просто - вам не нужно беспокоиться о правах доступа к файлам или знать, что такое мьютекс. Недостатком является то, что вы получите ложноположительный результат, если на компьютере запущена другая программа с именем starcraft2.exe.

BlueRaja - Дэнни Пфлугхофт
источник
2
Хе-хе, или если пользователь решит переименовать программу.
Брэндон
@Джонатан: Тогда не надо жестко кодировать имя исполняемого файла ...
BlueRaja - Дэнни Пфлугхофт
1
Я имел в виду, что если пользователь копирует программу, переименовывает и запускает ее дважды?
Брэндон
3

Если вы используете C ++ и Windows API, вы можете использовать один из способов FindWindow, где вы можете передавать параметры, такие как имя класса и / или имя окна. Затем, если вы найдете совпадение, просто выйдите из вашей программы, прежде чем вы даже загрузите или создадите окно.

SourceTurtle
источник