Wie kann ein Spiel verhindern, dass mehrere Instanzen von sich selbst ausgeführt werden?

15

Starcraft II hindert mich daran, mehrere Instanzen auszuführen. Wenn ich jedoch die zweite Instanz mit Sandbox in Sandboxie ausführe , funktioniert dies. Was könnte das erklären?

Wie kann ich dieses Verhalten für meine eigenen Spiele replizieren?

Brandon
quelle

Antworten:

15

Abgesehen von Starcraft 2 lautet die allgemeine Antwort auf diese Frage: Erwerben (und sperren, wenn die Erfassung selbst nicht bereits dem Sperren entspricht) Sie eine bestimmte Ressource vom Betriebssystem. Beenden Sie das Spiel, wenn die Erfassung / Sperrung fehlschlägt. Beispiele für solche Ressourcen sind:

  1. Bestimmte TCP- oder UDP-Ports.
  2. Sich gegenseitig ausschließende Sperren ("Mutexe") oder Semaphoren (diese beiden sind häufig auf Betriebssystemebene verwandt)
  3. Dateien (Protokolldateien sind oft die naheliegendste Wahl)

Auf der obersten Ebene, die für den Kunden am schmerzhaftesten ist, kann auf diese Weise auch spezielle Hardware verwendet werden, die (manchmal wie bei einigen Robotersteuerungskomponenten erforderlich) nur von einem einzigen Thread exklusiv verwendet werden kann.

Martin Sojka
quelle
5
Es kann auch nützlich sein, mögliche Sicherheitsprobleme zu berücksichtigen: " Ein Programm mit nur einer Instanz ist eine eigene Dienstverweigerung. "
Genug Tee
Da es in Sandboxie funktioniert, ist es wahrscheinlich nicht das erste. 2 oder 3 sind gute Möglichkeiten. Wenn Sie sich ansehen, welche Dateien für ihre Prozesse geöffnet sind, wird dies wahrscheinlich genau zutreffen.
Doug-W
3
@ Doug-W Ich sehe nicht ein, wie es funktioniert, wenn Sandboxie # 1 ausschließt.
AttackingHobo
@AttackingHobo Wenn ich die Komplexität von Sandboxie nicht verstanden habe, würde die Tatsache, dass ein Port außerhalb von Sandboxie gebunden ist, nicht verhindern, dass er innerhalb von Sandboxie gebunden wird? Oder bietet Sandboxie eine virtuelle Oberfläche für jedes darin ausgeführte Programm?
Doug-W
@Vigil Soweit es mich betrifft, können Sie Raymond Chen den ganzen Tag zitieren, aber bitte fügen Sie seinen Zitaten keine grammatikalischen Fehler hinzu. : P (Kopieren Sie sie einfach, und fügen Sie sie stattdessen ein.)
Heimbürger
4

Ich empfehle den Mutex-Ansatz, aber:

Eine andere häufig verwendete Methode ist die einfache Überprüfung, ob ein anderer Prozess mit demselben Namen ausgeführt wird.

Der Vorteil ist, dass es lächerlich einfach ist - Sie müssen sich keine Gedanken über Dateiberechtigungen machen oder wissen, was ein Mutex ist. Der Nachteil ist, dass Sie ein falsches Positiv erhalten, wenn ein anderes aufgerufenes Programm starcraft2.exeauf dem Computer ausgeführt wird.

BlueRaja - Danny Pflughoeft
quelle
2
Hehe, oder wenn der Benutzer beschließt, das Programm umzubenennen.
Brandon
@ Jonathan: Dann codiere den ausführbaren Namen nicht
hart
1
Ich meinte eher, was ist, wenn der Benutzer das Programm kopiert und umbenennt und es zweimal ausführt?
Brandon
3

Wenn Sie C ++ und die Windows-API verwenden, können FindWindowSie unter anderem Parameter wie den Klassennamen und / oder den Fensternamen übergeben. Wenn Sie dann eine Übereinstimmung finden, beenden Sie einfach Ihr Programm, bevor Sie überhaupt ein Fenster laden oder erstellen.

SourceTurtle
quelle