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:
- Quando il programma (
MyProgram.exe
) si avvia, dovrebbe verificare se v'è già un esempio di esecuzione.
- 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
.
- 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.
fonte
2010-08-31 04:54:13
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
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