Documentazione mIRC

Dynamic-link Library

Dynamic-link Library

mIRC consente ai programmi di effettuare chiamate a librerie dinamiche (DLL) progettate per funzionare con mIRC. L’idea principale è che, per elaborazioni intensive, una DLL può risultare più veloce di uno script mIRC.

mIRC supporta gli oggetti COM per chiamare componenti non standard.

Uso di una DLL

La documentazione presenta le forme principali di chiamata:

  • /dll <filename> <procname> [data]
  • /dll -u <filename>
  • $dll(<filename>, <procname>, [data])
  • $dllcall(<filename>, <alias>, <procname>, [data])

Lo switch -u serve a scaricare la DLL. Il parametro <alias>, usato con $dllcall, indica la routine richiamata in modo asincrono quando la funzione termina.

Creazione di una DLL

La pagina non è un tutorial completo sulla scrittura di DLL, ma specifica che le funzioni esportate devono usare la convenzione di chiamata __stdcall e ricevere handle finestra, buffer dati, buffer parametri e flag di stato.

Viene spiegato che il buffer data può essere usato per restituire un valore o chiedere a mIRC di eseguire un comando, mentre parms può contenere parametri che mIRC mapperà in $1-.

La pagina nota anche che la dimensione dei buffer segue il line length limit di mIRC, indicato nell’articolo come 4150 byte in mIRC 7.34.

C++ e stdcall

Per DLL scritte in C++, viene raccomandato l’uso di extern "C" sulle funzioni esportate per evitare il name mangling tipico del linkage C++.

La pagina aggiunge però che __stdcall introduce comunque una forma di mangling, e suggerisce quindi l’uso di un file .def oppure, in Visual Studio, di direttive #pragma per esportare i nomi reali delle funzioni.

Per GCC su Windows viene citato l’equivalente __attribute__((stdcall)).

Valori di ritorno

  • 0 - mIRC deve eseguire /halt.
  • 1 - mIRC deve continuare l’elaborazione.
  • 2 - la DLL ha scritto in data un comando che mIRC deve eseguire.
  • 3 - la DLL ha scritto in data il valore da restituire tramite $dll().

La nota della pagina precisa che questo comportamento riguarda l’uso di $dll o /dll.

Mantenere caricata la DLL

Per impostazione predefinita, la DLL viene scaricata subito dopo la chiamata. La pagina spiega che è possibile mantenerla caricata implementando una routine LoadDll().

Nella struttura LOADINFO vengono descritti campi come la versione di mIRC, l’handle della finestra principale, il flag mKeep e il flag mUnicode.

Se mUnicode è attivo, il testo passato da e verso la DLL viene trattato come UTF-16, e la firma della funzione cambia usando buffer wide char.

Scaricamento della DLL

mIRC scarica automaticamente una DLL dalla memoria se non viene usata per dieci minuti oppure alla chiusura del programma.

È possibile definire una routine UnloadDll() per eseguire operazioni di cleanup, e il parametro mTimeout distingue tra scaricamento manuale, timeout e uscita di mIRC.

Esempi

La parte finale contiene un primo esempio in Visual Studio/C++ che mostra esportazione delle funzioni, uso di SendMessage(), gestione di LoadDll() e UnloadDll(), e diversi casi d’uso con ritorno dati o esecuzione di comandi in mIRC.

Il secondo esempio usa GNU GCC su Windows in C e mostra una DLL minimale compilata come libreria condivisa, con una funzione che manipola il testo e restituisce un comando da eseguire in mIRC.