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
dataun comando che mIRC deve eseguire. - 3 - la DLL ha scritto in
datail 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.