2010-09-29 6 views
12

Esiste un modo per caricare dinamicamente e richiamare funzioni da DLL dinamicamente in D? Mi piacerebbe che il mio programma fosse in grado di caricare i plugin all'avvio e forse anche al volo.Caricamento plug-in (DLL) al volo

+0

Sì. Ecco un breve riferimento: http://www.digitalmars.com/d/2.0/dll.html –

+0

Questo è quello di cui avevo paura ... in pratica siamo bloccati ad usare il metodo C per ottenere l'indirizzo di proc e andare da Là. Non è terribile, suppongo, dal momento che posso avvolgere tutti gli oggetti plugin in una "fabbrica principale", ma non ottimale. –

risposta

9

Dipende da quanto dinamico si vuole ottenere. Se vuoi caricare dinamicamente una dll ed eseguire alcune funzioni predefinite, c'è un bel wrapper di Wei Li here. Grazie alla potenza dei modelli, ti permette di fare cose come queste:

// define functions 
alias Symbol!("MessageBoxW", int function(HWND, LPCWSTR, LPCWSTR, UINT)) mbw; 
alias Symbol!("MessageBoxA", int function(HWND, LPCSTR, LPCSTR, UINT)) mba; 
// load dll 
auto dll = new Module!("User32.dll", mbw, mba); 
// call functions 
dll.MessageBoxW(null, "Hello! DLL! ", "Hello from MessageBoxW", MB_OK); 
dll.MessageBoxA(null, "Hello! DLL! ", "Hello from MessageBoxA", MB_OK); 

Il codice è D1. Per D2, è necessario sostituire char[] con string, utilizzare toStringz() ed eventualmente rimuovere scope. Modifica:my D2 port di questo codice potrebbe essere utile agli altri per trovare questa domanda.

+0

Vorrei avere più mod +1 punti. Questo e 'esattamente quello che stavo cercando. Grazie! –

+1

@Timothy: sono contento che l'abbia aiutato. Per me, il codice è un buon esempio di quanto è possibile ottenere con un paio di linee di codice usando template e mixin. Sembra quasi come Python. – stephan

+0

Mi rendo conto che questo ha pochi mesi, ma grazie mille per l'aggiornamento D 2.0! Vorrei anche avere più voti da distribuire! –