Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1287 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [Dev C++] Utiliser les fonctions définies dans une DLL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Dev C++] Utiliser les fonctions définies dans une DLL

n°466690
Cherrytree
cn=?
Posté le 24-07-2003 à 11:51:23  profilanswer
 

Comment faire l'import de ces fonctions, avec cet IDE ?


---------------
Le site de ma maman
mood
Publicité
Posté le 24-07-2003 à 11:51:23  profilanswer
 

n°466701
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-07-2003 à 11:59:35  profilanswer
 

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()


---------------
J'ai un string dans l'array (Paris Hilton)
n°467202
Cherrytree
cn=?
Posté le 24-07-2003 à 19:56:14  profilanswer
 

Peux-tu m'en dire plus, jeune adepte ?


---------------
Le site de ma maman
n°467225
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-07-2003 à 20:49:10  profilanswer
 

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 ? :D)
 
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 :
  1. #include <windows.h>
  2. int main(int argc, char **argv)
  3. {
  4.    HINSTANCE dllLib;
  5.    LPTSTR fonctAdr;
  6.    BOOL res;
  7.    dllLib = LoadLibrary("Madll" ); //note que je ne met pas l'extension
  8.  
  9.    if (dllLib != NULL) {
  10.       fonctAdr = (LPTSTR) GetProcAddress(dllLib, "Mafonction" ); // idem
  11.       if (fonctAdr != NULL) {
  12.          (fonctAdr) ("Test\n" ); // j'appelle la fonction avec la chaine "Test\n" en paramètre.
  13.       }
  14.       res = FreeLibrary(dllLib); // on libère la DLL
  15.    }
  16.    return 0;
  17. }


 
Voila voila, tu sais tout :)


Message édité par Harkonnen le 24-07-2003 à 21:33:02

---------------
J'ai un string dans l'array (Paris Hilton)
n°467247
Cherrytree
cn=?
Posté le 24-07-2003 à 21:25:24  profilanswer
 

Splendide ! Je teste ça demain. Merci beaucoup maître.


---------------
Le site de ma maman
n°467375
HelloWorld
Salut tout le monde!
Posté le 25-07-2003 à 09:31:54  profilanswer
 

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.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°467973
leneuf22
Posté le 25-07-2003 à 17:09:29  profilanswer
 

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é !

n°468018
HelloWorld
Salut tout le monde!
Posté le 25-07-2003 à 17:52:39  profilanswer
 

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).


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [Dev C++] Utiliser les fonctions définies dans une DLL

 

Sujets relatifs
c est mal d utiliser des goto en c++ ?recuperer une valeur d une requete sql pour l utiliser ds un chemin
[VBA] Passage de données à une DLL C++[DLL] Prototype des fonctions exportées
ASP : L'opération doit utiliser une requête qui peut être mise à jourréférencer une DLL créée en Delphi?
utiliser jarsignercalcul de fonctions mathématiques
Utiliser un ".lib" généré par VC++ en C# ???? 
Plus de sujets relatifs à : [Dev C++] Utiliser les fonctions définies dans une DLL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR