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

Bibliothèques C++ Discussion :

Chargement dynamique des lib


Sujet :

Bibliothèques C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Chargement dynamique des lib
    Bonjour.

    J'ai un projet dans lequel j'ai utilisé windows.h sous seven pour l'utilisation de la structure WM_TOUCH et des méthodes spécifiquement Win7 comme GetTouchInputInfo.
    Le problème est que j'aimerais pouvoir compiler sous XP.
    On a pu me parler du chargement dynamique et le problème est que je ne sais absolument pas comment cela pourrait fonctionner.
    J'ai juste pu voir que je devais redéclarer les fonctions comme par exemple :
    GetTouchInputInfo libWindows::my_GetTouchInputInfo = NULL;
    J'ai aussi des structures de données Win7 (WM_TOUCH) et des macros.

    Merci
    Benjamin

  2. #2
    Membre actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    Par défaut
    Je ne connais pas vraiment la prog windows, mais si tu veux que ca compile sous wndows XP, il faut que tu trouves un moyen de détecter en préprocesseur la version de windows, et faire un #define pour le signaler.
    Ensuite entoures le code typique windows 7 comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifdef WINDOWS_7
    ///Code typique de windows 7
    #endif
    Ca c'est la version "C", qui marche bien pour des petits programmes. Dans la version C++, il vaut que tu isoles le code Windows 7 dans des classes avec une interface virtuelle, et que tu en fasses plusieurs implémentations, une pour windows 7 et une pour windows XP, et tu choisis à la compilation laquelle tu utilises.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci,
    C'est en effet ce que je fait :
    "isoler le code Windows 7 dans des classes avec une interface virtuelle". Il faut donc que je refasse ma propre implémentation des fonctions utilisées sur seven?

    Merci pour l'aide

  4. #4
    Membre actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    Par défaut
    Plusieurs options.
    Si ton code peut tourner sans les fonctionnalités windows 7, soit tu fais sans, soit tu les rend optionnelles, c'est a dire que tu t'arrange pour que ca se greffe sur le reste, si c'est pas la on fait sans.

    Si ton code ne peut pas tourner sans les fonctionnalités windows 7, alors pèse bien ta décision de permettre une compilation windows XP. Si tu choisis de poursuivre alors il te faudra ré implémenter les fonctionnalités Windows 7 avec du code XP... Et alors pourquoi utiliser les fonctionalités windows 7 ? Garde ton implémentation pour XP sous windows 7, ca t'évitera de devoir tester sous les deux OS.

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Il est possible de travailler de 2 manières différentes.

    Soit tu fais 2 binaires différents avec du "#ifdef SEVEN"/ #endif", un binaire pour XP et un binaire pour Seven. La différence se fait à la compilation, c'est dans la grandes lignes ce que décrit Rewpparo.

    Tu peux aussi faire un seul binaire dont le comportement est différent suivant la présence ou non d'une fonction ou d'une API. Pour cela, il faut connaitre la fonction et surtout la DLL dans laquelle est est implémentée. Heureusement, le MSDN donne toutes ses informations.

    On va partir sur un exemple avec la fonction EnterSynchronizationBarrier() qui n'est disponible qu'en Windows 8. Le MSDN donne la signature de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    BOOL  WINAPI EnterSynchronizationBarrier(
      _Inout_  LPSYNCHRONIZATION_BARRIER lpBarrier,
      _In_     DWORD dwFlags
    );
    ainsi que la DLL dans laquelle elle est implémentée ==> Kernel32.dll.

    La première chose à faire consiste à déclarer un type pointeur de fonction et une variable pour cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // cette écriture peut sembler un peut barbare au 1er abord mais c'est comme cela
    typedef BOOL WINAPI ( * EnterSynchronizationBarrier_fct)(_Inout_ LPSYNCHRONIZATION_BARRIER lpBarrier, _In_ DWORD dwFlags);
     
    // ma_fonction est un pointeur de fonction sur la fonction EnterSynchronizationBarrier de la DLL kernel.dll
    EnterSynchronizationBarrier_fct ma_fonction = NULL;
    La seconde chose consiste à charger la dll
    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
    HMODULE mon_module LoadLibrary(_T"kernel32.dll");
    if(mon_module != NULL)
    {
       // la DLL existe
       // chargement de la fonction
       ma_fonction = GetProcAddress(mon_module, "EnterSynchronizationBarrier");
       if(ma_fonction == NULL)
       {
          // la fonction existe, on peut l'utiliser
       }
       else
       {
           // la fonction n'existe pas dans la DLL, il faudra faire sans cette fonction spécifique
       }
    }
    else
    {
       // la DLL n'existe pas, il faudra faire sans cette fonction spécifique
    }
    et enfin, tu peux utiliser ta fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if(ma_fonction != NULL)
    {
       // initialisation des parametres Barrier et flags
       ...
       BOOL ret = ma_fonction(&Barrier, flags);
    }
    else
    {
       // la fonction n'existe pas, on n'a donc pas le droit de l'appeler, il faut faire sans
    }

    à la fin de ton programme ou bien quand tu es sûr que tu n'as plus besoin d'appeler cette fonction, il faut décharger la DLL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(mon_module != NULL)
    {
       ma_fonction = NULL
       FreeLibrary(module);
    }
    Ce code va se compiler sans problème et tu auras un seul binaire pour toutes les versions Windows. Le binaire va sans charger sans difficulté et sans problème de "missing DLL". Par contre, le comportement sera différents suivant la présence ou non des fonctions.

    PS : tu as tout intérêt à encapsuler ce code dans une classe spécifique
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Oui merci, c'est ce que j'ai fait, à peu près, dans une classe.

    Merci pour votre aide

Discussions similaires

  1. Chargement dynamique des annonces google Adsense ?
    Par 3psilOn dans le forum Publicité
    Réponses: 5
    Dernier message: 23/07/2009, 12h30
  2. [Lazarus] Chargement dynamique des packages ?
    Par ludo00002 dans le forum Lazarus
    Réponses: 2
    Dernier message: 03/03/2008, 08h24
  3. Chargement dynamique des contrôles utilisateurs
    Par outat dans le forum ASP.NET
    Réponses: 3
    Dernier message: 03/04/2007, 12h11
  4. problème de chargement dynamique des modules rtlinux
    Par wahbios dans le forum Administration système
    Réponses: 1
    Dernier message: 12/03/2007, 10h20
  5. [VB.NET] Chargement dynamique des dlls de l'application
    Par leSeb dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/01/2006, 17h49

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