comment on utilise une DLL qu'on a créé ? [DLL + VC] - Programmation
Marsh Posté le 03-07-2002 à 11:35:34
Je pense que tu doit avoir à inclure le .lib de la DLL dans ton projet.
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 ?
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 ?
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 "
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....
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' ?
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
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 :
|
Mais j'en fais quoi du declspec arpès ?
Marsh Posté le 03-07-2002 à 14:02:09
tu met juste
Code :
|
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)
Marsh Posté le 03-07-2002 à 14:08:24
Donc dans le .h : "la_dll_a_darkoli.h"
je dois mettre :
Code :
|
Sachant que "la_dll_a_darkoli.c" contient :
Code :
|
Et le "programme_a_darkoli.c" doit contenir :
Code :
|
Marsh Posté le 03-07-2002 à 14:17:11
Un exemple si ca peut t'aider
dans le .h
Code :
|
Dans le .cpp
Code :
|
Marsh Posté le 03-07-2002 à 14:26:31
letoII a écrit a écrit : tu met juste
|
Désolé mais y'a un problème à la compilation avec VC !!!
Il indique un problème avec le l'identifiant "mafonction" !!!
Marsh Posté le 03-07-2002 à 14:28:00
Godbout a écrit a écrit : Un exemple si ca peut t'aider dans le .h
|
Pourquoi un dllexport et un dllimport ?
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 ?
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
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.
Marsh Posté le 03-07-2002 à 14:45:49
dans ton code source tu met
Code :
|
dans ton .h (que tu n'inclue pas dans la DLL)
tu met
Code :
|
Marsh Posté le 03-07-2002 à 14:55:02
letoII a écrit a écrit : dans ton code source tu met
|
Dans le code source de la dll
Code :
|
Ca ca marche, mais il ne veut pas le "char*" à la place du void !!!
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 :
|
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.
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
esperont que ça marche !!!
Marsh Posté le 03-07-2002 à 15:33:07
Ben normallement oui
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.
Marsh Posté le 03-07-2002 à 15:43:10
Godbout a écrit a écrit : Ben normallement oui 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 ?
Marsh Posté le 03-07-2002 à 15:50:16
Godbout a écrit a écrit : Ben normallement oui 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.
Marsh Posté le 03-07-2002 à 15:56:58
arf alors la je sais pas trop comment faire
Marsh Posté le 03-07-2002 à 16:04:55
Peut etre une histoire d'allocation memoire, de pointeur perdu, etc...
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 :
Marsh Posté le 03-07-2002 à 17:07:35
De rien, j'en ai chie aussi pour m'y mettre
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 |
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 !!!).
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