Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

passage d'une classe en parametre d'une fonction dll

14 réponses
Avatar
dark poulpo
Re, dans la serie poulpo je voudrais les classes!!!!

alors voila, mon exe a une classe bourrée de fonction qui sert de manageur,
quand je charge ma dll je lui passe le pointeur vers cette classe pour que
la dll puisse sen servir pour creer, ....

seulement voila, jai un probleme au linkage. hors jaurais bien voulu avoir
la possibilité d'y accedder.

ya des solutions?

avant jutilisais une dll pour le manageur, a cette epoque tout etait nickel,
mais la je voudrais eviter pour l'instant.

jai pensé aussi a faire une structure qui comporte des pointeurs de
fonctions (de ma classe) pour la dll et a la fournir en paramettre, peut
etre que c'est propre,jen sais rien.

merci d'avance

--
-----
http://dark.freezee.org/
- Dark Update v1.0
- Dark Emule v0.44b r4
- Dark 3D-X (le desktop 3d pour windows) (en cours)

10 réponses

1 2
Avatar
Vincent Burel
"dark poulpo" wrote in message
news:41f6d4d8$0$6608$
Re, dans la serie poulpo je voudrais les classes!!!!

alors voila, mon exe a une classe bourrée de fonction qui sert de


manageur,
quand je charge ma dll je lui passe le pointeur vers cette classe pour que
la dll puisse sen servir pour creer, ....



très mauvaise idée, une classe c'est pas une donnée très portable (imaginez
que le plug-in soit programmé en Visual Basic)

seulement voila, jai un probleme au linkage. hors jaurais bien voulu avoir
la possibilité d'y accedder.



à quoi ?

ya des solutions?



toujours ! :-)

avant jutilisais une dll pour le manageur, a cette epoque tout etait


nickel,
mais la je voudrais eviter pour l'instant.

jai pensé aussi a faire une structure qui comporte des pointeurs de
fonctions (de ma classe) pour la dll et a la fournir en paramettre, peut
etre que c'est propre,jen sais rien.



et toujours ce souci de propreté ! :-)

soyez plus précis dans vos questions, d'autant que vous en posez beaucoup.
Merci d'avance
VB
Avatar
adebaene
dark poulpo wrote:
Re, dans la serie poulpo je voudrais les classes!!!!

alors voila, mon exe a une classe bourrée de fonction qui sert de


manageur,
quand je charge ma dll je lui passe le pointeur vers cette classe


pour que
la dll puisse sen servir pour creer, ....


Tu lui passe un pointeur vers une instance de cette classe tu veux
dire, je présume...

seulement voila, jai un probleme au linkage. hors jaurais bien voulu


avoir
la possibilité d'y accedder.


Quel problème? Montre nous un bout de code représentatif ainsi que le
message d'erreur, parce que là, comme çà, ma boule de cristal me dit
que l'erreur est ligne 46 de main.cpp, mais comme elle n'est plus sous
garantie je ne m'avancerai pas trop...


jai pensé aussi a faire une structure qui comporte des pointeurs de
fonctions (de ma classe) pour la dll et a la fournir en paramettre,


peut
etre que c'est propre,jen sais rien.


Non, c'est immonde, non portable et indéfini vis-à-vis de la norme.
Ceci dit, si tu tiens *vraiement* à te coltnier des pointeurs de
fonctions membre, libre à toi...

Arnaud
MVP - VC
Avatar
dark poulpo
> très mauvaise idée, une classe c'est pas une donnée très portable


(imaginez
que le plug-in soit programmé en Visual Basic)


exact, meme si dans mon cas se serait un suicide, c vrai que vaut mieux
prevoir.

> seulement voila, jai un probleme au linkage. hors jaurais bien voulu


avoir
> la possibilité d'y accedder.

à quoi ?


acceder a cette instance de classe

> jai pensé aussi a faire une structure qui comporte des pointeurs de
> fonctions (de ma classe) pour la dll et a la fournir en paramettre,


peut
> etre que c'est propre,jen sais rien.



c'est un peu ce que vous m'avez cité sur un autre post :

ref: Si vous voulez que votre plug-in utilise des fonction
du manager directement, alors vous pouvez passer un jeu de fonction sous la
forme d'une structure de donnée ou d'une lpVtbl (tableau de fonction). dans
ce cas les prototype de ces fonctions devront être définis avec leur
convention d'appel... généralement on utilise __stdcall (car compatible avec
tous les langage)...
Avatar
dark poulpo
>Tu lui passe un pointeur vers une instance de cette classe tu veux


dire, je présume...

oué c ca


seulement voila, jai un probleme au linkage. hors jaurais bien voulu




avoir
la possibilité d'y accedder.


Quel problème? Montre nous un bout de code représentatif ainsi que le
message d'erreur, parce que là, comme çà, ma boule de cristal me dit
que l'erreur est ligne 46 de main.cpp, mais comme elle n'est plus sous
garantie je ne m'avancerai pas trop...



c'est pas un probleme de code, juste de linkage vu quil ne trouve rien,
c'est comme si javais

#include "autrecls.h"

void maclasse::tagada(CAutreCls *ptr);

mais que javais pas le autrecls.cpp (du coup probleme de linkage)

jai pensé aussi a faire une structure qui comporte des pointeurs de
fonctions (de ma classe) pour la dll et a la fournir en paramettre,




peut
etre que c'est propre,jen sais rien.


Non, c'est immonde, non portable et indéfini vis-à-vis de la norme.
Ceci dit, si tu tiens *vraiement* à te coltnier des pointeurs de
fonctions membre, libre à toi...



mettez vous d'accord entre VB et toi, parceque VB me parle dans un autre
post :

ref: Si vous voulez que votre plug-in utilise des fonction
du manager directement, alors vous pouvez passer un jeu de fonction sous la
forme d'une structure de donnée ou d'une lpVtbl (tableau de fonction). dans
ce cas les prototype de ces fonctions devront être définis avec leur
convention d'appel... généralement on utilise __stdcall (car compatible avec
tous les langage)...

ce qui ressemble bp a ma structure de pointeur de fonction.

merci, pour l'aide, meme si je pose bp de question!!!
Avatar
adebaene
dark poulpo wrote:
>Tu lui passe un pointeur vers une instance de cette classe tu veux
dire, je présume...

oué c ca


>> seulement voila, jai un probleme au linkage. hors jaurais bien


voulu
avoir
>> la possibilité d'y accedder.
>Quel problème? Montre nous un bout de code représentatif ainsi que


le
>message d'erreur, parce que là, comme çà, ma boule de cristal me


dit
>que l'erreur est ligne 46 de main.cpp, mais comme elle n'est plus


sous
>garantie je ne m'avancerai pas trop...

c'est pas un probleme de code, juste de linkage vu quil ne trouve


rien,
c'est comme si javais

#include "autrecls.h"

void maclasse::tagada(CAutreCls *ptr);

mais que javais pas le autrecls.cpp (du coup probleme de linkage)



Tu ne nous a toujours pas montré un bout de code (ou même de
pseudo-code) qui présente clairement ton problème. Ton erreur de
link, elle se produit quand tu linke quoi? La DLL ou l'EXE? C'est quel
symbole qu'il manque (parce que je suppose que c'est un symbole
manquant ton erreur, mais tu ne nous l'as pas dit).
Décrit nous un peu plus en détail ce que tu veux faire, parce que là
c'est le flou complet!!

>> jai pensé aussi a faire une structure qui comporte des pointeurs


de
>> fonctions (de ma classe) pour la dll et a la fournir en


paramettre,
peut
>> etre que c'est propre,jen sais rien.
>Non, c'est immonde, non portable et indéfini vis-à-vis de la


norme.
>Ceci dit, si tu tiens *vraiement* à te coltnier des pointeurs de
>fonctions membre, libre à toi...

mettez vous d'accord entre VB et toi, parceque VB me parle dans un


autre
post :


Vincent part du principe que tu fais un plugin, que tu veux être
portable entre différents langages et que tu es prêt à mettre les
mains dans le cambousi de l'implémentation faite par VC de tes
classes.
Comme rien ne m'a indiqué cela dans ton post, je suis parti du
principe que tu voulais simplement faire du C++ à peu près propre
avec une DLL chargée dynamiquement.
Comme tu ne nous a pas décrit ton problème, on ne peut pas te
répondre sans jouer aux devinettes sur ce que tu essaies réellement
de faire.

Dans tous les cas, s'amuser à jouer à la main avec des v-tables, cela
peut être utile dans certains cas mais c'est un comportement indéfini
par rapport à la norme C++, donc à éviter si ce n'est pas
strictement nécessaire.
Quand à manipuler des pointeurs de fonctions membres, c'est faisable
et défini, mais je pense que tu ne t'es jamais amusé avec ces
bestiaux si tu envisages de les utiliser alors que ce n'est pas
strictement nécessaire :-)

Arnaud
MVP - VC
Avatar
dark poulpo
Tu ne nous a toujours pas montré un bout de code (ou même de
pseudo-code) qui présente clairement ton problème. Ton erreur de
link, elle se produit quand tu linke quoi? La DLL ou l'EXE?

kan je link la dll, (ca me fait pensé a la nostalgie du zelda!!! :-)) )

voila l'exemple de ma dll qui foire au linkage, car elle ne trouve pas le
code de CDataManager

#include "..datamanager.h"

#define SDK_API __declspec(dllexport)

SDK_API void _InitBySystem(CDataManager *dm) // fonction appellée par mon
exe
{
data = dm->Load("pluginsessai.syn");
....
}
Avatar
adebaene
dark poulpo wrote:
Tu ne nous a toujours pas montré un bout de code (ou même de
pseudo-code) qui présente clairement ton problème. Ton erreur de
link, elle se produit quand tu linke quoi? La DLL ou l'EXE?

kan je link la dll, (ca me fait pensé a la nostalgie du zelda!!!


:-)) )

voila l'exemple de ma dll qui foire au linkage, car elle ne trouve


pas le
code de CDataManager

#include "..datamanager.h"

#define SDK_API __declspec(dllexport)

SDK_API void _InitBySystem(CDataManager *dm) // fonction appellée


par mon
exe
{
data = dm->Load("pluginsessai.syn");
....
}



Ok, on y voit plus clair... Je suppose que dans datamanager.h,
CDataManager n'est pas déclarée avec __declspec(dllexport) ou
__declspec(dllimport).

Le plus simple, c'est que CDataManager soit une classe abstraite qui ne
définit que des méthodes virtuelles pures (==classe d'interface).
Dans l'executable, tu as une classe CDataManagerImpl qui hérite de
CDataManager et implémente toutes ces méthodes. Tu passes à
_InitBySystem une instance de CDataManagerImpl (mais la DLL ne connait
que le type CDataManager, pas CDataManagerImpl).

En fait, ca revient à ce que tu proposais au départ de passer un
tableau de pointeurs de fonctions membres, sauf que là c'est fait
proprement par le compilateur : ce tableau, c'et la v-table de l'objet
passé.

Arnaud
MVP - VC
Avatar
dark poulpo
parfait, merci, je vais faire ca des que jarrive chez moi,
question supplementaire, que se passe 'til si plus tard je rajoutes dautre
fonction a ma classe?

les dll de l'ancienne version continueront a fonctionner?
Avatar
Arnaud Debaene
dark poulpo wrote:
parfait, merci, je vais faire ca des que jarrive chez moi,
question supplementaire, que se passe 'til si plus tard je rajoutes
dautre fonction a ma classe?

les dll de l'ancienne version continueront a fonctionner?



Pour garantir que cela continue à fonctionner, tu fais une autre classe
abstraite CDataManagerExt qui hérite de CDataManager et qui rajoute de
nouvelles méthodes virtuelles pures.

L'objet réellement passé à _InitBySystem est alors une instance de la classe
CDataManagerExtdImpl, qui hérite de CDataManagerExt et implémente toutes les
méthodes virtuelles (celles de CDataManager et celles de CDataManagerExt).
De cette manière, ton programme à fonctionnera avec les anciennes et les
nouvelles DLLs simultanément.

Arnaud
MVP - VC
Avatar
dark poulpo
je viens de penser a un truc, se sera compatible delphi par ex?
1 2