Führen Sie mehrere Instanzen einer Windows-Anwendung aus

11

Angenommen, ein Autor hat seine Windows-Anwendung als Einzelinstanz erzwungen. Gibt es eine Möglichkeit, mehrere Instanzen dieser Anwendung zu erstellen (abgesehen von der Ausführung in einer virtuellen Maschine oder der Aufforderung an den Autor, die App neu zu schreiben)?

Wenn es ein fertiges Tool gibt, würde ich es gerne wissen. (Ich habe Sandboxie und Altiris SVS ohne Glück ausprobiert).

Wenn es da draußen nichts gibt, möchte ich ein Tool / einen Hack programmieren, mit dem ich dies tun kann. Ich suche nach Hinweisen, wo ich anfangen soll - was involviert sein wird, welche Fähigkeiten benötigt würden. Ich habe moderate Programmierkenntnisse in C und Java.

Wenn dies nicht möglich ist, erklären Sie bitte warum.

EDIT: Ich weiß, es ist eine schlechte Idee, aber ich muss es noch tun (aus verschiedenen Gründen). Ich möchte eine generische Methode, die für jede Anwendung funktioniert und keine Fehler verursacht.

Jus12
quelle
3
Windows-Anwendungen sind standardmäßig keine Singletons. Wenn dies der Fall ist, bedeutet dies, dass jemand zusätzliche Anstrengungen unternimmt, um daraus einen Singleton zu machen, und wahrscheinlich einen Grund dafür hat.
In Silico
1
Hängt davon ab, wie die Anwendung nach mehreren Kopien sucht. Verschiedene Anwendungen prüfen auf unterschiedliche Weise, und einige Anwendungen prüfen auf verschiedene Weise.
ho1
Wie In Silico jedoch sagt, ist es wahrscheinlich keine gute Idee. Die App kann Daten beschädigen, abstürzen oder andere Probleme verursachen, wenn mehrere Kopien ausgeführt werden, wenn dies nicht beabsichtigt ist.
ho1
Es gibt viele Möglichkeiten, wie ein Prozess die Ausführung nur einer einzelnen Instanz erzwingen kann. Ich denke nicht, dass es machbar ist, ein generisches Tool zu entwickeln, das dies verhindern kann. Sie müssten jede Anwendung einzeln prüfen und etwas speziell auf sie zugeschnittenes schreiben.
Haben Sie eine Lösung gefunden?
Tomas

Antworten:

2

Viele Anwendungen überprüfen die globale Liste der Prozesse (mit EnumProcesses, OpenProcess, GetModuleBaseName und ähnlichen Funktionen) oder die Liste der Fenster (mit EnumWindows, EnumChildWindows).

Sie können versuchen, den Hook festzulegen (siehe Beispiele SetWindowsHookEx, CallNextHookEx usw.), um diese spezifischen API-Funktionsaufrufe von dieser Anwendung zu verknüpfen und die angeforderten Daten als Antwort durch Ihre zu ersetzen, um die Anwendung zu täuschen.


quelle
Danke für alle Antworten. Ich denke, das Tool muss sorgfältig entworfen werden. Das geplante Tool sollte einer sehr leichten virtuellen Betriebssystemumgebung ähneln, in der keine vollständige Kopie von Windows ausgeführt wird, jedoch alle Anwendungen zum Narren gehalten werden.
Jus12
4

Es gibt keinen generischen Weg, da verschiedene Anwendungen unterschiedliche Methoden verwenden. Bei vielen Methoden wird versucht, eine maschinenweite (oder zumindest benutzerweite) Ressource abzurufen (z. B. ein benanntes Synchronisationsobjekt, eine Datei mit einem bekannten Namen und Speicherort oder einen Registrierungswert). Wenn die App erfolgreich ist, enthält sie diese Ressource, solange sie ausgeführt wird. Wenn dies fehlschlägt, weil eine andere Instanz die Ressource bereits enthält, versucht sie möglicherweise, die ursprüngliche Instanz zu signalisieren, damit sie antworten kann.

In 16-Bit-Windows hat das Betriebssystem beim Start eines Programms ein eindeutiges Handle namens HINSTANCE übergeben. Es wird auch der HINSTANCE eines aktuell ausgeführten Prozesses mit derselben ausführbaren Datei (falls vorhanden) übergeben. In jenen Tagen war dies wahrscheinlich die häufigste Methode für das Programm, um festzustellen, ob bereits eine Kopie ausgeführt wurde. In 32-Bit-Windows mit geschütztem Speicher, prozessspezifischen Adressräumen und dem Ende des kooperativen Multitasking hatten die HINSTANCEs nicht mehr dieselbe Bedeutung.

Eine kleine Anzahl von Apps tut dies einfach aus Gründen der "Benutzerfreundlichkeit", aber für viele andere gibt es möglicherweise einen guten Grund, Singletons durchzusetzen. Umgehen, das zu Datenbeschädigung führen oder einfach nicht ausgeführt werden kann.

Adrian McCarthy
quelle
3

Sie können die Anwendung auf verschiedenen Benutzerkonten ausführen, und die Instanzprüfung funktioniert nicht mehr.

Tomas
quelle
2

Es ist möglich!

Hier ist ein Bild von mir, wie ich die Halbwertszeit 1 4x in 4 Fenstern ausführe, die alle mit demselben LAN-Server verbunden sind. Das einzige Problem ist, dass die Controller nicht unabhängig mit jedem Fenster verbunden sind.

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

Dazu benötigen Sie 'Process Explorer' - ein Programm, mit dem Sie den so genannten 'Close Handle' für den Unterprozess '\ BaseNamedObjects \ ValveHalfLifeLauncherMutex' ausführen können. es ist nicht so schwer. Detaillierte Anweisungen finden Sie hier - http://am.half-lifecreations.com/forums/index.php?topic=479.0

Aber ja, das ist für die Halbwertszeit, aber holen Sie sich den Prozess-Explorer und ich bin sicher, dass Sie herausfinden können, welches Handle / welchen Prozess Sie schließen müssen, damit die gewünschten Programme mehrmals ausgeführt werden.

Ich verstehe nicht, warum Windows das Ausführen von Spielen nicht mehrmals in Splits / Snaps als Feature implementiert! Es ist klar, weil die Leute nicht so viele PCs kaufen würden ... Schauen Sie sich auch SoftXSpand an, das wirklich fantastisch ist und es Ihnen ermöglicht, mehrere Instanzen von Windows als unabhängige Benutzer auszuführen

Tonton
quelle
Schließen Sie einen Mutantengriff, der für mich funktioniert. Es ist keine Halbwertszeit, aber die Verwendung eines Mutex auf der Seite des Programmierers ist ziemlich häufig, so dass diese Lösung eher generisch ist.
AZ.
1

Sperrdateien, Named Pipes und Synchronisationsereignisse sind einige der häufigsten Methoden, mit denen Anwendungen überprüfen, ob sie die einzige ausgeführte Instanz sind. Um Sperrdateien zu umgehen, müssten Sie entweder das Dateisystem virtualisieren, sich daran anschließen oder einen sorgfältig zeitgesteuerten Löschvorgang durchführen (und dies funktioniert möglicherweise nicht, wenn die Datei auch geöffnet wird). Named Pipes und Synchronisationsereignisse sind viel schwieriger, da Sie außerhalb der Anwendung nicht die gleiche Kontrolle haben wie mit Dateien.

the_mandrill
quelle
0

In Windows 8 und höher halten Sie die Umschalttaste gedrückt und klicken auf das Programmsymbol / die Schaltfläche in der Taskleiste. Dadurch wird die ausführbare Datei erneut gestartet. Wenn die App nicht selbst nach Klonen sucht, wird ein neues Fenster angezeigt.

Dies führt natürlich möglicherweise zu Konflikten mit den internen Dateien der App, wenn beispielsweise eine interne SQLite-Datei geöffnet wird. Sie müssen also wirklich wissen, was Sie tun, oder es ist Ihnen egal, ob etwas kaputt geht.

Costin Gușă
quelle