Bonjour, j'aimerais savoir comment faire pour créer des dll qui contiennent des objets ?
merci
Bonjour, j'aimerais savoir comment faire pour créer des dll qui contiennent des objets ?
merci
Qui contiennent juste des objets ou qui exposent carrément des classes ?
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Je voudrais une dll qui contient des classes.
le .h
le .cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 class Personne { class Personne { public : Personne(char* nom,char* prenom); char* getNom(); char* getPrenom(); void setPrenom(char* prenom); void setNom(char* nom); private : char* nom ; char* prenom ; };
Pour le moment j'ai ca, et j'aimerais le transformer en dll afin de pouvoir l'utiliser par la suite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 Personne::Personne(char *nom,char *prenom) :prenom(prenom),nom(nom) { } char* Personne::getNom() { return nom; } char* Personne::getPrenom() { return nom; } void Personne::setNom(char* nomX) { nom = nomX ; } void Personne::setPrenom(char* prenomX) { prenom = prenomX ; }
Il faut faire un projet DLL et déclarer tes classes avec l'attribut signifiant "je suis exportée par cette DLL".
Voir ici pour un exemple de fichier d'en-tête tel qu'un compilo peut le générer, et la manière de l'utiliser:
http://www.developpez.net/forums/sho...42&postcount=6
Ensuite, quelques notes sur les DLLs C++ :
- Les classes C++ ne sont utilisables qu'avec le même compilateur que celui qui a généré la DLL.
- De plus, elles ne sont utilisables qu'en liant implicitement avec la DLL (en ajoutant aux options du linker le .lib (ou le .a) généré avec la DLL).
- Pour contourner ces limitations, il faut faire un truc plus compliqué: Une DLL avec des classes dont toutes les fonctions sont virtuelles, et une fonction extern "C" pour créer un objet de cette classe.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Voilà je viens de faire le test suivant :
test.h
test.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 #ifndef H_TEST #define H_TEST #ifndef EXTERN_C #ifdef __cplusplus #define EXTERN_C extern "C" #else #define EXTERN_C extern #endif #endif #ifdef BUILDING_TEST #define TEST_API __declspec(dllexport) #else #define TEST_API __declspec(dllimport) #endif class TEST_API Test { public: char* addPoint(); }; #endif
Avant de compile je définie BUILDING_TEST et je compile. Il n"y a aucune erreur et j'obtient bien mon fichier .lib , .dll , .exp , .ilk et .pbd
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #include "test.h" char* Test::addPoint() { return "Bonjour" ; }
Ensuite je cré mon programme console :
j'inclue mon fichier .h et je le main.cpp suivant :
Avant de compilé, je veux importer le .lib donc je vais dans Projet->Proprièté->Editeur de liens->Avancé->Bibliothèque d'importation et la j'ajoute le chemin de mon fichier .lib
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #include "stdafx.h" #include "test.h" int _tmain(int argc, _TCHAR* argv[]) { Test *text = new Test(); char chaine[] = text->chaine(); printf("%s", chaine); return 0; }
Ensuite je lance la compilation malheuresement j'ai un message d'erreur
[EDIT]
Je suis sous Visual Studio 2005
Voilà le message
Erreur 1 error LNK2001: symbole externe non résolu "__declspec(dllimport) public: char * __thiscall Test::chaine(void)" (__imp_?chaine@Test@@QAEPADXZ) test.obj
Code : Sélectionner tout - Visualiser dans une fenêtre à part char* addPoint();Pas facile de voir ce qui ne va pas quand on a écrit soi-même le code, hein ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part text->chaine();![]()
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Partager