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 :

chargement conditionnel de dlls à l'execution d'un programme


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut chargement conditionnel de dlls à l'execution d'un programme
    Bonjour,
    je développe une appli c++ sur visual 2005 et sous Win XP. Je fais appel à certaines Dlls dont je ne suis pas le propriétaire. Sous XP, cela marche parfaitement, mais le programme ne tourne pas sous Vista à cause de ces dits Dlls : J'ai fait des tests en supprimant les dlls en question du projet visual ainsi que les appels aux classes apportées par celles-ci et cela fonctionne sous Vista.

    Donc je me demande s'il serait possible, à l'exécution de mon programme, de détecter la version de l'OS (windows) utilisateur et, en fonction, charger ou pas les Dlls et parallèlement faire ou pas les appels aux classes correspondantes.
    Est ce que quelqu'un à déja fait un truc comme ca ? Merci pour vos réponses !

  2. #2
    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
    Tu as deux moyens pour cela:
    • DLL à chargement retardé: chargement dès le premier appel de fonction de la DLL, lance une exception Win32 en cas d'échec. Un avantage est que tu peux garder l'importation statique.
    • Importation 100% dynamique, avec LoadLibrary() et GetProcAddress(). Compliqué, mais tu décides mieux quoi faire en cas d'échec.

    (je ne parle pas ici des DLLs COM, vu que ta DLL n'en est apparemment pas une).
    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.

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut
    Je pense que l'utilisation de LoadLibrary sera difficile dans mon cas étant donné que les Dlls incriminées décrivent plusieurs classes que j'utilise après dans mon appli. Ce ne sont pas seulement des fonctions à appeler.

    J'ai essayé ta première solution de chargement différé, hors à l'édition des liens j'ai l'erreur suivante :
    LINK : fatal error LNK1194: impossible de retarder le chargement de 'edmicpp400_2005.dll' à cause de l'importation du symbole de données '"__declspec(dllimport) long const cppw::.DEFAULT_SET" (__imp_?DEFAULT_SET@cppw@@3JB)'*; liez sans /DELAYLOAD:edmicpp400_2005.dll

    Effectivement, dans mon stdafx.h, j'avais ajouté un paragraphe (je ne connais pas son l'utilité, mais la documentation des Dlls invitaient à son l'emploi)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifdef WIN32
    	#ifdef _USRDLL
    		#ifdef SPEDLL_EXPORTS
    			#define SPE_EXPORTIMPORT __declspec( dllexport )
    		#else
    			#define SPE_EXPORTIMPORT __declspec( dllimport )
    		#endif
    	#else
    		#define SPE_EXPORTIMPORT
    	#endif
    #else
    	#define SPE_EXPORTIMPORT
    #endif
    Est ce que cela te dis quelque chose stp ? Merci

  4. #4
    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
    Si j'ai bien compris, le chargement retardé ne marche pas quand l'un des éléments importés est une variable globale au lieu d'une fonction...
    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.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Primo, une variable globale est créée avant même le début de la méthode main, donc retarder le chargement d'une dll pour avoir à la charger avant le main, c'est un peu débile, heu pardon inutile.

    Secundo, mon avis n'est pas partagé ici, mais exporter des classes et non des fonctions depuis une dll, c'est s'exposer à de grandes déconvenues.

    Donc les globals, c'est mal, ne pouvez-vous pas en faire un pointeur initialisé dans le main, après vérification de l'OS ?

  6. #6
    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
    Citation Envoyé par bacelar Voir le message
    Secundo, mon avis n'est pas partagé ici, mais exporter des classes et non des fonctions depuis une dll, c'est s'exposer à de grandes déconvenues.
    Je partage cet avis. Malheureusement, jcloupgarou a dit ne pas être propriétaire des DLLs en question, ce qui est un peu gênant pour changer cela...

    Bien sûr, il reste encore la possibilité de mettre une DLL perso "entre" le code normal et les DLLs pouvant être absentes, pour "corriger" l'interface. Et rien n'empêcherait cette DLL de n'exporter que des fonctions ou d'être à chargement retardé...
    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.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    LINK : fatal error LNK1194: impossible de retarder le chargement de 'edmicpp400_2005.dll' à cause de l'importation du symbole de données '"__declspec(dllimport) long const cppw::.DEFAULT_SET" (__imp_?DEFAULT_SET@cppw@@3JB)'*; liez sans /DELAYLOAD:edmicpp400_2005.dll
    C'est un nom C++.
    C'est dans une dll.
    Cette dll est totalement foireuse car elle utilise des appels à des fonctions dans des dll systèmes qui n’existent pas dans tous les OS Windows (en plus d'exporter des classes).
    Maintenant, pour régler temporairement le problème de jcloupgarou, il ne faut pas faire de delayloading sur edmicpp400_2005.dll mais sur la ou les dlls système qui posent problèmes.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Les problèmes de portabilité d'une DLL ayant fait suite à cette discussion sont abordés dans cette nouvelle discussion.

  9. #9
    screetch
    Invité(e)
    Par défaut
    ma réponse a été virée dans l'autre discussion, mais je pense pas que ca vienne de l'OS, je pense qu'il manque une DLL sur ton systeme plutot

    tu peux essayer d'ouvrir la DLL qui ne veut pas se charger avec Depends.exe (google pour le telecharger), ca va te montrer si il manque des dépendances

    il est fort probable que le runtime de visual studio 2005 n'aie pas été installé sur la machine cible, et que ce soit juste ca qui manque

  10. #10
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut
    J'ai utilisé dependency Walker sur les 4 dlls qui me pose problème sous Vista et il en ressort qu'il voit pour deux d'entre elles :

    les Dlls ieframe.dll et shlwapi.dll apparaissent en "Delay-load module warning" avec ce message :

    Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.

    A noté que j'ai aussi lancé depends sur XP en ouvrant ces dlls et il y a aussi un problème avec une dll à chargement différé, MPR.dll

    C'est tout ce qui apparait comme louche avec ce depends... J'ai remarqué sur google qu'il y avait pas mal de sujet traitant de ces 2 Dlls, mais rien de similaire...
    Je ne sais vraiment pas quoi faire !

    PS : J'ai fait des tests sous Vista en ecartant ces Dlls "foireuses" et en commentant les classes y faisant appel : dans ce cas l'appli fonctionne sans souci, donc pas de probleme de runtime de vs2005 je pense...

    Merci en tout cas de vous penchez sur cet épineux problème.

  11. #11
    screetch
    Invité(e)
    Par défaut
    tu as essayé sur un autre vista pour voir si ca venait de la compatibilité du systeme ou d'autre chose ? (visual studio pas installé par exemple)

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Le problème n'est donc pas des dll manquantes mais fonctions exportées dans les anciennes versions et qui ne le sont plus ?

    Pouvez-vous nous donner le nom de ces fonctions ?
    N'existerait-il pas un build des bibliothèques avec des solutions de contournement, une version Vista, ou des options de compilations si vous recompilez les dll qui appellent les fonctions manquantes ?

  13. #13
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut
    Je ne suis malheureusement pas propriétaire de ces Dlls et ne peux donc pas les recompiler, et biensûr il n'y a pas de version Vista...
    Vous voulez connaître les noms de quelles fonctions ? Je ne comprends pas !
    Merci

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Les fonctions manquantes dans les dlls ieframe.dll et shlwapi.dll sous Vista.

  15. #15
    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
    @bacelar: Ça m'étonnerait que ça avance à grand-chose, car il y a toujours ces warnings dans dependency walker dès qu'il y a un lien vers shell32.dll...
    Ou user32.dll, qui lie indirectement vers shell32, les dépendances croisées de DLLs étant possibles avec Visual...
    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.

  16. #16
    screetch
    Invité(e)
    Par défaut
    ce n'est pas forcément une fonction manquante, ca pourrait etre autre chose. Ce que tu peux faire c'est ajouter un LoadLibrary dans ton code pour essayer de la charger sous vista, puis récupérer le message d'erreur avec GetLastError et FormatMessage

  17. #17
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Le nom des fonctions manquantes permettra de faire des recherches sur Google et de trouver d'éventuelles solutions de contournement.

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/08/2009, 19h54
  2. [MFC VC.NET] Chargement dynamique de DLL
    Par vanitom dans le forum MFC
    Réponses: 3
    Dernier message: 26/01/2005, 13h56
  3. Chargement d'une DLL et utilisation du multithread
    Par Maitre Kanter dans le forum Langage
    Réponses: 6
    Dernier message: 07/09/2004, 23h18
  4. Réponses: 4
    Dernier message: 08/06/2004, 09h01
  5. Chargement dynamique de DLL sous Unix
    Par Willou dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 18/12/2002, 18h25

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