2010-08-31 10 views
6

Ho impostato un'estensione di file nel Registro di sistema per il mio programma as Windows requires.Come posso ottenere la mia associazione file per aprire più file in un'istanza di singolo programma?

Nel Registro di sistema, sotto/comando di shell/aperto, ho:

"C:\MyProgramPath\MyProgram.exe" "%1" 

Questo funziona bene per me. Quando qualcuno fa clic su uno o più file associati alla mia applicazione, la mia applicazione apre correttamente i file, ma ognuno viene aperto in un'istanza di programma separata.

C'è un modo per farlo e aprire tutti i file in un'istanza di programma?

risposta

1

È possibile quando si utilizza DDE. Vedi http://cc.embarcadero.com/Item/17787 per un esempio in Delphi.

EDIT:

Il link che hai dato parla di un altro metodo: utilizzando IDropTarget. Ciò potrebbe adattarsi meglio alle funzionalità di trascinamento della selezione già in esecuzione.

+0

Alla pagina MSDN a cui mi collego, si dice "Nota: il metodo DDE viene deprecato, utilizzare invece il metodo DropTarget". Non riesco a capire come configurare IDropTarget in Delphi. Dovrei andare comunque con DDE? – lkessler

+0

Sembra che IDropHandler sia la strada da percorrere. Ora tutto ciò che devo fare è capire come farlo. Ho fatto un'altra domanda di aiuto su questo all'indirizzo: http://stackoverflow.com/questions/3613333/how-do-i-get-droptarget-to-work-with-my-drop-handler-in-delphi – lkessler

4

Questa è una domanda piuttosto comune e non ha davvero nulla a che fare con le estensioni di file di Windows. Quando si fa doppio clic su un file del tipo personalizzato del programma, Windows avvierà l'applicazione associata MyProgram.exe e passerà il nome file %1 come argomento della riga di comando.

Ora, se si desidera solo una singola istanza dell'applicazione, è necessario fare questo:

  1. Quando il programma (MyProgram.exe) si avvia, dovrebbe verificare se v'è già un esempio di esecuzione.
  2. Se è presente un'istanza precedente, la nuova istanza di MyProgram.exe deve inviare un messaggio (di qualche tipo, non necessariamente un messaggio di Windows) alla vecchia istanza indicando di aprire il file %1.
  3. La nuova istanza dovrebbe ora terminarsi.

Un approccio molto semplicistico

Ci sono diversi modi di realizzare questo. Uno dei modi più semplici è impostare una chiave/valore del registro ogni volta che si avvia l'applicazione e rimuoverla quando l'applicazione esiste. Quindi, quando viene avviata (una nuova istanza) l'applicazione, prima di impostare questa chiave/valore, dovrebbe verificare se è già impostata. Se, quindi, segui i passaggi (2) e (3) sopra. Questo potrebbe non essere l'approccio più stabile (in effetti è una pessima idea, dato che non puoi garantire che l'app rimuova la chiave/il valore quando esiste se lo fa in modo anomalo), ma ti darà l'idea di base. Altri, forse i modi migliori, includono FindWindow e, ancora meglio, l'uso di mutexes.

Il passaggio due potrebbe essere implementato inviando un messaggio di Windows (forse WM_COPYDATA) o impostando un valore di registro o scrivendo un file o ... Esistono molti modi di comunicazione tra diversi processori.

I dettagli

Dal momento che questa è una domanda abbastanza comune, è stato affrontato prima. Si veda, ad esempio, this Delphi-specific article.

+2

Sfortunatamente, la creazione di questo nel mio programma previene sempre più istanze. Ma non è quello che voglio. Se si fa clic sul file A, lo voglio nell'istanza 1. Se si fa clic sul file B, allora lo voglio nell'istanza 2. Tuttavia, se si fa clic su entrambi A e B nello stesso clic, saranno 2 parametri passato al programma in una sola volta, e voglio che siano entrambi aperti in un caso. Perché lo voglio? In modo che abbia lo stesso effetto di eseguire il mio programma dalla riga di comando con 2 parametri o di trascinare e rilasciare 2 file nel mio programma. Grazie, ma questo non mi aiuta. – lkessler

+0

@Ikessler: vedo. Non ho capito che volevi dire così. Forse dovresti scrivere questo nella tua domanda? –

+0

Ci scusiamo per non averlo menzionato prima, ma non mi sono reso conto che era rilevante fino a quando non hai dato la tua risposta. Grazie mille per il tempo che hai impiegato per scrivere la tua risposta dettagliata. – lkessler

Problemi correlati