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.
Réponses:
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
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.
la source
Vous pouvez exécuter l'application sur différents comptes d'utilisateurs et la vérification des instances ne fonctionnera plus.
la source
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.
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
la source
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.
la source
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.
la source