Utiliser les fonctions définies dans une DLL [Dev C++] - C - Programmation
Marsh Posté le 24-07-2003 à 11:59:35
Je connais pas Dev C++, mais normalement tu dois intégrer le fichier .lib de la DLL à ton projet (ça se passe comme ça sous VC++)
Sinon, si tu connais le nom des fonctions, tu peux utiliser la fonction Win32 GetProcAdress()
Marsh Posté le 24-07-2003 à 19:56:14
ReplyMarsh Posté le 24-07-2003 à 20:49:10
Pour appeler les fonctions d'une DLL, tu as 2 méthodes :
- Soit tu lies ton programme statiquement avec le fichier .lib correspondant à la DLL, et qui contient des fonctions permettant l'appel des fonctions de la DLL
- Soit tu charges la DLL en mémoire, puis tu accèdes à ses fonctions dynamiquement via la fonction Win32 GetProcAddress().
Dans le 1er cas, tu dois inclure à ton projet le fichier .lib fourni avec la DLL. Ce fichier contient des fonctions qui appelleront les fonctions de la DLL.
Mettons que tu aies une DLL Madll.dll qui expose la fonction
Mafonction(). Normalement, tu as également un fichier Madll.lib que tu dois ajouter à ton projet, et qui contient le code qui ouvre le fichier Madll.dll et qui appelle Mafonction(). Quand tu feras un appel à Mafonction() dans ton source, tu appelleras en fait la fonction Mafonction() présente dans Madll.lib, qui se charge d'appeler Mafonction() dans Madll.dll (tu me suis toujours ? )
Ce que je sais de Dev C++, c'est qu'il utilise gcc. Or, sous gcc, Unix oblige, les fichiers .lib ont l'extension .a et n'ont pas la même structure. Ce qui implique que tu dois recompiler le source de ta DLL si tu le possèdes pour générer un fichier Madll.a
- La 2ème méthode nécessite que tu connaisses le nom et les paramètres de la fonction que tu désires appeler. Tu n'as pas besoin de .lib
Pour cela, tu dois charger la DLL en mémoire via LoadLibrary(), ce qui te fournira un handle vers cette DLL. Puis, via la fonction GetProcAddress(), tu récupères l'adresse de la fonction que tu utilises pour accéder à cette fonction. Quand tu as fini, tu libères la DLL avec FreeLibrary().
Exemple avec Madll.dll (Mafonction prend une chaine en paramètre et retourne cette chaine en sortie) :
Code :
|
Voila voila, tu sais tout
Marsh Posté le 24-07-2003 à 21:25:24
ReplyMarsh Posté le 25-07-2003 à 09:31:54
Citation : Pour appeler les fonctions d'une DLL, tu as 2 méthodes : |
Eh eh y'en a une troisième intermédiaire ... j'ai moyennement pigé comment ça fonctionne et c'est assez magique. Ca ne marche que sous VC++ à ma connaissance : le delayed load.
Marsh Posté le 25-07-2003 à 17:09:29
La MSDN dit "The helper function will load the DLL at run time by calling LoadLibrary and GetProcAddress for you."
http://msdn.microsoft.com/library/ [...] ofdlls.asp
Ça a l'air un peu bizarre comme truc... ou alors j'ai ren capté !
Marsh Posté le 25-07-2003 à 17:52:39
Vi, j'ai testé.
C'est assez bluffant : ton exe ne fait pas d'import des fonctions utilisées (dependencywalker ne trouve rien) et pourtant tu peux les utiliser comme si c'était le cas. Tu tapes le nom de ta fonction et tu l'utilises normalement.
J'ai pas pigé comment il faisait ça. J'ai cru comprendre qu'il bidouille la section import au run time, mais je vois pas trop comment c'est possible, ça me parraît assez balaize quand même d'ajouter à la volée les méthodes importées dans la section import. D'autant plus que je vois pas comment le linker s'y retrouve pour faire pointer les appels classiques au bon endroit. Il me parraît obligatoire d'avoir de la place réservée et je pense que la routine l'initialise au runtime. Mais j'ai pas pu vérifier (pas d'éditeur PE sous la main, et une petite flemme).
Marsh Posté le 24-07-2003 à 11:51:23
Comment faire l'import de ces fonctions, avec cet IDE ?
---------------
Le site de ma maman