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.
fuente
Respuestas:
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
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.
fuente
Puede ejecutar la aplicación en diferentes cuentas de usuarios y la comprobación de instancias ya no funcionará.
fuente
¡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.
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
fuente
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.
fuente
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.
fuente