Exécuter plusieurs instances de n'importe quelle application Windows

11

Supposons qu'un auteur ait appliqué son application Windows comme une seule instance. Existe-t-il un moyen de créer plusieurs instances de cette application (en plus de s'exécuter à l'intérieur d'une machine virtuelle ou de demander à l'auteur de réécrire l'application)?

S'il existe un outil prêt à l'emploi, j'aimerais le savoir. (J'ai essayé Sandboxie et Altiris SVS sans chance).

S'il n'y a rien là-bas, je veux programmer un outil / hack qui me permettra de le faire. Je cherche des conseils par où commencer - ce qui sera impliqué, quelles compétences seraient nécessaires. J'ai des compétences de programmation modérées en C et Java.

Si cela ne peut pas être fait, veuillez expliquer pourquoi.

EDIT: Je sais que c'est une mauvaise idée mais je dois encore le faire (pour diverses raisons). Je veux un moyen générique qui fonctionne pour n'importe quelle application et n'introduit pas d'erreurs.

Jus12
la source
3
Les applications Windows ne sont pas des singletons par défaut. S'ils le sont, cela signifie que quelqu'un a fait l'effort supplémentaire d'en faire un singleton et a probablement une raison de le faire.
In silico
1
Dépend de la façon dont l'application recherche plusieurs copies. Différentes applications vérifient de différentes manières et certaines applications vérifient de plusieurs manières.
ho1
Comme le dit In Silico, ce n'est probablement pas une bonne idée. L'application peut corrompre les données, planter ou causer d'autres problèmes si plusieurs copies sont en cours d'exécution alors qu'elles ne le sont pas.
ho1
Il existe de nombreuses façons qu'un processus peut appliquer en exécutant une seule instance; Je ne pense pas qu'il soit possible de construire un outil générique capable d'empêcher cela. Vous devrez examiner chaque demande individuellement et écrire quelque chose de spécialement conçu pour elle.
Avez-vous trouvé une solution?
Tomas

Réponses:

2

De nombreuses applications vérifient la liste globale des processus (avec EnumProcesses, OpenProcess, GetModuleBaseName et fonctions similaires) ou la liste des fenêtres (avec EnumWindows, EnumChildWindows).

Vous pouvez essayer de définir le raccordement (voir les exemples SetWindowsHookEx, CallNextHookEx, etc.) pour raccorder ces appels de fonction API spécifiques de cette application et remplacer les données demandées en réponse par les vôtres pour tromper l'application.


la source
Merci pour toutes les réponses. Je suppose que l'outil a besoin d'une conception soignée. L'outil envisagé devrait être un peu comme un environnement de système d'exploitation virtuel très léger qui n'implique pas d'exécuter une copie complète de Windows, mais trompe toutes les applications.
Jus12
4

Il n'existe aucun moyen générique car différentes applications utilisent des méthodes différentes. De nombreuses méthodes impliquent d'essayer d'obtenir des ressources à l'échelle de la machine (ou, au moins, à l'échelle de l'utilisateur) (par exemple, un objet de synchronisation nommé, un fichier avec un nom et un emplacement connus, ou une valeur de registre). Si l'application réussit, elle conserve cette ressource tant qu'elle s'exécute. S'il échoue parce qu'une autre instance détient déjà la ressource, il peut alors essayer de signaler l'instance d'origine afin qu'elle puisse répondre.

Dans Windows 16 bits, lorsqu'un programme démarre, le système d'exploitation lui transmet un descripteur unique appelé HINSTANCE. Il serait également passé la HINSTANCE d'un processus en cours d'exécution en utilisant le même exécutable (le cas échéant). À cette époque, c'était probablement le moyen le plus courant pour le programme de savoir si une copie était déjà en cours d'exécution. Dans Windows 32 bits, avec une mémoire protégée, des espaces d'adressage spécifiques aux processus et la fin du multitâche coopératif, les HINSTANCE n'avaient plus la même signification.

Un petit nombre d'applications le font simplement pour "l'utilisabilité", mais pour beaucoup d'autres, il peut y avoir une bonne raison d'appliquer des singletons. Contournement qui pourrait entraîner une corruption des données ou tout simplement ne pas fonctionner.

Adrian McCarthy
la source
3

Vous pouvez exécuter l'application sur différents comptes d'utilisateurs et la vérification des instances ne fonctionnera plus.

Tomas
la source
2

C'est possible!

Voici une image de moi exécutant demi-vie 1 4x dans 4 fenêtres toutes connectées au même serveur LAN, le seul problème est que les contrôleurs ne sont pas liés indépendamment à chaque fenêtre.

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

Pour ce faire, vous avez besoin de 'Process Explorer' - un programme qui vous permet de faire ce qui est connu comme 'Fermer la poignée' sur le sous-processus '\ BaseNamedObjects \ ValveHalfLifeLauncherMutex' ou quelque chose. ce n'est pas si dur. allez ici pour des instructions détaillées - http://am.half-lifecreations.com/forums/index.php?topic=479.0

Mais oui, c'est pour la demi-vie, mais obtenez Process Explorer et je suis sûr que vous serez en mesure de trouver la poignée / le processus que vous devez fermer afin d'obtenir les programmes que vous souhaitez exécuter plusieurs fois.

Je ne vois pas pourquoi Windows n'implémente pas les jeux en cours d'exécution plusieurs fois en fractionnements / snaps en tant que fonctionnalité! C'est clairement parce que les gens n'achèteraient pas autant de PC ... consultez également SoftXSpand vraiment génial, vous permet d'exécuter plusieurs instances de fenêtres en tant qu'utilisateurs indépendants

Tonton
la source
Fermer une poignée mutante fonctionne pour moi. Ce n'est pas la demi-vie, mais l'utilisation d'un mutex du côté du programmeur est assez courante, donc cette solution est plutôt générique.
AZ.
1

Les fichiers de verrouillage, les canaux nommés et les événements de synchronisation sont quelques-uns des moyens couramment utilisés par les applications pour vérifier qu'ils sont la seule instance en cours d'exécution. Pour contourner les fichiers de verrouillage, vous devez soit virtualiser le système de fichiers, y connecter ou effectuer une suppression minutieuse (et cela peut ne pas fonctionner s'il verrouille également le fichier ouvert). Les canaux nommés et les événements de synchronisation seront beaucoup plus difficiles car vous n'avez pas le même contrôle depuis l'extérieur de l'application que vous ne le faites avec les fichiers.

the_mandrill
la source
0

Sous Windows 8 et versions ultérieures, vous maintenez la touche Maj enfoncée et cliquez sur l'icône / le bouton des programmes dans la barre des tâches. Cela lancera à nouveau l'exécutable. Si l'application ne vérifie pas automatiquement les clones, vous aurez une nouvelle fenêtre.

Cela créera bien sûr potentiellement des conflits avec les fichiers internes de l'application si elle ouvre par exemple un fichier sqlite interne, vous devez donc vraiment savoir ce que vous faites ou ne vous souciez pas si quelque chose se casse.

Costin Gușă
la source