Ejecute múltiples instancias de cualquier aplicación de Windows

11

Supongamos que algún autor ha forzado que su aplicación de Windows sea de instancia única. ¿Hay alguna forma de hacer múltiples instancias de esta aplicación (aparte de ejecutarla dentro de una máquina virtual o solicitarle al autor que reescriba la aplicación)?

Si hay una herramienta preparada, me gustaría saberlo. (He probado sandboxie y Altiris SVS sin suerte).

Si no hay nada por ahí, quiero programar una herramienta / hack que me permita hacer esto. Estoy buscando indicadores por dónde comenzar: qué implicará, qué habilidades serían necesarias. Tengo habilidades de programación moderadas en C y Java.

Si esto no se puede hacer, explique por qué.

EDITAR: Sé que es una mala idea, pero aún necesito hacerlo (por varias razones). Quiero una forma genérica que funcione para cualquier aplicación y no introduzca errores.

Jus12
fuente
3
Las aplicaciones de Windows no son singletons por defecto. Si lo son, significa que alguien hizo un esfuerzo adicional para que sea un singleton y probablemente tenga una razón para hacerlo.
En silico
1
Depende de cómo la aplicación esté buscando múltiples copias. Varias aplicaciones verifican de diferentes maneras y algunas aplicaciones verifican de múltiples maneras.
ho1
Sin embargo, como dice In Silico, probablemente no sea una buena idea. La aplicación puede corromper datos, bloquearse o causar otros problemas si tiene varias copias ejecutándose cuando no están destinadas a hacerlo.
ho1
Hay muchas formas en que un proceso puede exigir la ejecución de una sola instancia; No creo que sea factible construir una herramienta genérica capaz de prevenir esto. Tendría que examinar cada aplicación individualmente y escribir algo diseñado específicamente para ella.
¿Has encontrado una solución?
Tomás

Respuestas:

2

Muchas aplicaciones verifican la lista global de procesos (con EnumProcesses, OpenProcess, GetModuleBaseName y funciones similares) o la lista de ventanas (con EnumWindows, EnumChildWindows).

Puede intentar establecer un enlace (consulte los ejemplos de SetWindowsHookEx, CallNextHookEx, etc.) para conectar esas llamadas de función API específicas de esa aplicación y reemplazar los datos solicitados en respuesta con los suyos para engañar a la aplicación.


fuente
Gracias por todas las respuestas. Supongo que la herramienta necesita un diseño cuidadoso. La herramienta prevista debería ser algo así como un entorno de SO virtual muy liviano que no implica ejecutar una copia completa de Windows, pero que engaña a todas las aplicaciones.
Jus12
4

No hay una forma genérica porque las diferentes aplicaciones usan diferentes métodos. Muchos de los métodos implican tratar de obtener algún recurso en toda la máquina (o, al menos, en todo el usuario) (por ejemplo, un objeto de sincronización con nombre, un archivo con un nombre y ubicación conocidos o un valor de registro). Si la aplicación tiene éxito, entonces retiene ese recurso mientras se ejecuta. Si falla porque otra instancia ya contiene el recurso, entonces podría intentar señalar la instancia original para que pueda responder.

En Windows de 16 bits, cuando se iniciaba un programa, el sistema operativo le pasaba un identificador único llamado HINSTANCE. También se le pasaría la HINSTANCE de un proceso actualmente en ejecución utilizando el mismo ejecutable (si lo hay). En aquellos días, esa era probablemente la forma más común para que el programa supiera si ya se estaba ejecutando una copia. En Windows de 32 bits, con memoria protegida, espacios de direcciones específicos del proceso y el fin de la multitarea cooperativa, los HINSTANCE ya no tenían el mismo significado.

Una pequeña cantidad de aplicaciones hace esto simplemente por "usabilidad", pero para muchas otras, puede haber una buena razón para aplicar singletons. Omitir eso podría conducir a la corrupción de datos o simplemente no funcionar.

Adrian McCarthy
fuente
3

Puede ejecutar la aplicación en diferentes cuentas de usuarios y la comprobación de instancias ya no funcionará.

Tomás
fuente
2

¡Es posible!

Aquí hay una imagen de mí ejecutando Half-Life 1 4x en 4 ventanas, todas conectadas al mismo servidor LAN, el único problema es que los controladores no están vinculados de forma independiente a cada ventana.

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

Para hacer esto, necesita 'Process Explorer', un programa que le permite hacer lo que se conoce como 'Cerrar Handle' en el subproceso '\ BaseNamedObjects \ ValveHalfLifeLauncherMutex' o algo así. no es tan dificil. vaya aquí para obtener instrucciones detalladas: http://am.half-lifecreations.com/forums/index.php?topic=479.0

Pero sí, eso es para la vida media, pero obtenga Process Explorer y estoy seguro de que podrá encontrar qué manejador / proceso necesita cerrar para obtener los programas que desea ejecutar varias veces.

¡No veo por qué Windows no implementa los juegos en ejecución varias veces en divisiones / instantáneas como una característica de todos modos! es claramente porque la gente no compraría tantas PC ... también echa un vistazo a SoftXSpand realmente increíble, te permite ejecutar múltiples instancias de Windows como usuarios independientes

Tonton
fuente
Cerrar un mango mutante me funciona. No es vida media, pero usar un mutex en el lado del programador es bastante común, por lo que esta solución es algo genérica.
AZ.
1

Los archivos de bloqueo, las canalizaciones con nombre y los eventos de sincronización son algunas de las formas comunes en que las aplicaciones usan para verificar que son la única instancia en ejecución. Para evitar los archivos bloqueados, deberá virtualizar el sistema de archivos, conectarlo o eliminarlo cuidadosamente (y eso puede no funcionar si también bloquea el archivo). Las canalizaciones con nombre y los eventos de sincronización serán mucho más difíciles porque no tiene el mismo control desde fuera de la aplicación que tiene con los archivos.

the_mandrill
fuente
0

En Windows 8 y versiones posteriores, mantienes presionada la tecla Mayús y haces clic en el ícono / botón de los programas en la barra de tareas. Esto lanzará el ejecutable nuevamente. Si la aplicación no verifica automáticamente los clones, tendrá una nueva ventana.

Por supuesto, esto podría crear conflictos con los archivos internos de la aplicación si abre, por ejemplo, un archivo sqlite interno, por lo que realmente debe saber lo que está haciendo o no le importa si algo se rompe.

Costin Gușă
fuente