-
dll et référence
j'ai un programme et une dll, le tout programmé en c++.
j'exporte une fonction de ma dll qui prends en paramètre des références sur des conteneurs de la STL (plus particulièrement des vecteurs).
Je dois dire que je comprends rien à la convention de nommage et au décoration de nom, mais bon la dll est chargée, la fonction est trouvée (j'utilise l'attribut extern "C", mais bon faudra m'expliquer c'est du C++ que je fais car si je ne déclare pas comme ça, ça marche pas).
Quand je parcours les éléments de mes vecteurs à la sortie de la dll, tout est correct.
Par contre si je décharge la dll, tous les éléments de mes vecteurs ont disparu. Ce sont pourtant des références, dans le doute je teste avec des pointeurs mais c'est la même chose. Je regarde les adresses des variables et tout et tout ce sont les bonnes. J'effectue bien mes push_back à partir des références, bref j'y pipe que dalle.
Peut-être tout simplement que les objets construits dans la dll le sont dans l'espace de la dll et que forcément à sa libération tout est perdu. Quel est donc le comportement général des dll, vis-à-vis de l'allocation de mémoire? Allocation dans leur espace d'adressage, y-a-t-il moyen d'empêcher ce comportement?
Merci à tous.
PS: pour l'instant j'envisage d'exporter des fonctions qui retourneront des valeurs que j'ajouterais dans mes vecteurs.
-
Effectivement, dans certain cas, l'allocation dynamique peut être gérée localement par les dll.
Avec quoi développes-tu ?
Es_tu obligé de charger/décharger dynamiquement tes dll?
-
Je suis passé au plan B: je récupère les valeurs dans l'application principale et je remplis mes vecteurs. Le truc dommage c'est que je fait une sorte de double remplissage de vecteur. Avec les références c'était pratique, les vecteurs n'étaient remplis qu'une fois.
Je fait du chargement et du déchargement dynamique de dll.
Pourquoi? Bah mon programme tourne 24h/24h et cette dll n'est utilisée qu'une fois par jour et son utilisation prends au maximum 5 secondes.
C'est donc pour une question de maintenance: je pourrai changer la dll sans stopper le programme. Encore que la validité de ce truc reste à vérifier car je sais que les dll sont mappées en mémoire. Mais bon j'en suis pas encore là.
Ben c'est dommage aussi que ce soit la dll qui gère l'allocation dynamique des références externes. Mais bon ça paraît compréhensible vu que ce doit être plus facile à mettre en oeuvre comme comportement.
PS: suis sous visual c++.net, sans mfc que du win32 api.
-
Petite réctification :
Un objet créé dynamiquement (dans le tas) survivra au déchargement de la dll.
Il n'y a que les objets créés sur la pile qui seront détruits.
Par contre, il est fortement conseiller qu'un objet crée par le biais d'une dll
soit également détruit par la même dll, sinon risque de plantage (à confirmer!).
Donc il y a deux possibilités :
- Faire des copies
- Utiliser un vecteur de pointeur et faire attention à la libération
Avec Visual, je ne sais pas, mais avec C++ Builder, il y a une option qui évite de se soucier de ce problème.
-
Merci pour ces précisions.
Vu mes connaissances en matière de dll, je vais me rabattre sur la solution de faire des copies. Cette solution fonctionne parfaitement, ça oblige juste à exporter plus de fonctions et à utiliser une variable globale dans la dll.
J'aurais aussi la solution d'utiliser l'export de classe, mais bon pas trop le temps d'expérimenter.