Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1090 connectés 

  FORUM HardWare.fr
  Programmation

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

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

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

n°109107
El_gringo
Posté le 07-03-2002 à 18:05:26  profilanswer
 

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:

mood
Publicité
Posté le 07-03-2002 à 18:05:26  profilanswer
 

n°109108
deathsharp
Posté le 07-03-2002 à 18:06:48  profilanswer
 

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.
n°109115
BENB
100% Lux.
Posté le 07-03-2002 à 18:18:07  profilanswer
 

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)...

n°109157
weblook$
happy face
Posté le 07-03-2002 à 19:11:01  profilanswer
 

class AX_EXT_CLASS uneClass
{
 
}

n°109188
deathsharp
Posté le 07-03-2002 à 21:01:03  profilanswer
 

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.
n°109234
weblook$
happy face
Posté le 07-03-2002 à 22:15:18  profilanswer
 

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

n°109235
deathsharp
Posté le 07-03-2002 à 22:18:19  profilanswer
 

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.
n°109239
weblook$
happy face
Posté le 07-03-2002 à 22:23:51  profilanswer
 

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)

n°109268
BENB
100% Lux.
Posté le 07-03-2002 à 23:03:22  profilanswer
 

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...

n°109353
El_gringo
Posté le 08-03-2002 à 09:29:27  profilanswer
 

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 !?

mood
Publicité
Posté le 08-03-2002 à 09:29:27  profilanswer
 

n°109355
godbout
Génial.
Posté le 08-03-2002 à 09:37:38  profilanswer
 

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


---------------
Super.
n°109357
BENB
100% Lux.
Posté le 08-03-2002 à 09:44:18  profilanswer
 

Godbout a écrit a écrit :

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




Il y en a qui sont des experts ;)

n°109360
El_gringo
Posté le 08-03-2002 à 09:47:35  profilanswer
 

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]

n°109361
godbout
Génial.
Posté le 08-03-2002 à 09:48:50  profilanswer
 

BENB a écrit a écrit :

 
Il y en a qui sont des experts ;)  




 
on se moque ?? :D


---------------
Super.
n°109362
godbout
Génial.
Posté le 08-03-2002 à 09:50:26  profilanswer
 

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.
n°109368
El_gringo
Posté le 08-03-2002 à 09:59:39  profilanswer
 

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

n°109371
godbout
Génial.
Posté le 08-03-2002 à 10:06:42  profilanswer
 

:sol: :D
 
[:freekill]


---------------
Super.
n°109375
godbout
Génial.
Posté le 08-03-2002 à 10:14:41  profilanswer
 

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


---------------
Super.
n°1703984
sagopa
Posté le 18-03-2008 à 12:10:57  profilanswer
 

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 ?

n°1704005
Joel F
Real men use unique_ptr
Posté le 18-03-2008 à 12:52:05  profilanswer
 

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
n°1704033
sagopa
Posté le 18-03-2008 à 13:32:28  profilanswer
 

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
n°1704040
sagopa
Posté le 18-03-2008 à 13:41:43  profilanswer
 

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

n°1704097
Joel F
Real men use unique_ptr
Posté le 18-03-2008 à 14:37:28  profilanswer
 

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);

n°1704192
sagopa
Posté le 18-03-2008 à 17:07:43  profilanswer
 

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

n°1704199
Joel F
Real men use unique_ptr
Posté le 18-03-2008 à 17:12:01  profilanswer
 

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" );

n°1704387
sagopa
Posté le 19-03-2008 à 09:29:10  profilanswer
 

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 ..

n°1704392
Joel F
Real men use unique_ptr
Posté le 19-03-2008 à 09:51:32  profilanswer
 

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

n°1704420
sagopa
Posté le 19-03-2008 à 10:17:05  profilanswer
 

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.

n°1704506
IrmatDen
Posté le 19-03-2008 à 11:51:17  profilanswer
 

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*"

n°1704539
sagopa
Posté le 19-03-2008 à 12:27:20  profilanswer
 

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

n°1704546
IrmatDen
Posté le 19-03-2008 à 12:33:02  profilanswer
 

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

n°1705400
sagopa
Posté le 20-03-2008 à 14:58:55  profilanswer
 

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

n°1705409
sagopa
Posté le 20-03-2008 à 15:07:23  profilanswer
 

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 ?

n°1705415
IrmatDen
Posté le 20-03-2008 à 15:14:38  profilanswer
 

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.

n°1705430
sagopa
Posté le 20-03-2008 à 15:27:49  profilanswer
 

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

n°1705445
tpierron
Posté le 20-03-2008 à 15:43:07  profilanswer
 

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++.

n°1705481
sagopa
Posté le 20-03-2008 à 16:31:58  profilanswer
 

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
n°1705565
sagopa
Posté le 20-03-2008 à 18:19:22  profilanswer
 

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 ?!

n°1705580
IrmatDen
Posté le 20-03-2008 à 18:38:14  profilanswer
 

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.

n°1705738
sagopa
Posté le 20-03-2008 à 22:26:42  profilanswer
 

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/

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

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

 

Sujets relatifs
[JAVA] problème avec une classe....[JAVA] Interroger une BD à partir d'une applet, c'est possible ?
IIS 5 et jsp : possible ou pas[C++] creer un objet avec une classe aleatoire ??
Utilisation de MFC , classe CInternet[DELPHI - DLL]pb d'affichage d'une form
[C] thread sous win/dos c est possible ??[Java] passage d'un tableau dans DLL et retour ? c'est encore moi!
[ JS ] est ce que c'est possible ?[win/c++] Appeler une DLL
Plus de sujets relatifs à : [C++] Dll, exportation d'une classe, c possible, non !?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR