Laison dynamique d'une dll de classe [DLL] - C++ - Programmation
Marsh Posté le 03-08-2004 à 10:36:49
regarde dans ce topic, j'explique comment appeler une dll de façon dynamique
http://forum.hardware.fr/forum2.ph [...] 798&cat=10
Marsh Posté le 03-08-2004 à 11:09:22
Harkonnen a écrit : regarde dans ce topic, j'explique comment appeler une dll de façon dynamique |
J'ai testé ce type de programme mais dans ton cas tu fais une DLL d'une fonction pas d'une classe.
Donc quand moi j'essaie d'appeler de cette maniere une méthode de ma classe ca ne marche pas .
Je te donne mon exemple de DLL. Ce n'est qu'un exemple simple pour tester car mon but etant de faire la dLL d'une classe ACtions plus importante dans le cadre d'un projet.
J'espere que tu ve pourvoir m'aider car j'ai trop de mùalk et je sature a force lol.
Voila la .h de la creation de la dll
Code :
|
Et le .cpp
Code :
|
Si tu ve que je t'envoie mon main de test demande moi je te le posterai.
Merci d'avance
a+
Marsh Posté le 03-08-2004 à 12:18:51
Heuuh ... t'as pas l'impression de réinventer la roue avec ta gestion d'erreur là ??
Marsh Posté le 03-08-2004 à 12:47:04
Cricri_ a écrit : Heuuh ... t'as pas l'impression de réinventer la roue avec ta gestion d'erreur là ?? |
+1
GetLastError(), c'est pas fait pour les chiens
Marsh Posté le 03-08-2004 à 13:07:00
Harkonnen a écrit : +1 |
Tout d'abord premierement ca n'est qu'un exemple.
Deuxiemement GetLasterror() te retourne une erreur du type 10051 et il te dit pas a koi cela correspond. Voila pourquoi je redéfinis les constante de type WSA.
Bref peut importe la question n'est pas sur l'utilité relative ou non de mon programme mais plutot sur comment utiliser le constructeur et les méthodes de ma classe erreur via une liaison dynamique.
Si toi ou d'autres personnes ont une réponse aux appels dynamique de méthodes d'une classe exportée de la manière décrite plus haut merci de m'éclairer car je suis au fond du trou dans le noir total.
Merci d'avance
Marsh Posté le 03-08-2004 à 14:04:33
quand on charge une bibliothèque dynamique de façon explicite (avec un LoadLibrary sous Windows et un dlopen sous unix), on ne peux pas appeler simplement un constructeur d'une classe de cette bibliothèque.
La façon la plus simple est, comme l'a dit Harkonnen, de définir une fonction qui va te permettre de construire cet objet. Une fois l'objet construit, tu peux le manipuler normalement.
Code :
|
C'est la méthode la plus simple. A noter que contrairement à ce qui apparait ici, il est souvent préférable d'exporter également un desctructeur pour que la destruction ai lieu dans la bibliothèque.
Marsh Posté le 03-08-2004 à 14:46:34
SoWhatIn22 a écrit : |
Je te remercie pour ton aide. Je vais tester ca tout de suite. Mias j'ai encore une question si je peut abuser lol.
Une fois que tu as appelé ta fonction qui crée une nouvelle instance de la classe de la DLL avec ce pointeur tu pêut accéder a toutes les méthodes de la classe. Quand tu y accèdes il y a un chargement de la DLL encore ou alors c'est indépendant de la DLL ensuite.
Merci en tout cas pour ce code que je vais tester.
++
EDIT :
Il y avait un probleme car LoadLibrary a 2 L en majuscule mais ca j'ai changé. Le problème est que le compilateur me di qu'il ne reconnais pas le mot constructeur() (undeclared identifier). ET faut il que j'insere le .h de la dll dans le main ou pas. En gros quelles sont les insertions a faire dans mon prog principal.
Marsh Posté le 03-08-2004 à 15:15:45
>Une fois que tu as appelé ta fonction qui crée une
> nouvelle instance de la classe de la DLL avec ce
> pointeur tu pêut accéder a toutes les méthodes de
> la classe.
oui
> Quand tu y accèdes il y a un chargement de la DLL encore
tu n'as pas bien compris ce qu'est le chargement d'une dll; pour faire simple: la dll n'est chargée qu'une seule fois, suite à l'appel de la fonction LoadLibrary. Elle n'est déchargée que lors de l'appel ultérieur de la fonction FreeLibrary.
Marsh Posté le 03-08-2004 à 15:29:27
SoWhatIn22 a écrit : > |
Oki j'ai bien compris mais saurais tu d'ou viens l'erreur de compilation au niveau du terme constructeur().
il di undeclared identifier.
En fait je comprend pas trop ton #define pe etre est ce le pb.
Faut il inclure le X.h dans le prog principal.
merci
Marsh Posté le 03-08-2004 à 16:33:00
> En fait je comprend pas trop ton #define pe etre est ce le pb.
Ce n'est pas un #define, c'est un typedef! c'est complètement différent. Dans mon exemple, CONSTRUCTEUR_DE_X est un type: une instance de ce type est une fonction qui retourne un X* et qui ne prend pas d'argument.
un typedef est une déclaration de *type*.
> Faut il inclure le X.h dans le prog principal
Si tu en as besoin, oui! Sinon, il faut au moins déclarer le type de X.
Code :
|
Mais de toute façon, si tu veux par la suite appeler des méthodes de l'instance créée, il faudra forcément inclure le header de la classe X, sans quoi le compilateur ne sera pas en mesure de générer le code puisque'il ne connait pas le type de l'instance que tu veux manipuler...
Marsh Posté le 04-08-2004 à 10:07:55
SoWhatIn22 a écrit : > En fait je comprend pas trop ton #define pe etre est ce le pb. |
Merci pour tes conseils mais j'ai toujours des problemes de compil.
Je te donne mon main car je comprend pas pourquoi ca fonctionne pas c'est très bizarre car je pensais avoir compris ce que tu m'a di et en fait ca marqhe pas erreur de compilation.
Pour info j'ai mis la DLL dans le repertoire debug du projet du main et dans winNT/system.
Code :
|
Voila l'erreur de compil obtenue.
Code :
|
MErci encore a toi par avance.
Je sais que je suis pas très très fort mais bon faut bien apprendre
Marsh Posté le 04-08-2004 à 16:11:05
1. si tu inclus le header erreur.h (je suppose que la classe erreur doit être déclarée dedans), alors tu n'as pas besoin de redéclarer le type (class erreur; )
je te donne un exemple qui fonctionne sous win32
Code :
|
Marsh Posté le 04-08-2004 à 16:31:29
Dans ce header que je suppose s'arrete avant le main
ou ets ce que tu exportes la fonction factory qui crée l'instance.
Pourquoi menlange tu le .h et le .cpp. Est ce important ou est ce que je pe le séparer comme je l'ai montré au dessus.
vais essayer ca merci
Marsh Posté le 04-08-2004 à 22:27:48
J'ai fait le ménage, le boulet est banni et ses posts supprimés
Marsh Posté le 04-08-2004 à 22:31:22
antp a écrit : J'ai fait le ménage, le boulet est banni et ses posts supprimés |
c'était allopassxp encore ?
Marsh Posté le 04-08-2004 à 22:45:37
Harkonnen a écrit : c'était allopassxp encore ? |
Pas sûr, mais y a des chances.
Marsh Posté le 06-08-2004 à 09:06:13
Si quelqu'un a une idée pour que la liaison marche je vous remercie car je dois créer des dll importantes pour un projet que je dois rendre sous peu.
(rien a voir avec ma classe d'exception merdique)
merci ++
Marsh Posté le 18-10-2009 à 17:31:39
Je réponds bien bien tard, mais y'aurait pas simplement eu une faute de frappe dans son code? ("constucteur" au lieu de "constRucteur" ).
Enfin bref en tout cas merci pour l'info je saurai ainsi comment faire moi aussi (je suis tombé ici en cherchant une réponse sur mon meilleur ami )
Marsh Posté le 03-08-2004 à 10:34:21
Bonjour a tous.
Je suis actuellement en train d'essayer de creer une dll d'une classe C++.
La creation de la DLL est faite par les fonctions dllexport et dllimport.
A priori elle se crée bien et j'arrive meme à l'utiliser en liaison statique avec l'inclusion du fichier .lib.
Je voudrais reussir a faire une laison dynamique, mais je n'y arrive pas.
Quelles sont les différentes étapes à effectuer pour faire cette liaison dynamique?
PS: Dans la création de ma DLL mon fichier .cpp est exactement identique a celui au fichier classique de l'implémentation de la classe contenue dans le .h. J'ai par contre modifié le .h pour mettre les fonction ddlexport et dll import apres le nom de la classe.
Merci d'avance pour votre aide.
a+