2010-09-29 6 views
12

Existe-t-il un moyen de charger dynamiquement et d'appeler dynamiquement des fonctions à partir de DLL dans D? J'aimerais que mon programme puisse charger des plugins au démarrage et peut-être même à la volée.Chargement des plugins (DLL) à la volée

+0

Oui. Voici une petite référence: http://www.digitalmars.com/d/2.0/dll.html –

+0

Voilà ce dont j'avais peur ... en gros, nous sommes bloqués par l'utilisation de la méthode C pour obtenir l'adresse de proc et partir de Là. Pas terrible je suppose, puisque je peux emballer tous mes objets plugin dans une "usine maîtresse", mais pas optimale. –

Répondre

9

Cela dépend de la dynamique que vous voulez obtenir. Si vous voulez charger dynamiquement une DLL et exécuter des fonctions prédéfinies, il y a une très belle enveloppe par Wei Li here. Merci à la puissance des modèles, il vous permet de faire des choses comme celles-ci:

// 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); 

Le code est D1. Pour D2, vous devez remplacer char[] par string, utiliser toStringz() et éventuellement supprimer scope. Modifier:my D2 port de ce code pourrait être utile à d'autres trouvant cette question.

+0

Je voudrais avoir plus de mod +1 points. Ceci est exactement ce que je cherchais. Merci! –

+1

@ Timothy: Heureux que ça a aidé. Pour moi, le code est un bon exemple de ce que vous pouvez réaliser avec quelques lignes de code en utilisant des templates et des mixins. Cela ressemble presque à Python. – stephan

+0

Je me rends compte que c'est quelques mois, mais merci beaucoup pour la mise à jour D 2.0! J'aimerais aussi avoir plus de votes upvotes à distribuer! –

Questions connexes