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 :

La bonne méthode pour créer une DLL ?


Sujet :

Windows

  1. #1
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut La bonne méthode pour créer une DLL ?
    Bonjour,

    Je voudrais créer une DLL et j'ai donc trouvé pas mal d'exemple un peu
    partout. Mais il y a quelque chose qui me laisse un peu perplexe.
    Dans presque tous les exemples on trouve un fichier main.c
    contenant le point d'entrée de la DLL du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
    {
        switch (fdwReason)
        {
          case DLL_PROCESS_ATTACH:
            break;
    
          case DLL_PROCESS_DETACH:
            break;
    
          case DLL_THREAD_ATTACH:
            break;
    
          case DLL_THREAD_DETACH:
            break;
        }
    
        return TRUE;
    }
    Puis ensuite la dll est chargé dans le programme client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HMODULE hDLL = LoadLibrary("TestDLL.dll");
    Le truc c'est que moi j'utilise GCC (MinGW), donc j'ai récupéré l'exemple
    du site:
    http://www.mingw.org/docs.shtml#compilingandbuilding
    Sauf que là c'est trés différent. Il n'y a aucun point d'entrée et
    une librairie statique est générée en plus de la DLL lors de la
    compilation. Pour utiliser la DLL il suffit de linker la librairie
    statique lors de la compilation du programme client.

    N'étant pas un spécialiste des DLL je voudrais savoir:

    1) Quelle est la meilleur des 2 méthodes ?

    2) Est ce qu'on ne perd pas les avantages d'une DLL en linkant celle-ci à la façon d'une librairie statique ?


    Voilà, merci de m'éclairer.

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Tout d'abord pour une DLL, le point d'entrée (DllMain) est optionnel (mais il est souvent utile ...). En fait, c'est pas seulement un point d'entre mais aussi un "point de sortie" : elle est appelée chaque fois qu'un processus ou un thread demande le chargement ou la libération de la DLL (mais n'oublie pas qu'une DLL est physiquement chargée une seule fois en mémoire). Le point d'entrée doit retourner TRUE pour indiquer que tout s'est bien passé et FALSE pour indiquer un échec. Si le point d'entrée est absent, la DLL retournera toujours TRUE dans tous les cas.

    Lorsque tu compiles une DLL et que celle-ci exporte des symboles, deux fichiers (entre autres) seront générés en sortie : la DLL (test.dll) et un fichier d'importation (test.lib [Visual C++] ou libtest.a [MinGW]).

    Pour utiliser la DLL :

    - Soit tu utilises LoadLibrary / GetProcAddress / FreeLibrary
    - Soit tu te lies avec le fichier d'importation et tu utilises directement les fonctions (mais tu dois quand même les déclarer bien sûr ...).

    Si la DLL sert de bibliothèque de fonctions, la deuxième méthode est celle qui est recommandée. Dans les autres cas c'est généralemnt la première.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Sachant qu'une bibliothèque exposant "directement" des classes C++ ne peut être utilisée que de la seconde façon, et uniquement avec le même compilateur.

    Une utilité du point d'entrée de la DLL est l'initialisation de certaines variables globales de la DLL, notamment:
    • Initialiser les variables liées au Thread-Local Storage si la DLL l'utilise
    • Mémoriser le HINSTANCE de la DLL si celle-ci doit charger des ressources par la suite.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/08/2013, 13h14
  2. Réponses: 6
    Dernier message: 18/08/2009, 16h49
  3. Méthode pour créer une pause d'exécution en javascript
    Par ephemere dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 07/07/2009, 21h08
  4. Méthode pour créer une zone privée
    Par WagaSeb dans le forum Langage
    Réponses: 3
    Dernier message: 05/06/2007, 22h23

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