[C++] Dll, exportation d'une classe, c possible, non !?

Dll, exportation d'une classe, c possible, non !? [C++] - Programmation

Marsh Posté le 07-03-2002 à 18:05:26    

et on fait comment alors pour exporter une classe depuis une dll !? j'arrive pas à trouver dans la doc. Si qqn pouvait me dire ça, ça sert bien sympa !
Merci... :hello:

Reply

Marsh Posté le 07-03-2002 à 18:05:26   

Reply

Marsh Posté le 07-03-2002 à 18:06:48    

Code :
  1. class __declspec(dllexport) test
  2. {
  3. [...]
  4. }


 
sous Visual C++ vu que __declspec c specifique a microsoft (me semble)

 

[jfdsdjhfuetppo]--Message édité par deathsharp--[/jfdsdjhfuetppo]


---------------
What butter and whiskey won't cure, there is no cure for.
Reply

Marsh Posté le 07-03-2002 à 18:18:07    

Bien entendu n'espere pas la recuperer par un GetProc Adress :D
 
non ce n'est pas specifique a Visual, mais a la plateforme Windows...
Ming le reconnais aussi (malheureusement)...

Reply

Marsh Posté le 07-03-2002 à 19:11:01    

class AX_EXT_CLASS uneClass
{
 
}

Reply

Marsh Posté le 07-03-2002 à 21:01:03    

weblook$ a écrit a écrit :

class AX_EXT_CLASS uneClass
{
 
}  




et c koi AX_EXT_CLASS  :sarcastic:


---------------
What butter and whiskey won't cure, there is no cure for.
Reply

Marsh Posté le 07-03-2002 à 22:15:18    

euh non c'est AFX_EXT_CLASS,et ça sert justement à indiquer que l'on désire exporter cette classe.

Reply

Marsh Posté le 07-03-2002 à 22:18:19    

et ca serai pas un peu des MFC ce truc tout moche...
c juste un def


---------------
What butter and whiskey won't cure, there is no cure for.
Reply

Marsh Posté le 07-03-2002 à 22:23:51    

effectivement mais vu que qu'il utilise des dll c'est que son prog ne marchera que sous WIN donc...MFC power.Quand on peut les utiliser pourquoi se priver ça simplifie la prog alors..(dans cette exemple on est d'accord ça revient au même)

Reply

Marsh Posté le 07-03-2002 à 23:03:22    

weblook$ a écrit a écrit :

effectivement mais vu que qu'il utilise des dll c'est que son prog ne marchera que sous WIN donc...MFC power.Quand on peut les utiliser pourquoi se priver ça simplifie la prog alors..(dans cette exemple on est d'accord ça revient au même)  




Ca oblige juste en enmener un paquet de Dlls...

Reply

Marsh Posté le 08-03-2002 à 09:29:27    

BENB a écrit a écrit :

 
Ca oblige juste en enmener un paquet de Dlls...  




 
ça oblige à livrer 1 seule Dll en plus.
Et encore, qd on fait un projet MFC, on peut attacher la dll au l'executable, ce qui fait qu'on se soucie même pas de cette dll, elle est avec l'exe (qui grossit d'un petit Mo du coup, ms finalement, on s'en tape !)
 
Alors, oui, vive les MFC, et merci tt le monde !
 
Et, de l'autre coté, pour récupérer cette classe, 'faut faire comment !?

Reply

Marsh Posté le 08-03-2002 à 09:29:27   

Reply

Marsh Posté le 08-03-2002 à 09:37:38    

t'inclues le lib + le .h dans ton projet.


---------------
Super.
Reply

Marsh Posté le 08-03-2002 à 09:44:18    

Godbout a écrit a écrit :

t'inclues le lib + le .h dans ton projet.  




Il y en a qui sont des experts ;)

Reply

Marsh Posté le 08-03-2002 à 09:47:35    

Godbout a écrit a écrit :

t'inclues le lib + le .h dans ton projet.  




 
oui, ça j'aurai su, merci ! :D
Ms g pas été assez précis (dsl) : en dynamique je veux dire...

 

[jfdsdjhfuetppo]--Message édité par El_Gringo--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 08-03-2002 à 09:48:50    

BENB a écrit a écrit :

 
Il y en a qui sont des experts ;)  




 
on se moque ?? :D


---------------
Super.
Reply

Marsh Posté le 08-03-2002 à 09:50:26    

El_Gringo a écrit a écrit :

 
 
oui, ça j'aurai su, merci ! :D
Ms g pas été assez précis (dsl) : en dynamique je veux dire...  
 
 




 
ben pour importer des fonctions d'une dll t'as deux facons, soit avec un lib + h (loadtime), soit avec un LoadLibrary + GetProcAddress (runtime).
Pour une classe tu dois forcement avoir le definition de ta classe dans ton projet, donc tu dois passer forcement par un loadtime.


---------------
Super.
Reply

Marsh Posté le 08-03-2002 à 09:59:39    

Godbout a écrit a écrit :

 
 
ben pour importer des fonctions d'une dll t'as deux facons, soit avec un lib + h (loadtime), soit avec un LoadLibrary + GetProcAddress (runtime).
Pour une classe tu dois forcement avoir le definition de ta classe dans ton projet, donc tu dois passer forcement par un loadtime.  




 
Ouais, tu dois avoir raison.
Bon, bah merci tt le monde. ça me sera pas utile maintenant du coup, ms ça me servira bien un jour, c sur ! :D

Reply

Marsh Posté le 08-03-2002 à 10:06:42    

:sol: :D
 
[:freekill]


---------------
Super.
Reply

Marsh Posté le 08-03-2002 à 10:14:41    

Pour une fois que je peux aider quelqu'un [:olimou]


---------------
Super.
Reply

Marsh Posté le 18-03-2008 à 12:10:57    

deathsharp a écrit :

Code :
  1. class __declspec(dllexport) test
  2. {
  3. [...]
  4. }


 
sous Visual C++ vu que __declspec c specifique a microsoft (me semble)  
 
[jfdsdjhfuetppo]--Message édité par deathsharp--[/jfdsdjhfuetppo]


 
Merci Pour l'info ; mais comment utilise-t-on ensuite cette classe exportée ?

Reply

Marsh Posté le 18-03-2008 à 12:52:05    

golden shovel là. LE post à *6 ans*
Pour info, c moche d'exporter des classes, mieux vaut exporter une simple fonction qui cree/detruit des instances

Message cité 1 fois
Message édité par Joel F le 18-03-2008 à 12:52:15
Reply

Marsh Posté le 18-03-2008 à 13:32:28    

Joel F a écrit :

golden shovel là. LE post à *6 ans*
Pour info, c moche d'exporter des classes, mieux vaut exporter une simple fonction qui cree/detruit des instances


 
Le post a 6 ans, mais tu vois qu'on m'a repondu :p D'ailleurs je te remercie.
 
Disons que c'est moche d'exporter des classes, j'ai alors crée les fonctions qui cree et detruit des instances.
Mais je ne vois toujours pas comment les utiliser.
 
Un peu de code:

Code :
  1. INSTANCE DLLHandle;
  2. //Mon constructeur prend en paramètre deux entiers
  3. typedef int(*Type_Pointeur_De_Fonction)(int, int);
  4. Type_Pointeur_De_Fonction Pointeur_Fonction;
  5. DLLHandle = LoadLibrary("dll.dll" );
  6. //Ma fonction qui cree une instance de ma classe s'appelle 'constructeur'
  7. Pointeur_Fonction = (Type_Pointeur_De_Fonction)GetProcAddress(DLLHandle,"constructeur" );
  8. //D'habitude on fait : MaClasse* objet = new MaClass(10,10);
  9. objet = Pointeur_Fonction(10,10); //Mais ici je en sais pas faire


Message édité par sagopa le 18-03-2008 à 13:33:17
Reply

Marsh Posté le 18-03-2008 à 13:41:43    

je viens de voir un truc ; est-il possible de faire ceci :  
 

Code :
  1. MaClasse objet = Pointeur_Fonction(10,10);


 
Evidemment, on inclut MaClasse.h

Reply

Marsh Posté le 18-03-2008 à 14:37:28    

en gros ta une classe Toto dans ton DLL
Son constructeur prend en parametre un float et une int.
tu fais un :
 

Code :
  1. Toto* build_toto( float f, int i )
  2. {
  3.   return new Toto(f,i);
  4. }
  5. void release_tot( Toto*& ptr )
  6. {
  7.   delete ptr;
  8.   ptr = NULL;
  9. }


 
Pour utilsier  
 

Code :
  1. Toto* mon_toto = build_toto(4.5,3);
  2. // ...
  3. release_toto(mon_toto);

Reply

Marsh Posté le 18-03-2008 à 17:07:43    

Merci beaucoup c'est très clair comme réponse ;)
 
Il ne reste plus qu'à tester ...

Reply

Marsh Posté le 18-03-2008 à 17:12:01    

Aprés si tout tes objets héritent d'une interface qui va bien et que tu te donne une petite fonction factory, tu peut te remonter un mini-système façon COM
 

Code :
  1. IComponent* cmp = create_instance_of("Toto" );

Reply

Marsh Posté le 19-03-2008 à 09:29:10    

J'ai un autre problème. Quand je charge les DLL, je ne suis pas censé savoir si elle sont présentes ou pas. C'est-à-dire je ne chargerai que les DLL existentes. Donc je ne suis pas censé connaitre le nom de la classe ; ce que je sais c'est que mes DLL sont des classes filles d'une classe mère connue(=existe).  
Avec ce que je viens de voir pour charger une DLL, je dois forcément connaitre le nom de la classe ..

Reply

Marsh Posté le 19-03-2008 à 09:51:32    

exporte une fonction par DLL qui te renvoit la liste des classes disponibles ;)

Reply

Marsh Posté le 19-03-2008 à 10:17:05    

Joel F a écrit :

exporte une fonction par DLL qui te renvoit la liste des classes disponibles ;)


 
Là je ne comprends pas trop, je me suis mal expliqué je pense. En faite une DLL correspondra à une seule classe.

Reply

Marsh Posté le 19-03-2008 à 11:51:17    

Ben, sur le même principe qu'à présenter Joel F au dessus. Admettons que la classe mère soit Foo, et que la classe fille présente dans la dll soit Bar:

Code :
  1. Foo* mon_addon = build_addon_instance(4.5,3);
  2. // ...
  3. release_foo(mon_addon);


et le build_addon_instance de cette dll précisément serait donc une instanciation d'un pointeur vers Bar.
 
Ton programme central, lui, n'as pas besoin de savoir autre chose que "cette dll permet de charger une instance de Foo*"

Reply

Marsh Posté le 19-03-2008 à 12:27:20    

Merciii !!
 
Ceci marche si les fonctions sont virtuelles ! exact ?
 

Reply

Marsh Posté le 19-03-2008 à 12:33:02    

Tout à fait; il peut y avoir des fonctions non virtuelles, mais ça servirait absolument à rien. Donc pense bien ton interface ;)

Reply

Marsh Posté le 20-03-2008 à 14:58:55    

Je n'ai toujours pas réussi ... :(
 
La compilation marche nikel ; mais j'ai une erreur lors de l'execution :  

Code :
  1. The instruction at "0x00000000" referenced memory at "0x00000000". The memory could not be "read" ...


 
Voici comment je charge la Dll et appelle la fonction :  

Code :
  1. HINSTANCE DLLHandle;
  2. //Module est la classe Mere connue
  3. Typedef Module*(*Type_Pointeur_De_Fonction)(int);
  4. Type_Pointeur_De_Fonction Pointeur_Fonction;
  5. //moteur.dll est la dll à charger, situé dans le mm repertoire que l'exe
  6. DLLHandle = LoadLibrary("moteur.dll" );
  7. //buil_module est la fonction qui appelle le constructeur de la classe fille  présente dans la dll  
  8. Pointeur_Fonction = (Type_Pointeur_De_Fonction)GetProcAddress(DLLHandle,"build_module" );
  9.   Module* module1 = Pointeur_Fonction(10);


 
Le programme se bloque lorsqu'il veut exécuter la dernière ligne

Reply

Marsh Posté le 20-03-2008 à 15:07:23    

Sur certains forum, on parle d'un fichier .def ; pour la compilation je n'ai pas utilisé un fichier comme tel ( je compile avec un Makefile, le compilateur est mingw)
 
Aussi j'ai vu parfois des  << extern "C" >> Devrais-je le faire ?

Reply

Marsh Posté le 20-03-2008 à 15:14:38    

Tu ne vérifies pas si DLLHandlet et Pointeur_Fonction sont valides, ce serait un bon début d'isoler la source de l'erreur.

Reply

Marsh Posté le 20-03-2008 à 15:27:49    

DLLHandle n'est pas NULL.
 
Mais Pointeur_Fonction == NULL

Reply

Marsh Posté le 20-03-2008 à 15:43:07    

sagopa a écrit :

Sur certains forum, on parle d'un fichier .def ; pour la compilation je n'ai pas utilisé un fichier comme tel ( je compile avec un Makefile, le compilateur est mingw)
 
Aussi j'ai vu parfois des  << extern "C" >> Devrais-je le faire ?


 
A mon avis tu devrais rajouter cette déclaration dans les .h (et les .c). Sinon tes noms de fonctions vont être modifiées pour prendre en compte le polymorphisme du C++.

Reply

Marsh Posté le 20-03-2008 à 16:31:58    

J'ai regardé les forums pour utiliser extern C mais il y a des utilisations differentes a chaques fois. Voici comment je fais :  
 
Dans le .h

Code :
  1. #define DllImport   __declspec(dllimport)
  2. DllImport void uneMethodeDeMaClasse(parametres);


 
Dans le .cpp

Code :
  1. #define DllExport   extern "C" __declspec(dllexport)
  2. DllExport void MaClasse::uneMethodeDeMaClasse(parametres){ ...}


 
Est-ce que c'est correct ?


Message édité par sagopa le 20-03-2008 à 16:32:50
Reply

Marsh Posté le 20-03-2008 à 18:19:22    

Je pense que mon pb est : comment exporter une fonction membre.
 
J'ai trouvé pas mal de doc sur ce sujet, mais personne ne parle de ca ; je commence à croire que ce n'est pas possible ...  
 
Rassurer moi la fct qui crée une instance de ma classe fait bien partie de ma classe ?!

Reply

Marsh Posté le 20-03-2008 à 18:38:14    

Une méthode ne s'exporte pas. Une classe ou une fonction oui, le reste non.
Et non, la méthode créatrice de l'instance ne doit surtout pas être une méthode de classe vu que justement tu cherches à récupérer la classe.

Reply

Marsh Posté le 20-03-2008 à 22:26:42    

ok je comprends pk ça ne marche pas. Par contre j'ai trouvé une piste, pour ceux ke ça interesse : http://www.codeguru.com/cpp/w-p/dl [...] .php/c123/

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed