Executar várias instâncias de qualquer aplicativo do Windows


11

Suponha que algum autor imponha seu aplicativo Windows como instância única. Existe alguma maneira de criar várias instâncias desse aplicativo (além de executar dentro de uma máquina virtual ou solicitar ao autor que reescreva o aplicativo)?

Se houver uma ferramenta pronta, eu gostaria de conhecê-la. (Eu tentei sandboxie e Altiris SVS sem sorte).

Se não houver nada lá fora, quero programar uma ferramenta / hack que me permita fazer isso. Estou procurando indicadores por onde começar - o que estará envolvido, que habilidades seriam necessárias. Eu tenho habilidades moderadas de programação em C e Java.

Se isso não puder ser feito, explique o motivo.

EDIT: Eu sei que é uma má ideia, mas ainda preciso fazê-lo (por várias razões). Eu quero uma maneira genérica que funcione para qualquer aplicativo e não introduza erros.


3
Aplicativos do Windows não são singletons por padrão. Se estiverem, significa que alguém se esforçou para torná-lo um singleton e provavelmente tem um motivo para fazê-lo.
In silico

1
Depende de como o aplicativo está verificando várias cópias. Vários aplicativos são verificados de maneiras diferentes e alguns aplicativos são verificados de várias maneiras.
ho1 20/07/10

Como diz In Silico, provavelmente não é uma boa ideia. O aplicativo pode corromper os dados, travar ou causar outros problemas se você tiver várias cópias em execução quando elas não forem necessárias.
ho1 20/07/10

Há muitas maneiras pelas quais um processo pode impor a execução de apenas uma única instância; Não acho viável criar uma ferramenta genérica capaz de evitar isso. Você precisaria examinar cada aplicativo individualmente e escrever algo personalizado especificamente para ele.

Você encontrou uma solução?
Tomas

Respostas:


2

Muitos aplicativos verificam a lista global de processos (com EnumProcesses, OpenProcess, GetModuleBaseName e funções similares) ou a lista de janelas (com EnumWindows, EnumChildWindows).

Você pode tentar definir o hook (consulte os exemplos SetWindowsHookEx, CallNextHookEx, etc) para conectar essas chamadas de função API específicas desse aplicativo e substituir os dados solicitados em resposta aos seus para enganar o aplicativo.


Obrigado por todas as respostas. Eu acho que a ferramenta precisa de um design cuidadoso. A ferramenta prevista deve ser um pouco como um ambiente de SO virtual muito leve que não envolve a execução de uma cópia completa do Windows, mas engana todos os aplicativos.
precisa saber é o seguinte

4

Não existe uma maneira genérica, porque aplicativos diferentes usam métodos diferentes. Muitos dos métodos envolvem a tentativa de obter algum recurso em toda a máquina (ou pelo menos em todo o usuário) (por exemplo, um objeto de sincronização nomeado, um arquivo com um nome e local conhecidos ou um valor de registro). Se o aplicativo for bem-sucedido, ele manterá esse recurso enquanto for executado. Se falhar porque outra instância já contém o recurso, ele pode tentar sinalizar a instância original para que ela possa responder.

No Windows de 16 bits, quando um programa era iniciado, o sistema operacional passava um identificador exclusivo chamado HINSTANCE. Também seria transmitida a HINSTANCE de um processo atualmente em execução usando o mesmo executável (se houver). Naqueles dias, essa era provavelmente a maneira mais comum de o programa saber se uma cópia já estava em execução. No Windows de 32 bits, com memória protegida, espaços de endereço específicos do processo e o fim da multitarefa cooperativa, os HINSTANCEs não tinham mais o mesmo significado.

Um pequeno número de aplicativos faz isso simplesmente para "usabilidade", mas para muitos outros, pode haver um bom motivo para aplicar singletons. Ignorar isso pode levar à corrupção de dados ou simplesmente à falha na execução.


3

Você pode executar aplicativos em contas de usuários diferentes e a verificação de instância não funcionará mais.


2

É possível!

Aqui está uma imagem de mim executando meia-vida 1 x 4 em 4 janelas, todas conectadas ao mesmo servidor LAN, o único problema é que os controladores não estão sendo vinculados de forma independente a cada janela.

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

Para fazer isso, você precisa do 'Process Explorer' - um programa que permite fazer o que é conhecido como 'Close Handle' no subprocesso '\ BaseNamedObjects \ ValveHalfLifeLauncherMutex' ou algo assim. não é tão difícil. acesse aqui para instruções detalhadas - http://am.half-lifecreations.com/forums/index.php?topic=479.0

Mas sim, isso é para meia-vida, mas obtenha o Process Explorer e tenho certeza de que você poderá encontrar qual manuseio / processo precisa fechar para obter os programas que deseja executar várias vezes.

Eu não vejo por que o Windows não implementa jogos em execução várias vezes em splits / snaps como um recurso de qualquer maneira! é claramente porque as pessoas não compram tantos PCs ... também confira o SoftXSpand realmente incrível, permite que você execute várias instâncias do Windows como usuários independentes


Fechar um identificador mutante funciona para mim. Não é meia-vida, mas o uso de um mutex no lado do programador é bastante comum, portanto essa solução é genérica.
AZ.

1

Arquivos de bloqueio, pipes nomeados e eventos de sincronização são algumas das maneiras comuns que os aplicativos usam para verificar se são a única instância em execução. Para contornar os arquivos de bloqueio, você precisa virtualizar o sistema de arquivos, conectá-lo ou fazer uma exclusão cuidadosamente cronometrada (e isso pode não funcionar se ele também bloquear o arquivo). Os pipes nomeados e os eventos de sincronização serão muito mais difíceis porque você não tem o mesmo controle externo ao aplicativo que possui com os arquivos.


0

No Windows 8 e versões mais recentes, mantenha pressionada a tecla Shift e clique no ícone / botão dos programas na barra de tarefas. Isso iniciará o executável novamente. Se o aplicativo não verificar automaticamente os clones, você terá uma nova janela.

É claro que isso criará potencialmente conflitos com os arquivos internos do aplicativo, se ele abrir, por exemplo, um arquivo interno do sqlite; portanto, você deve realmente saber o que está fazendo ou não se importa se algo quebrar.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.