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

Windows Discussion :

Contexte de chargement d'une DLL


Sujet :

Windows

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 6
    Points : 6
    Points
    6
    Par défaut [Résolu] Contexte de chargement d'une DLL
    Bonjour à tous,

    je ne sais pas trop où poser cette question vu qu'il ne s'agit pas exactement de programmation mais pas vraiment de système non plus. J'espère que je l'ai placé au bon endroit.

    Je n'ai pas réussit à trouver l'information suivante :
    Lorsqu'un programme (par exemple multi-thread) fait appel à une DLL. Elle est d'abord chargé en mémoire puis exécuté. mais comment celà se passe-t-il?
    la DLL est-elle chargé et éxécuté au sein du thread appellant? dans un nouveau thread du processus appellant? dans un nouveau processus?

    J'étudie un programme qui inclut plusieurs services d'alertes complètement différents programmé en multi-thread. Une partie du programme ("composant de base") inclut des fonctions communes à tous les services (diffusions des alertes, décodages des trames réseau, ect...). 1 service utilise une DLL externe pour son traitement (en fait ce service n'est qu'une passerelle accès vers la DLL).
    Je voudrais aussi savoir s'il était possible de relancer uniquement la dll en cas de plantage ou s'il fallait (comme pour les autres services) relancer tout le programme à cause d'un seul service planté?

    La réponse à cette question me permettera soit de préconiser soit un developpement en multi-processus (il faut impérativement pouvoir ne relancer que le service de planté et pas tout le programme - d'ailleur il faut aussi que le programme continue de tourné s'il y a un service de planté) ou soit d'externaliser les services dans des DLL. (qui est la voie prise aujourd'hui mais dont j'ai bien l'impression qu'elle ne résoudra rien)

    Merci par avance

  2. #2
    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 : 49
    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
    Points : 2 605
    Points
    2 605
    Par défaut
    Lorsqu'un programme (par exemple multi-thread) fait appel à une DLL. Elle est d'abord chargé en mémoire puis exécuté. mais comment celà se passe-t-il?
    la DLL est-elle chargé et éxécuté au sein du thread appellant? dans un nouveau thread du processus appellant? dans un nouveau processus?
    Une DLL c'est une librairie partagée. Le but c'est justement que des morceaux de codes identiques ne se trimbalent pas à tout va dans la mémoire. La DLL est donc chargée en mémoire lors de son appel (sauf si elle n'y est pas déjà). Après c'est le SE qui s'occuppe du reste, et c'est aussi la raison pour laquelle une DLL que l'on compile doit respecter les conventions de l'API sous-jacent . Ton programme obtient alors une "instance" vers cette dll.

    Je voudrais aussi savoir s'il était possible de relancer uniquement la dll en cas de plantage ou s'il fallait (comme pour les autres services) relancer tout le programme à cause d'un seul service planté?
    C'est un peu compliqué. Je ne suis pas sur que l'on puisse décharger explicitement une DLL de la mémoire, en tout cas les autres programmes qui l'utilisent vont faire la gueule...
    Le seul conseil que je puisse te donner, n'utilises pas une DLL buggé.


    La réponse à cette question me permettera soit de préconiser soit un developpement en multi-processus (il faut impérativement pouvoir ne relancer que le service de planté et pas tout le programme - d'ailleur il faut aussi que le programme continue de tourné s'il y a un service de planté) ou soit d'externaliser les services dans des DLL. (qui est la voie prise aujourd'hui mais dont j'ai bien l'impression qu'elle ne résoudra rien)
    Une DLL ne doit contenir que du code qui fonctionne sans bug. Lorsque tu fais du multithreading, tes threads s'exécutent au sein du même processus, donc si un thread plante, tout plante.

    Je ne connais pas l'architecture de ton programme, mais pour palier à ce problème (au cas ou tu es obligé d'utiliser une DLL buggée), il ne faudrait pas utiliser le multithread. Il faudrait que tes threads soit remplacés par des processus. Certes la communication interprocessus est plus compliquée que la communication inter-thread, mais au moins un processus qui plante à cause de la DLL ne fera pas planter les autres processus.

    Mais l'idée qui me vient, c'est que si ta DLL est buggé alors même les autres processus planteront lorsqu'ils utiliseront la portion de code buggé.
    Mais en effet, ils ne planteront peut-être pas tous en même temps... Drôle de conception je dois avouer.

    Sinon pour info, en C++, tu as les exceptions qui te permettent une gestion des erreurs. Ce serait une solution pour le multithread, mais ton programme pourrait quand même se retrouver dans une situation instable (selon la gravité de l'exception) qui obligerait de relancer tout le programme.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Bonjour et merci beaucoup de votre réponse.

    Je suis effectivement obligé d'utilier cette DLL mais elle n'est utilisé que par un seul service, donc si je fait un processus par service, il n'y en aura qu'un qui plantera. Ca sera mieux, merci.

    bonne continuation

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

Discussions similaires

  1. [Win32]Problème au chargement d'une DLL C++
    Par FamiDoo dans le forum MFC
    Réponses: 22
    Dernier message: 05/07/2006, 11h10
  2. [VB] Problème de chargement d'une DLL
    Par Elijha dans le forum Windows Forms
    Réponses: 3
    Dernier message: 10/05/2006, 09h24
  3. Chargement d'une DLL
    Par olive_le_malin dans le forum MFC
    Réponses: 15
    Dernier message: 16/12/2005, 17h09
  4. Réponses: 4
    Dernier message: 03/11/2005, 13h57
  5. Chargement d'une DLL et utilisation du multithread
    Par Maitre Kanter dans le forum Langage
    Réponses: 6
    Dernier message: 07/09/2004, 23h18

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