ゲームはどうして人々が自分自身の複数のインスタンスを実行するのを防ぐことができますか?


回答:


15

Starcraft 2とは別に、これに対する一般的な答えは、オペレーティングシステムから特定のリソースを取得(および取得自体がまだロックと同等でない場合はロック)することです。取得/ロックに失敗した場合、ゲームを終了します。そのようなリソースの例は次のとおりです。

  1. 特定のTCPまたはUDPポート。
  2. 相互に排他的なロック(「ミューテックス」)またはセマフォ(これら2つは、OSレベルで関連していることが多い)
  3. ファイル(多くの場合、ログファイルが最も明白な選択です)

顧客のやり方で一番苦労しているのは、(場合によっては、一部のロボット制御コンポーネントのように)単一のスレッドでのみ使用できる特殊なハードウェアも、この方法で使用できることです。


5
また、考えられるセキュリティの複雑さを念頭に置いておくと役立つ場合があります。「単一インスタンスのプログラムは、それ自体がサービス拒否です」。
EnoughTea

Sandboxieで動作するため、おそらく最初ではないでしょう。2または3が適切な可能性があります。どのファイルがプロセスに対して開いているかを調べると、おそらくそれが特定されます。
ダグW

3
@ Doug-W Sandboxieでの動作が#1を除外する方法がわかりません。
AttackingHobo

@AttackingHoboは、sandboxieの複雑さを理解していない限り、ポートがsandboxieの外部にバインドされているという事実が、内部でのバインドを妨げないでしょうか?または、sandboxieは、その中で実行される各プログラムに仮想インターフェイスを提供しますか?
ダグW

@Vigil私に関する限り、あなたはレイモン・チェンを一日中引用するかもしれませんが、彼の引用に文法的な誤りを加えないでください。:P(代わりにコピー/貼り付けしてください。)
hheimbuerger

4

mutexアプローチをお勧めしますが、次の点に注意してください。

よく使用される別の方法は、同じ名前の別のプロセスが実行されているかどうかを単純に確認することです。

利点はとてつもなく簡単だということです。ファイルのアクセス権を心配したり、ミューテックスとは何かを知る必要はありません。欠点は、呼び出された別のプログラムstarcraft2.exeがマシン上で実行されている場合、偽陽性になることです。


2
Hehe、またはユーザーがプログラムの名前を変更する場合。
ブランドン

@ジョナサン:実行可能な名前をハードコーディングしないでください...
BlueRaja-ダニーPflughoeft

1
ユーザーがプログラムをコピーして名前を変更し、2回実行するとどうなるでしょうか。
ブランドン

3

C ++とWindows APIを使用している場合FindWindow、できる方法の1つは、クラス名やウィンドウ名などのパラメーターを渡すことができるを使用することです。一致するものが見つかった場合は、ウィンドウをロードまたは作成する前にプログラムを終了するだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.