web-dev-qa-db-ja.com

Windowsアプリケーションの複数のインスタンスを実行する

一部の作成者が自分のWindowsアプリケーションを単一インスタンスに強制したとします。このアプリケーションの複数のインスタンスを作成する方法はありますか(仮想マシン内で実行することや、作成者にアプリの書き換えを要求することを除く)?

既成のツールがあれば教えてください。 (私は運のないサンドボックスとAltiris SVSを試しました)。

そこに何もない場合、私はこれを可能にするツール/ハックをプログラムしたいと思います。どこから始めればよいか、何が必要か、どのようなスキルが必要かについての指針を探しています。 CとJavaのプログラミングスキルは中程度です。

これができない場合は、その理由を説明してください。

編集:私はその悪い考えを知っていますが、それでも(さまざまな理由で)行う必要があります。どのアプリケーションでも機能し、エラーが発生しない一般的な方法が必要です。

11
Jus12

多くのアプリケーションは、プロセスのグローバルリスト(EnumProcesses、OpenProcess、GetModuleBaseNameなどの関数を使用)またはウィンドウのリスト(EnumWindows、EnumChildWindowsを使用)をチェックします。

フックを設定して(サンプルSetWindowsHookEx、CallNextHookExなどを参照)、そのアプリケーションからの特定のAPI関数呼び出しをフックして、要求されたデータを自分のものに置き換え、アプリケーションをだますことができます。

2
Dennis Crane

異なるアプリケーションが異なる方法を使用するため、一般的な方法はありません。多くの方法では、マシン全体(または、少なくともユーザー全体)のリソース(名前付き同期オブジェクト、既知の名前と場所が指定されたファイル、レジストリ値など)を取得しようとします。アプリが成功すると、実行中はそのリソースが保持されます。別のインスタンスがすでにリソースを保持しているために失敗した場合、元のインスタンスに信号を送って応答できるようにする可能性があります。

16ビットWindowsでは、プログラムが起動すると、OSはHINSTANCEと呼ばれる一意のハンドルをプログラムに渡しました。同じ実行可能ファイル(存在する場合)を使用して、現在実行中のプロセスのHINSTANCEも渡されます。当時、これはおそらく、コピーが既に実行されているかどうかをプログラムが知るための最も一般的な方法でした。 32ビットWindowsでは、保護されたメモリ、プロセス固有のアドレススペース、および協調マルチタスクの終了により、HINSTANCEは同じ意味を持たなくなりました。

少数のアプリが単に「使いやすさ」のためにこれを実行しますが、他の多くのアプリにとっては、シングルトンを適用する正当な理由があるかもしれません。これをバイパスすると、データが破損したり、単に実行できなくなる可能性があります。

4
Adrian McCarthy

さまざまなユーザーアカウントでアプリケーションを実行でき、インスタンスチェックは機能しなくなります。

3
Tomas

可能です!

これは、同じLANサーバーにすべて接続された4つのウィンドウで半減期1 4xを実行している画像です。唯一の問題は、コントローラーが各ウィンドウに個別にリンクされていないことです。

https://web.archive.org/web/20150315150158if_/http://img29.imageshack.us/img29/5642/yc0y.jpg

これを行うには、「Process Explorer」が必要です。これは、「\ BaseNamedObjects\ValveHalfLifeLauncherMutex」サブプロセスなどで「ハンドルを閉じる」と呼ばれる処理を実行できるプログラムです。それほど難しいことではありません。詳細な手順については、ここにアクセスしてください- http://am.half-lifecreations.com/forums/index.php?topic=479.

しかし、そうです、それは半減期ですが、Process Explorerを入手して、複数回実行したいプログラムを取得するために閉じる必要があるハンドル/プロセスを見つけることができると確信しています。

とにかく、ウィンドウがスプリット/スナップでゲームを複数回実行する機能を実装していない理由がわかりません!それは明らかに人々がそれほど多くのPCを購入しないためです... SoftXSpandも本当に素晴らしいので、独立したユーザーとしてウィンドウの複数のインスタンスを実行できます

2
Tonton

ロックファイル、名前付きパイプ、および同期イベントは、アプリケーションが実行中の唯一のインスタンスであることを確認するためにアプリケーションが使用する一般的な方法の一部です。ロックファイルを回避するには、ファイルシステムを仮想化するか、ファイルシステムをフックするか、または慎重にタイミングを指定して削除する必要があります(ファイルをロックして開いていると機能しない場合があります)。名前付きパイプと同期イベントは、ファイルの場合と同じようにアプリケーションの外部から制御できないため、はるかに困難になります。

1
the_mandrill

Windows 8以降では、Shiftキーを押しながらタスクバーのプログラムのアイコン/ボタンをクリックします。これにより、実行可能ファイルが再び起動します。アプリがクローンをセルフチェックしない場合は、新しいウィンドウが表示されます。

もちろん、内部のsqliteファイルなどを開くと、アプリの内部ファイルとの競合が発生する可能性があります。そのため、何をしているのかを本当に理解している必要があります。

0
Costin Gușă