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...
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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.
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
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.
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 ?
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.
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
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 ?
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
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
> 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
> 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