doudouhic
Messages postés7Date d'inscriptionmardi 6 mai 2003StatutMembreDernière intervention26 février 2007
-
24 févr. 2007 à 21:32
doudouhic
Messages postés7Date d'inscriptionmardi 6 mai 2003StatutMembreDernière intervention26 février 2007
-
26 févr. 2007 à 16:40
Bonjour tout le monde,
J'ai deja travailler sur un projet en VC++, et j'aimerai transformer mes classes en DLL que je pourrai exploiter plus tard dans d'autres projets.
Mon probléme est que pour la création des DLL, tous les documents que j'ai trouvé programme en C, il n'ya pas de classes. comment en créer une DLL tout en gardant l'aspect Orienté Objet pour des classes génériques.
Est ce que à la fin mes DLL pourrai être utiliser avec Java par exemple.
cs_azamharir
Messages postés55Date d'inscriptionjeudi 18 janvier 2007StatutMembreDernière intervention 1 novembre 2008 24 févr. 2007 à 22:08
salut
tu utilise quel compilateur ?
si c Visual Studio 6.0 alors :
tu creer un projet mfc appwizard(dll)
puis tu choisi mfc extension dll
tu ajoute les fichiers de ta classe ds le projet et tu ajoute AFX_EXT_CLASS
exemple :
class AFX_EXT_CLASS mobile
{
int num,chrono;
COLORREF color;
CPoint XY;
public:
int& get_chrono();
mobile(int=20,int=10,int=1,int=0);
void draw(CDC*);
void avancer(int);
virtual ~mobile();
int get_x();
void set_y(int n);
void set_num(int);
void set_color(COLORREF);
};
cs_vicenzo
Messages postés178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 25 févr. 2007 à 11:07
Salut,
Sous Win32, les dll utilisent une convention d'appel C. C'est pour ca que quasiment tous les sources de dll que tu peux touver sont dans des languages procédural (c, pascal, ..). Les Dlls sont alors "language indépendante" et un exe ecrit dans un language 1 peut appeler un dll d'un language B du moment que la même convention d'appel est utilisée.
TU peux aussi créer des dlls qui exportent des classes avec des languages OOP. Tu peux exporter tes classes MAIS DEUX ENORMES LIMITATIONS :
* l'exe et la dll doivent avoir été compilées avec le MEME compilo car la décoration des nom de fonction sera différente et même les ABI seront différentes !
* Faire au config et linkage : par exemple, un exe en mode release et un dll en mode débug te feront surement crasher l'appli sur un 'delete'
Donc, exporter des classes dans un dll c'est cool que si tu est sur que la dll ne sera utilisées que par ton appli ou des aplis compilées avec les mêmes options et le même compilo... Donc exit une utilisation par Java.
C'est pour ca que les dll c++ n'ont jamais connues un grand essor..
Vous n’avez pas trouvé la réponse que vous recherchez ?
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 25 févr. 2007 à 11:34
Salut,
A mon avis, le meilleur moyen d'exporter les classes d'une DLL est de prévoir une fonction appelable à partir de n'importe quelle application. Cette fonction crée une instance d'une classe et retourne un pointeur. Une autre fonction assurera la destruction de cette instance. Les deux fonctions sont exportées de manière standard afin de permettre aux applications de les utiliser normalement quelque soit le langage avec lequel elles sont conçues.
cs_vicenzo
Messages postés178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 25 févr. 2007 à 12:34
Petite remarque sur la méthode de racpp, qui contourne les soucis d'allocation / désallocation entre app et dll ainsi que ceux des décorations de nom de fonction, mais la ou je ne suis pas d'accord, c'est que si racpp entends par "pointeur", un pointeur sur une instance de la classe, ne ne résoud rien si la classe possède des fonctions virtuelle car l'ABI générée par chaque compilo est différente (ordre inverse entre VC et BCB, par exemple)...
Exe : classe deux fonctions a(int) et b(double, double)
Donc , si le compilo de l'exe et différent du compilo de la dll, dans l'exe in appelle mon_pointeur->b(int, int) et on réalité, on apelle q() et ca plante...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 25 févr. 2007 à 23:50
vicenzo > La convention d'export DLL est stdcall et non celle du C (cdecl). VB, VBA et autres anciens interprétés seraient incapables d'appeler du cdecl et surtout de replacer ESP en sortie de fonction.
cs_vicenzo
Messages postés178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 26 févr. 2007 à 13:14
BruNews,
Autant pour moi, je devais être en train de mater un épisode de casimir en sirotant un verre de thérebentine quant j'ai ecris la phrase "les dll utilisent une convention d'appel C"....
.Reste que exporter de classes c++ dans des dlls n'est pas en général la meilleure des choses à faire si on veut un système un tant soit peu ouvert...
doudouhic
Messages postés7Date d'inscriptionmardi 6 mai 2003StatutMembreDernière intervention26 février 2007 26 févr. 2007 à 16:40
Bonjour,
Merci pour votre aide, en faite j'y suis arrivé, comme a dit azzamharir le moyen le plus simple d'exporter une classe dans une dll est d'utiliser AFX_EXT_CLASS. Cependant seux incovénient pour cette méthode on doit mettre avec la DLL le fichier .LIB et la classe .h.
Moi ce que je voulais avant tout c'est caché mon code source, mais avec le fichier .h, n'importe qui peut reimplimenter la classe et l'utiliser.
Enfin, pour cacher son code source, il faut utiliser les pointeurs sur la classe et ses fonctions ce qui doit être beaucoup plus defficile.