/ / Modules dynamiques avec DLL sur Windows - c, windows, dll, module, chargement paresseux

Modules dynamiques avec DLL sur Windows - c, windows, dll, module, chargement paresseux

J'écris une application en C qui peut êtreétendu au moment de l'exécution à l'aide de modules / objets partagés / DLL. Ces modules peuvent utiliser l'API du programme existant mais peuvent également fournir de nouvelles fonctions à utiliser dans les modules chargés ultérieurement, de sorte qu'il est possible que les modules aient des dépendances mutuelles.

Mon approche actuelle sous Linux consiste à avoir tous lesmodule définit une fonction depend () qui renvoie la liste des autres noms de modules dont il dépend. De cette façon, je peux compiler et lier chaque module pour lui-même, charger un module avec dlopen () et RTLD_LAZY, résolvez d'abord ses dépendances puis chargez-le complètement avec RTLD_GLOBAL. Cela fonctionne très bien et fait exactement ce que je veux. Cela me permet également de remplacer un module par une version différente sans recompiler tous les autres modules en fonction.

Le problème actuel se pose lors du portage de cetteLes fenêtres. Tout d’abord, je n’ai trouvé aucun moyen de lier une DLL sans lui fournir déjà les tables de symboles d’exportation de toutes ses dépendances. Y at-il un fichier que j’ai «oublié»?

Deuxièmement, LoadLibraryEx à partir de l’API Windowsne semble pas pouvoir effectuer de chargement paresseux, car au lieu de me laisser gérer les dépendances, il charge et charge toutes les DLL référencées avant même de revenir. Puisque je souhaite effectuer une vérification de version avant de charger les modules, L'avenir, ce n'est pas du tout ce que je veux. Y at-il un moyen de contourner ce comportement?

La troisième chose étrange est que je ne peux pas remplacer unDLL sans recompiler tous les autres modules en fonction. En réalité, cela fonctionne parfois, mais en général, il se passe des choses folles ou le programme segfaults.

Est-il même possible d'écrire une application modulaire comme celle-là sous Windows? Toutes les suggestions ou approches différentes sont hautement appréciées!

Mettre à jour: Juste pour fournir des éclaircissements sur la manière dont monLes modules utilisent les fonctions de Linux (que je voudrais aussi avoir sous Windows): Chaque module renvoie simplement le nom d’un autre module dont il aimerait appeler des fonctions dans la fonction depend () décrite et inclut son en-tête, puis appelle les fonctions utilisées directement dans le code sans aucun emballage. Cela fonctionne car Linux ne vous oblige pas à avoir tous les symboles résolus au moment de la liaison pour les objets partagés.

Réponses:

4 pour la réponse № 1

Vous pouvez exporter toutes les fonctions manuellement (en utilisant __declspec(dllexport)) et les charger en utilisant GetProcAddress. Dans ce cas, vous devez connaître la signature dechaque fonction, et vous êtes limité aux fonctions C uniquement, mais cela va fonctionner. Si vous compilez les deux modules, vos fonctions C peuvent également renvoyer des classes C ++, pour plus d'informations à ce sujet plus tard. GetProcAddress Et LoadLibrary rend les modules totalement indépendants. En gros, vous faites les liens manuellement, mais si je comprends bien, c'est ce que vous faites sous Linux, n'est-ce pas?

LoadLibary ne charge que les bibliothèques dont dépend une bibliothèqueAssurez-vous qu’ils ne se chargent pas entre eux. Soit ils sont vraiment indépendants, soit ils ne sont pas, si cela est fait correctement, changer une bibliothèque ne forcera pas la recompilation de l’autre (car vous ne les liez pas ensemble).

Une bonne idée est d’utiliser quelque chose comme COM, alorschacune de vos bibliothèques retourne une interface, au lieu de fonctions individuelles. De cette façon, vous pouvez simplement charger une DLL entière et les lier facilement (en passant une DLL -> en passant un objet). Recherchez XPCOM et COM, c’est très facile à faire.