IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

dll et référence


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut 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.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 62
    Par défaut
    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?

  3. #3
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    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.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 62
    Par défaut
    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.

  5. #5
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ajouter winusb.dll comme référence en C# ?
    Par byo.ist.good dans le forum C#
    Réponses: 5
    Dernier message: 11/08/2009, 12h00
  2. Pb de référence à MSVCR80D.DLL
    Par Unusual dans le forum Visual C++
    Réponses: 6
    Dernier message: 08/11/2006, 03h04
  3. [WinForms]dll à ajouter dans les références
    Par gégécap dans le forum Général Dotnet
    Réponses: 5
    Dernier message: 15/08/2006, 19h14
  4. Référence à une DLL ?
    Par FamiDoo dans le forum MFC
    Réponses: 11
    Dernier message: 23/06/2006, 22h55
  5. [VB.NET] Bug de dll : référence non trouvée
    Par boulete dans le forum Windows Forms
    Réponses: 4
    Dernier message: 22/04/2006, 10h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo