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.
fonte
Respostas:
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.
fonte
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.
fonte
Você pode executar aplicativos em contas de usuários diferentes e a verificação de instância não funcionará mais.
fonte
É 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.
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
fonte
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.
fonte
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.
fonte