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


11

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

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

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

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

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


3
Windowsアプリケーションは、デフォルトではシングルトンではありません。もしそうなら、それは誰かがそれをシングルトンにするために余分な努力を払ったことを意味し、おそらくそうする理由があります。
インシリコ2010年

1
アプリケーションが複数のコピーをチェックする方法によって異なります。さまざまなアプリケーションがさまざまな方法でチェックし、一部のアプリケーションは複数の方法でチェックします。
ho1 2010

In Silicoが言っているように、それはおそらく良い考えではありません。アプリが意図しないときに複数のコピーを実行すると、データが破損したり、クラッシュしたり、その他の問題が発生したりする可能性があります。
ho1 2010

プロセスが単一のインスタンスのみの実行を強制できる多くの方法があります。これを防ぐことができる汎用的なツールを構築するのは現実的ではないと思います。各アプリケーションを個別に調べ、そのアプリケーション用に特別に調整されたものを記述する必要があります。

解決策を見つけましたか?
トーマス

回答:


2

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

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


すべての回答をありがとう。ツールには注意深い設計が必要だと思います。想定されるツールは、ウィンドウの完全なコピーの実行を含まないが、すべてのアプリケーションをだましている、非常に軽量な仮想OS環境のようなものである必要があります。
Jus12

4

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

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

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


3

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


2

可能です!

これは、同じ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.0

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

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


ミュータントハンドルを閉じるとうまくいきます。これは半減期ではありませんが、プログラマー側でミューテックスを使用することはかなり一般的であるため、このソリューションは一種の一般的なものです。
AZ。

1

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


0

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

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

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