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

 


Dernière réponse
Sujet : [DLL + VC] comment on utilise une DLL qu'on a créé ?
godbout ah :/ :D

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
godbout ah :/ :D
darkoli

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

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

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:

godbout Peut etre une histoire d'allocation memoire, de pointeur perdu, etc...
godbout arf alors la je sais pas trop comment faire :/
darkoli

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.

darkoli

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 ?

godbout 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.
darkoli

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

godbout Je t'ai file deux exemples a telecharger un peu plus haut. Regarde comment j'ai fait ca t'aidera surement.
darkoli 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.

darkoli

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

LetoII 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*);

godbout

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.

godbout 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
darkoli 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 ?
darkoli

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 ?

darkoli

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

godbout 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. }


 

darkoli 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. }

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

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

darkoli

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 ?

smaragdus

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

darkoli

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' ?

bjone 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....
darkoli

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 "

darkoli

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 ?

smaragdus Tu n'as pas précisé si  
* tu faisais un lien implicte ou explicite ?
* DLL : win32 ou MFC ?
* declspec(dllimport) + header ou bien GetProcAdress ?
 
LetoII Je pense que tu doit avoir à inclure le .lib de la DLL dans ton projet.
darkoli 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).

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)