[DLL + VC] comment on utilise une DLL qu'on a créé ?

comment on utilise une DLL qu'on a créé ? [DLL + VC] - Programmation

Marsh Posté le 03-07-2002 à 11:33:47    

J'ai une DLL avec une fonction du type char* nom_fonction(char* chaine).
 
Sachant que je pars de 0 avec VC et que j'ai ma dll et le .lib associé et le source aussi (au cas où). Que dois je faire pour utiliser cette dll ?
 
1° Un nouveau projet je pense.
2° Declaration de la fonction externe ?
3° Inclusion quelconque (en rapport avec la dll) ?
4° ?
...
X° Compiler la mini aplli qui fait juste un appel à la dll. (transfert d'une chaine de caracteres, et affiche de la chaine retournee par la fonction).
 
PS : au cas ou, la dll possede un mode debug et créée un fichier .log a chaque chargement (d'elle meme).


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 03-07-2002 à 11:33:47   

Reply

Marsh Posté le 03-07-2002 à 11:35:34    

Je pense que tu doit avoir à inclure le .lib de la DLL dans ton projet.


---------------
Le Tyran
Reply

Marsh Posté le 03-07-2002 à 12:11:12    

Tu n'as pas précisé si  
* tu faisais un lien implicte ou explicite ?
* DLL : win32 ou MFC ?
* declspec(dllimport) + header ou bien GetProcAdress ?
 

Reply

Marsh Posté le 03-07-2002 à 12:11:41    

letoII a écrit a écrit :

Je pense que tu doit avoir à inclure le .lib de la DLL dans ton projet.




 
Ouais ça c'est bon.
 
Mais j'ai oublié de déclarer ma fonction dans la dll pour qu'elle soit externe (accessible depuis l'exterieur), que faut-il faire ?


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 03-07-2002 à 12:12:55    

Smaragdus a écrit a écrit :

Tu n'as pas précisé si  
* tu faisais un lien implicte ou explicite ?
* DLL : win32 ou MFC ?
* declspec(dllimport) + header ou bien GetProcAdress ?




 
tu faisais un lien implicte ou explicite : en françis ça donne quoi ?
DLL : Win32
Ben plutot ça : "declspec(dllimport) + header "


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 03-07-2002 à 12:16:52    

je dirais:
 
Implicite:
 
Tu rajoutes le petit .LIB généré à la compilation de la DLL, dans le projet de l'EXE.
 
Explicite:
 
tu charges la DLL avec LoadLibrary et GetProcAddress....

Reply

Marsh Posté le 03-07-2002 à 12:23:26    

bjone a écrit a écrit :

je dirais:
 
Implicite:
 
Tu rajoutes le petit .LIB généré à la compilation de la DLL, dans le projet de l'EXE.
 
Explicite:
 
tu charges la DLL avec LoadLibrary et GetProcAddress....




 
Ben c'est implicite : j'ai le petit .lib (j'ai même le projet VC qui a servi a creer la DLL) et lui je l'ai mis.
 
Par contre la fonction que je veux utiliser dans la dll n'est pas déclarée comme externe je crois.
 => char* fonction(char*)
 
Je dois la declarer avec un [/b]declspec[b] quelque part ?
 
Pour l'utiliser, je déclare simplement la fonction dans mon programme comme si elle venait d'un '.h' ?


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 03-07-2002 à 12:27:38    

DarkOli a écrit a écrit :

 
 
Ben c'est implicite : j'ai le petit .lib (j'ai même le projet VC qui a servi a creer la DLL) et lui je l'ai mis.
 
Par contre la fonction que je veux utiliser dans la dll n'est pas déclarée comme externe je crois.
 => char* fonction(char*)
 
Je dois la declarer avec un [/b]declspec[b] quelque part ?
 
Pour l'utiliser, je déclare simplement la fonction dans mon programme comme si elle venait d'un '.h' ?




 
Dans ton projet de DLL, tu fais un .h qui contient tous les prototypes que tu veux exporter avec une macro qui vaut declspec(dllexport) pour la DLL et declspec(dllimport) dans l'EXE. Tu n'as plus qu'à ajouter le .h au projet de l'EXE

Reply

Marsh Posté le 03-07-2002 à 13:50:25    

Smaragdus a écrit a écrit :

 
 
Dans ton projet de DLL, tu fais un .h qui contient tous les prototypes que tu veux exporter avec une macro qui vaut declspec(dllexport) pour la DLL et declspec(dllimport) dans l'EXE. Tu n'as plus qu'à ajouter le .h au projet de l'EXE




 
une macro ? (comme dans excel ?)
 
C'est le truc avec un #define ?
 
Jai trouvé ça :

Code :
  1. #ifdef STATIC_LIBRARY
  2. #define DECLSPEC
  3. #else
  4. #define DECLSPEC __declspec(dllexport)
  5. #endif


 
Mais j'en fais quoi du declspec arpès ?


Message édité par darkoli le 03-07-2002 à 13:57:01

---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 03-07-2002 à 14:02:09    

tu met juste  

Code :
  1. void dllspec(dllexport)mafonction();


---------------
Le Tyran
Reply

Marsh Posté le 03-07-2002 à 14:02:09   

Reply

Marsh Posté le 03-07-2002 à 14:08:13    

Soit un lib + .h, loadtime (si je dis pas de connerie)
Soit juste un GetProcAddress + LoadLibrary (runtime)
 


---------------
Super.
Reply

Marsh Posté le 03-07-2002 à 14:08:24    

Donc dans le .h : "la_dll_a_darkoli.h"
 
je dois mettre :

Code :
  1. #ifndef _DLL_A_DARKOLI_H
  2. #define _DLL_A_DARKOLI_H
  3. #ifdef EXPNETFUNCS
  4. #define EXPNETTYPE __declspec( dllexport )
  5. #else
  6. #define EXPNETTYPE __declspec( dllimport )
  7. #endif EXPNETFUNCS
  8. #ifdef __cplusplus
  9. extern "C" {
  10. #endif
  11. EXPNETTYPE char* fonction_a_darkoli(char*);
  12. #ifdef __cplusplus
  13. }
  14. #endif
  15. #endif


 
Sachant que "la_dll_a_darkoli.c" contient :

Code :
  1. #include "la_dll_a_darkoli.h"
  2. #include <...deux_trois_lib_standards...>
  3. char* fonction_a_darkoli(char* chaine)
  4. {
  5. [...Bordel a DarkOli qui fonctionne tres bien ...]
  6. }


 
Et le "programme_a_darkoli.c" doit contenir :

Code :
  1. #include <...>
  2. char* fonction_a_darkoli(char*);
  3. void main(void)
  4. {
  5. char* test=fonction_a_darkoli("toto" );
  6. fprintf(stdout, %s.\n", test==NULL?"NULL":test);
  7. return;
  8. }


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 03-07-2002 à 14:17:11    

Un exemple si ca peut t'aider ;)
 
dans le .h
 

Code :
  1. #ifdef TESTDLL_EXPORTS
  2. #define TESTDLL_API __declspec(dllexport)
  3. #else
  4. #define TESTDLL_API __declspec(dllimport)
  5. #endif
  6. TESTDLL_API BOOL  Message();


 
Dans le .cpp
 

Code :
  1. WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  2. {
  3.         Message();
  4.         return 0;
  5. }


 


---------------
Super.
Reply

Marsh Posté le 03-07-2002 à 14:26:31    

letoII a écrit a écrit :

tu met juste  

Code :
  1. void dllspec(dllexport)mafonction();






 
Désolé mais y'a un problème à la compilation avec VC !!!
 
Il indique un problème avec le l'identifiant "mafonction" !!!


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 03-07-2002 à 14:28:00    

Godbout a écrit a écrit :

Un exemple si ca peut t'aider ;)
 
dans le .h
 

Code :
  1. #ifdef TESTDLL_EXPORTS
  2. #define TESTDLL_API __declspec(dllexport)
  3. #else
  4. #define TESTDLL_API __declspec(dllimport)
  5. #endif
  6. TESTDLL_API BOOL  Message();


 
Dans le .cpp
 

Code :
  1. WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  2. {
  3.         Message();
  4.         return 0;
  5. }


 
 




 
Pourquoi un dllexport et un dllimport ?


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 03-07-2002 à 14:34:35    

Y'a plus qu'une erreur.
 
char* __declspec(dllexport)ma_fonction(char*);
 
C'est le prototype de la fonction dans le .h de la dll (qui ne contient que ça), et VC me donne une erreur de "type" sans plus de precisions.
 
Sans le __declspec(dllexport) ca compile bien mais si j'ai bien compris ma fonction n'est pas exportée ?


Message édité par darkoli le 03-07-2002 à 14:39:56

---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 03-07-2002 à 14:43:23    

Bon j'ai pas trop le temps.
Je sais pas si tu veux faire du loadtime (avec un lib) ou du runtime (getprocaddress + loadlibrary).
 
Donc j'ai fait un petit exemple pour le loadtime.
 
Tu peux d/l ca ici:
 
Y a l'exe http://site.voila.fr/godbout/Testexe.exe
Et la dll http://site.voila.fr/godbout/Testdll.exe


---------------
Super.
Reply

Marsh Posté le 03-07-2002 à 14:45:37    

DarkOli a écrit a écrit :

 
 
Pourquoi un dllexport et un dllimport ?




 
Parce que c'est du loadlibrary, avec un lib, donc dans l'exe et dans la dll il faut que tu declares la fonction. Au lieu de refaire un .h, j'utilise le meme, il suffit juste de rentrer une preprocessor definition dans un des deux cas et pas dans l'autre.


---------------
Super.
Reply

Marsh Posté le 03-07-2002 à 14:45:49    

dans ton code source tu met  

Code :
  1. char* __declspec(dllexport)ma_fonction(char*)
  2. {
  3.   //ton code
  4. }


dans ton .h (que tu n'inclue pas dans la DLL)
 
tu met

Code :
  1. char* __declspec(dllimport)ma_fonction(char*);


---------------
Le Tyran
Reply

Marsh Posté le 03-07-2002 à 14:55:02    

letoII a écrit a écrit :

dans ton code source tu met  

Code :
  1. char* __declspec(dllexport)ma_fonction(char*)
  2. {
  3.   //ton code
  4. }


dans ton .h (que tu n'inclue pas dans la DLL)
 
tu met

Code :
  1. char* __declspec(dllimport)ma_fonction(char*);






 
Dans le code source de la dll  

Code :
  1. void __declspec(dllexport)ma_fonction(char*)
  2. {
  3.   //ton code
  4. }


 
Ca ca marche, mais il ne veut pas le "char*" à la place du void !!!


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 03-07-2002 à 15:10:29    

Euh Donc pour la dll c'est bon, en faitil faut ecrire :
__declspec(dllexport) char* service1_1(char* demande);
 
Par contre dans le programme qui utilise je mets le prototype :
__declspec(dllimport) char* service1_1(char* demande);
 
Et la ça compile toujours.
 
Mais des que je veux utiliser la fonction :
resultat=service1_1("toto" );
 
Ca compile plus !!! (enfin ça link plus).

Code :
  1. Linking...
  2. mci_dll.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) char * __cdecl service1_1(char *)" (__imp_?service1_1@@YAPADPAD@Z)
  3. Debug/mci_dll.exe : fatal error LNK1120: 1 unresolved externals
  4. Error executing link.exe.


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 03-07-2002 à 15:21:06    

Je t'ai file deux exemples a telecharger un peu plus haut. Regarde comment j'ai fait ca t'aidera surement.


---------------
Super.
Reply

Marsh Posté le 03-07-2002 à 15:26:26    

Godbout a écrit a écrit :

Je t'ai file deux exemples a telecharger un peu plus haut. Regarde comment j'ai fait ca t'aidera surement.




 
Merci beaucoup MR :love:
 
esperont que ça marche !!!


Message édité par darkoli le 03-07-2002 à 15:29:19

---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 03-07-2002 à 15:33:07    

Ben normallement oui :D
 
Par contre comme j'ai dit c'est du loadtime, donc tu link avec un lib, tu ballades ta dll avec ton prog, sans laquelle il ne peut pas marcher.
L'autre facon c'est du runtime, style plugin.


---------------
Super.
Reply

Marsh Posté le 03-07-2002 à 15:43:10    

Godbout a écrit a écrit :

Ben normallement oui :D
 
Par contre comme j'ai dit c'est du loadtime, donc tu link avec un lib, tu ballades ta dll avec ton prog, sans laquelle il ne peut pas marcher.
L'autre facon c'est du runtime, style plugin.




 
En fait le probleme doit venir des char* !!!
Comment faut-il faire pour les gerer ?


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 03-07-2002 à 15:50:16    

Godbout a écrit a écrit :

Ben normallement oui :D
 
Par contre comme j'ai dit c'est du loadtime, donc tu link avec un lib, tu ballades ta dll avec ton prog, sans laquelle il ne peut pas marcher.
L'autre facon c'est du runtime, style plugin.




 
Ben visiblement il ne veut rien savoir, c'est chiant. ton prog marche bien. mais pas le mien et c'est tout pareil, avec ou sans parametres il se vautre lors de l'edition de liens.


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 03-07-2002 à 15:56:58    

arf alors la je sais pas trop comment faire :/


---------------
Super.
Reply

Marsh Posté le 03-07-2002 à 16:04:55    

Peut etre une histoire d'allocation memoire, de pointeur perdu, etc...


---------------
Super.
Reply

Marsh Posté le 03-07-2002 à 16:48:10    

Godbout a écrit a écrit :

Peut etre une histoire d'allocation memoire, de pointeur perdu, etc...




 
Merci mr !!!!!!!!!
 
J'ai réussi à faire marcher cette merde de dll !!!
 
Et j'ai même réussi a en refaire une nouvelle qui reçoit une chaine l'affiche et en retourne une autre !!!
 
Je pense qu'il devait y avoir un problème de parametrage du projet ?!
 
En tout cas merci :): :love: :sol:


Message édité par darkoli le 03-07-2002 à 18:04:25

---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 03-07-2002 à 17:07:35    

De rien, j'en ai chie aussi pour m'y mettre :D


---------------
Super.
Reply

Marsh Posté le 03-07-2002 à 18:05:24    

Godbout a écrit a écrit :

De rien, j'en ai chie aussi pour m'y mettre :D




 
Enfin le plus dur est a venir :( (toutes les librairies que j'utilise sont sous unix alors je sens que je vais m'amuser pour tout importer sous windows !!!).


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 03-07-2002 à 23:44:33    

ah :/ :D


---------------
Super.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed