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 :

Erreur de link dll


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 13
    Par défaut Erreur de link dll
    Bonjour,

    n'ayant pas trouvé de réponse à ma question (j'espère ne pas être passé à côté), je me permet d'ouvrir un nouveau topic.

    Mon problème est le suivant:

    J'utilise une dll open source que j'ai légèrement modifiée et compilée. Jusqu'ici, aucun problème.

    Je l'importe de façon explicite dans mon programme via LoadLibrary et GetProcAdress.

    J'ai bien inclus le .h de la dll dans mon source.

    Lors de l'édition de lien, une erreur (entre autres) survient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unresolved external symbol "__declspec(dllimport) public: unsigned long __thiscall IntelLaptopGamingTDKInterface::GetSecBatteryLifeTimeRemaining(void)" (__imp_?GetSecBatteryLifeTimeRemaining@IntelLaptopGamingTDKInterface@@QAEKXZ) referenced in function "public: void __thiscall cBattery::Refresh(long)" (?Refresh@cBattery@@QAEXJ@Z)	Exec.lib
    Il me semble que lorsque l'on utilise la méthode explicite d'importation (LoadLibrary + ....) il n'est pas nécessaire d'utiliser le .lib fournit avec la dll.

    En vous remerciant d'avance pour votre réponse

    p.s: je dois absolument utiliser le méthode explicite cas je charge différentes dll en fonction du contexte (XP, VISTA).

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Le problème, c'est qu'apparemment ta méthode cBattery::Refresh() fait un appel implicite à cette 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.

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 13
    Par défaut
    merci pour ta réponse rapide.

    Cependant étant débutant pourrais tu m'en dire un peu plus et me donner une piste pour résoudre ce problème?

    merci

    p.s: En fait j'ai bien essayé avec GetProcAddress mais la dll s'utiliserait ainsi:

    appel de GetTDKInterface() fonction statique qui renvoie un singleton de la classe définie dans la dll.

    puis appel de la méthode GetPercentBatteryLife() par exemple pour récupérer la valeur désirée.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Pas trop, je ne connais pas assez tes contraintes ni comment marche cBattery, ni ton chargement initial... (notamment, tu fais GetProcAddress() sur quoi exactement?)
    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
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Si on charge une dll dynamiquement, on ne devrait pas avoir une erreur de link sur une fonction de la dll tout au plus une erreur à l'execution ?

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 13
    Par défaut
    Sorry je vais essayer de te donner quelques éléments.

    voici un bout de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if(GetOSVersion() < OS_WIN32_WINDOWS_VISTA)
    		mDllHAndler=LoadLibrary("IntelLaptopGamingXp.dll");
    	else
    		mDllHAndler=LoadLibrary("IntelLaptopGaming.dll");
    	if(mDllHAndler)
    	{
    		DllImported_GetTDKInterface = (Type_GetTDKInterface)GetProcAddress(mDllHAndler,"?GetTDKInterface@IntelLaptopGamingTDKInterface@@SIPAV1@XZ");
     
    		if(DllImported_GetTDKInterface)
    			mHardInfo = DllImported_GetTDKInterface();
    	}
    Ici, je charge la dll avec LoadLibrary(). Ensuite je récupère la méthode GetTDKInterface de la dll avec GetProcAddress() et l'appelle afin de récupérer une instance de la classe de ma dll (nommons la 'monInstance').

    cBattery est une classe qui rafraichit les infos sur la batterie d'un pc portable. Pour cela, ca méthode Refresh() est appelée régulièrement. C'est par exemple dans celle ci que je vais appeler les méthodes de la dll à partir de monInstance.

    La classe de la dll met a dispo plusieurs méthodes de gestion de la batterie, wifi, ....

    Voilà, si besoin de plus d'infos, je suis à disposition

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Il faut que toutes les méthodes publiques de la classe en question soient virtuelles, sans exception (enfin, certaines peuvent être inline, mais je le déconseille).

    C'est ainsi que fait COM.
    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.

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

Discussions similaires

  1. Erreur de LINK DLL
    Par ZeNoob dans le forum Visual C++
    Réponses: 4
    Dernier message: 22/05/2013, 12h08
  2. [DLL]Erreur de link quand passage par reference
    Par Yeti_in dans le forum C++
    Réponses: 2
    Dernier message: 19/11/2008, 02h47
  3. Réponses: 1
    Dernier message: 02/11/2006, 20h09
  4. Erreur de link entre dlls
    Par Spartan03 dans le forum C++
    Réponses: 1
    Dernier message: 16/08/2006, 19h48
  5. Erreur de link a la creation d'une dll
    Par drcd dans le forum MFC
    Réponses: 12
    Dernier message: 29/05/2006, 15h13

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