Esegui più istanze di qualsiasi applicazione Windows


11

Supponiamo che un autore abbia imposto che la sua applicazione Windows sia una singola istanza. Esiste un modo per creare più istanze di questa applicazione (a parte l'esecuzione in una macchina virtuale o la richiesta all'autore di riscrivere l'app)?

Se esiste uno strumento readymade, vorrei conoscerlo. (Ho provato sandboxie e Altiris SVS senza fortuna).

Se non c'è niente là fuori, voglio programmare uno strumento / hack che mi permetta di farlo. Sto cercando indicazioni da dove cominciare: cosa sarà coinvolto, quali competenze sarebbero necessarie. Ho capacità di programmazione moderate in C e Java.

Se ciò non è possibile, spiegare perché.

EDIT: so che è una cattiva idea, ma ho ancora bisogno di farlo (per vari motivi). Voglio un modo generico che funzioni per qualsiasi applicazione e non presenti errori.


3
Le applicazioni Windows non sono singleton per impostazione predefinita. Se lo sono, significa che qualcuno ha fatto lo sforzo extra per renderlo un singleton e probabilmente ha una ragione per farlo.
In silico,

1
Dipende da come l'applicazione verifica più copie. Varie applicazioni controllano in modi diversi e alcune applicazioni controllano in più modi.
ho1

Come dice In Silico, probabilmente non è una buona idea. L'app potrebbe corrompere i dati, arrestarsi in modo anomalo o causare altri problemi se hai più copie in esecuzione quando non sono destinate.
ho1

Esistono molti modi in cui un processo può imporre l'esecuzione di una sola istanza; Non credo sia possibile costruire uno strumento generico in grado di impedirlo. Dovresti esaminare ogni domanda individualmente e scrivere qualcosa su misura per essa.

Hai trovato una soluzione?
Tomas,

Risposte:


2

Molte applicazioni controllano l'elenco globale dei processi (con EnumProcesses, OpenProcess, GetModuleBaseName e funzioni simili) o l'elenco di finestre (con EnumWindows, EnumChildWindows).

Puoi provare a impostare l'hook (vedi esempi SetWindowsHookEx, CallNextHookEx, ecc.) Per agganciare quelle specifiche chiamate di funzione API da quell'applicazione e sostituire i dati richiesti in risposta con i tuoi per ingannare l'applicazione.


Grazie per tutte le risposte Immagino che lo strumento abbia bisogno di un design accurato. Lo strumento previsto dovrebbe essere in qualche modo simile a un ambiente di sistema operativo virtuale molto leggero che non comporta l'esecuzione di una copia completa di Windows, ma ingannare tutte le applicazioni.
Jus12

4

Non esiste un modo generico perché diverse applicazioni utilizzano metodi diversi. Molti dei metodi prevedono il tentativo di ottenere alcune risorse a livello di macchina (o, almeno, a livello di utente) (ad esempio, un oggetto di sincronizzazione denominato, un file con un nome e una posizione noti o un valore di registro). Se l'app ha esito positivo, mantiene tale risorsa finché viene eseguita. Se fallisce perché un'altra istanza contiene già la risorsa, potrebbe provare a segnalare l'istanza originale in modo che possa rispondere.

In Windows a 16 bit, all'avvio di un programma, il sistema operativo gli ha passato un handle unico chiamato HINSTANCE. Sarebbe inoltre passato l'INSTANZA di un processo attualmente in esecuzione utilizzando lo stesso eseguibile (se presente). A quei tempi, quello era probabilmente il modo più comune per il programma di sapere se una copia era già in esecuzione. In Windows a 32 bit, con memoria protetta, spazi degli indirizzi specifici del processo e fine del multitasking cooperativo, le HINSTANCE non avevano più lo stesso significato.

Un piccolo numero di app lo fa semplicemente per "usabilità", ma per molte altre potrebbe esserci una buona ragione per imporre i singoli. Bypass che potrebbe portare alla corruzione dei dati o alla mancata esecuzione.


3

È possibile eseguire l'applicazione su account di utenti diversi e il controllo delle istanze non funzionerà più.


2

È possibile!

Ecco un'immagine di me che esegue l'emivita 1 4x in 4 finestre tutte collegate allo stesso server LAN, l'unico problema è che i controller non sono collegati in modo indipendente a ciascuna finestra.

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

Per fare questo, hai bisogno di 'Process Explorer' - un programma che ti permette di fare ciò che è noto come 'Close Handle' nel sotto-processo '\ BaseNamedObjects \ ValveHalfLifeLauncherMutex' o qualcosa del genere. non è così difficile. vai qui per istruzioni dettagliate - http://am.half-lifecreations.com/forums/index.php?topic=479.0

Ma sì, questo è per l'emivita, ma ottieni Process Explorer e sono sicuro che sarai in grado di trovare quale handle / processo devi chiudere per ottenere i programmi che desideri eseguire più volte.

Non vedo perché Windows non implementa i giochi più volte in split / snap come funzionalità comunque! è chiaramente perché la gente non acquisterebbe più PC ... controlla anche SoftXSpand davvero fantastico, ti consente di eseguire più istanze di Windows come utenti indipendenti


Chiudere una maniglia mutante funziona per me. Non è un'emivita, ma l'uso di un mutex da parte del programmatore è piuttosto comune, quindi questa soluzione è piuttosto generica.
AZ.

1

Blocca file, named pipe ed eventi di sincronizzazione sono alcuni dei modi più comuni utilizzati dalle applicazioni per verificare che siano l'unica istanza in esecuzione. Per aggirare i file di blocco dovresti o virtualizzare il file system, agganciarlo o eseguire un'eliminazione accuratamente programmata (e ciò potrebbe non funzionare se blocca anche il file aperto). Le pipe con nome e gli eventi di sincronizzazione saranno molto più difficili perché non si ha lo stesso controllo dall'esterno dell'applicazione che si fa con i file.


0

In Windows 8 e versioni successive, tieni premuto il tasto Maiusc e fai clic sull'icona / pulsante dei programmi sulla barra delle applicazioni. Ciò avvierà nuovamente l'eseguibile. Se l'app non controlla automaticamente i cloni, avrai una nuova finestra.

Ciò naturalmente creerà potenzialmente conflitti con i file interni dell'app se si apre ad esempio un file sqlite interno, quindi è necessario sapere davvero cosa si sta facendo o non preoccuparsi se qualcosa si rompe.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.