OVH Cloud OVH Cloud

Partage d'une classe entre 2 DLLs

4 réponses
Avatar
olivyeahhh
Salut,

J'ai un problème de partage de classe entre 2 DLL, je développe en C++ sous
Visual Studio .NET

Mon programme charge une DLL qu'on nommera A, qui charge à son tour une DLL
B avec LoadLibrary.
Dans le point d'entrée de la DLL A, je créé une instance d'une classe.
Je souhaite pouvoir utiliser cette instance dans la DLL B.
Comment faire ?

Si je suis trop vague, je peux donner plus de précisions...

Un grand merci d'avance à qui pourra me répondre...

4 réponses

Avatar
Arnaud Debaene
olivyeahhh wrote:
Salut,

J'ai un problème de partage de classe entre 2 DLL, je développe en
C++ sous Visual Studio .NET

Mon programme charge une DLL qu'on nommera A, qui charge à son tour
une DLL B avec LoadLibrary.
Dans le point d'entrée de la DLL A, je créé une instance d'une classe.
Je souhaite pouvoir utiliser cette instance dans la DLL B.
Comment faire ?



Appeler depuis A une fonction de B en lui passant un pointeur ou une
référence vers l'objet en question en paramètre.

Arnaud
Avatar
olivyeahhh
Merci, j'y ai déjà pensé, mais ça ne m'arrange pas vraiment.

J'ai 3 choses à ajouter :

- La classe que je veux partager, nommée CLog, hérite d'une classe Singleton
(afin de pouvoir y acccéder de n'importe où).
Elle s'occupe de la gestion de messages internes et les enregistre dans un
fichier, et à l'occasion je souhaiterai aussi les afficher.

- La DLL A contient le coeur du programme. Elle charge la DLL B afin
d'accéder à certaines classes supplémentaires.

- Ainsi la classe CLog est utilisée dans les deux DLL. Elle possède un
std::vector comme membre, qui stocke les messages.

Mais comment faire pour qu'une seule instance de la classe CLog soit
utilisée dans les 2 DLL ?

Voilà le problème décrit un peu plus en détails.
Avatar
Arnaud Debaene
olivyeahhh wrote:
Merci, j'y ai déjà pensé, mais ça ne m'arrange pas vraiment.



Et pourquoi? Ma solution convient parfaitement par rapport à toutes les
contraintes que tu as décrit, *si* tu fais atention que tes 2 DLLs soient
linkées avec la même version DLL de la CRT afin que l'allocateur mémoire
soit le même pour les 2 librairies (en supposant que B accède directement au
vector de CLog). Compiles avec /MD ou /MDd tes 2 librairies.

J'ai 3 choses à ajouter :

- La classe que je veux partager, nommée CLog, hérite d'une classe
Singleton (afin de pouvoir y acccéder de n'importe où).
Elle s'occupe de la gestion de messages internes et les enregistre
dans un fichier, et à l'occasion je souhaiterai aussi les afficher.


Alors c'est encore plus simple : Si ta classe est un singleton, tu dois
avoir une fonction "GetInstance" ou équivalent dans un coin de A. Exportes
cette fonction de A qu'elle puisse être appelée directement par B.

Mais comment faire pour qu'une seule instance de la classe CLog soit
utilisée dans les 2 DLL ?


Je ne vois vraiement pas où est le problème...

Arnaud
Avatar
olivyeahhh
> Alors c'est encore plus simple : Si ta classe est un singleton, tu dois
avoir une fonction "GetInstance" ou équivalent dans un coin de A. Exportes
cette fonction de A qu'elle puisse être appelée directement par B.



Génial, après une heure à jongler et farfouiller dans mes fichiers, ça
fonctionne !
J'ai exporté de A ma classe CLog, qui elle-même est importée dans B, même
pas eu besoin de toucher à ma classe singleton (dont CLog est dérivée)
Merci beaucoup