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

Visual C++ Discussion :

charger une dll avec un .lib


Sujet :

Visual C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Points : 119
    Points
    119
    Par défaut charger une dll avec un .lib
    Salut,

    C'est la première fois que j'essais de charger une dll.
    J'aimerai pouvoir utiliser les fonctions contenues dans la dll dont j'ai le fichier .lib associé. D'après mes lectures j'ai compris qu'il y a une façon dynamic pour charger une dll si on ne possède pas le .lib. Par contre, avec le .lib, il suffit de linker ce dernier dans visual studio et utiliser les fonctions.
    Je connais les noms des fonctions qui sont dans la dll mais je ne vois pas trop comment appeler ces fonctions dans ce cas ?


    Merci !

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 694
    Points : 188 894
    Points
    188 894
    Par défaut
    Salut,

    Citation Envoyé par Nehmé Voir le message
    C'est la première fois que j'essais de charger une dll.
    J'aimerai pouvoir utiliser les fonctions contenues dans la dll dont j'ai le fichier .lib associé. D'après mes lectures j'ai compris qu'il y a une façon dynamic pour charger une dll si on ne possède pas le .lib. Par contre, avec le .lib, il suffit de linker ce dernier dans visual studio et utiliser les fonctions.
    Je connais les noms des fonctions qui sont dans la dll mais je ne vois pas trop comment appeler ces fonctions dans ce cas ?
    Tu les appelles comme les autres fonctions de ton programme : tu inclus le ou les fichier(s) d'en-tête, puis tu peux utiliser les fonctions, les types, les classes... qui y sont définis. Une seule condition : que tu lies avec le .lib.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Points : 119
    Points
    119
    Par défaut
    Salut,

    Merci pour ta réponse.
    Comment savoir le nom des fichiers d'entête qui sont dans la dll ?

  4. #4
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Normalement quand on fourni une DLL pour VC++ on fourni 3 choses:
    -La DLL
    -Le fichier .lib associé
    -Le fichier .H correspondant

    Si tu n'a pas le .h ça va etre plus ennuyeux...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par superjaja Voir le message
    Une seule condition : que tu lies avec le .lib.
    Comment je lie le .lib ?

    Ce que je fais est aller dans les propriétés du projet:
    Linker/General/Additional Library Directories et j'ajoute le path du dossier qui contient mon .lib et ma dll

    J'ai effectivement le .h mais je n'arrive pas à l'inclure.

    Merci

  6. #6
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Citation Envoyé par Nehmé Voir le message
    Comment je lie le .lib ?

    Ce que je fais est aller dans les propriétés du projet:
    Linker/General/Additional Library Directories et j'ajoute le path du dossier qui contient mon .lib et ma dll
    Il faut ensuite spécifier la bibliothèque:

    Menu: Project > xxx Properties
    puis

    Configuration Properties > linker > input > Additional Dependencies
    Il suffit d'entrer le nom de la lib (pas son chemin complet juste le fichier).

    J'ai effectivement le .h mais je n'arrive pas à l'inclure.
    Le plus simple est de spécifier un répertoire d'include additionnel :

    Toujours dans la page des propriétés:

    Configuration Properties > C/C++ > General > Additional Include directories
    Ensuite, dans le code:


  7. #7
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 694
    Points : 188 894
    Points
    188 894
    Par défaut
    Tu peux aussi préciser les répertoires globalement, et non plus spécifiquement à un projet.

    Outils > Options > Projets et solutions > Répertoires de VC++
    Tools > Options > Projects and solutions > VC++ directories

    Concernant les includes, en général :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include "xxx" // inclure depuis le répertoire du fichier
    #include <xxx> // inclure depuis %INCLUDE%

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Points : 119
    Points
    119
    Par défaut
    Salut,

    Merci pour vos réponses !

    Si je comprend bien, la dll contient déjà une copie du .h que j'ai sur mon disque et donc normalement je n'ai besoin de ce fichier que à titre de documentation. (nom des classes, fonctions ...)

    Quand vous me dites d'ajouter un répertoire d'include additionnel, ceci semble vouloir dire que je dois inclure aussi le fichier .h que j'ai sur mon disque et non pas simplement à partir de la dll ou le .lib

    Mon projet visual studio a été crée avec Qmake puisque j'utilise Qt pour faire mes interfaces graphiques. Le .h que j'ai reçu avec la dll contient du code mfc et fait des includes de certains fichiers que je n'ai pas et c'est pourquoi je voulais éviter d'inclure ce fichier dans mon projet visual studio et utiliser uniquement la dll et le .lib (J'ai bien lié le .lib mais le include ne fonctionne pas.)

    Est ce que ceci peut se faire ?
    Est ce que le fait que la dll contient du MFC est un problème ?

    Merci pour votre aide.

  9. #9
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 694
    Points : 188 894
    Points
    188 894
    Par défaut
    Citation Envoyé par Nehmé Voir le message
    Si je comprend bien, la dll contient déjà une copie du .h que j'ai sur mon disque et donc normalement je n'ai besoin de ce fichier que à titre de documentation. (nom des classes, fonctions ...)
    Pas forcément. Si des fonctions sont seulement exportées, et jamais utilisées à l'intérieur de la DLL, le mainteneur pourrait décider de ne pas inclure le fichier H dans la liste des fichiers à compiler. Cela ne changera, au final, rien du tout : les fonctions seront définies dans la DLL, en liant à celle-ci (via le LIB) et en incluant le H dans lequel sont les prototypes des fonctions, tu pourras les utiliser. Je crains de n'avoir pas été très clair : en ce cas, saute vers la partie suivant, ce ne sont que pures réflexions, inutiles pour la résolution de ton problème.

    Citation Envoyé par Nehmé Voir le message
    Quand vous me dites d'ajouter un répertoire d'include additionnel, ceci semble vouloir dire que je dois inclure aussi le fichier .h que j'ai sur mon disque et non pas simplement à partir de la dll ou le .lib
    Ajouter un répertoire d'include, c'est préciser au compilateur un dossier où il peut trouver les fichiers include dont il pourrait avoir besoin (par exemple, les include pour Qt ou pour libmysql).

    Un fichier H sert à préciser au compilateur les fonctions qui sont définies. Peu importe où : dans ton projet, dans une librairie à laquelle tu lies... Sans lui, le compilateur ne peut pas savoir que ces fonctions existent. Donc, tu ne peux pas les utiliser.

    Citation Envoyé par Nehmé Voir le message
    Mon projet visual studio a été crée avec Qmake puisque j'utilise Qt pour faire mes interfaces graphiques. Le .h que j'ai reçu avec la dll contient du code mfc et fait des includes de certains fichiers que je n'ai pas et c'est pourquoi je voulais éviter d'inclure ce fichier dans mon projet visual studio et utiliser uniquement la dll et le .lib (J'ai bien lié le .lib mais le include ne fonctionne pas.)

    Est ce que ceci peut se faire ?
    Est ce que le fait que la dll contient du MFC est un problème ?
    Normalement, le fait que ta lib externe utilise les MFC n'est pas un problème. Seulement, tu ne peux utiliser les MFC qu'avec les éditions payantes de Visual Studio : c'est le seul moyen de les avoir...

    Par contre, au niveau du code, c'est déjà moins propre, vu que tu mélanges deux frameworks... Surtout que Qt sous Windows est une couche d'abstraction pour les MFC, en y ajoutant beaucoup.

    Si tu veux une application portable, ça m'étonnerait que ça fonctionne, les MFC étant réservées à Windows. Peut-être que Wine les émule déjà, mais il faudrait aussi faire fonctionner Qt avec Wine, ce qui n'est pas forcément possible... Donc, en cas de multiplateforme, ça n'ira pas !

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Points : 119
    Points
    119
    Par défaut
    Salut,

    Oui j'ai la version payante de visual studio et la portabilité du code n'est pas un problème dans mon cas. Le include fonctionne bien maintenant, je suis capable de créer des objets des classes inclus dans la dll:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	InitVnetDLL();
    	CVnetDoc *vnet = new CVnetDoc();
    	vnet->LoadModel( _T("Creighton.csv"));
    mais quand je fais appel à une méthode de la classe, j'obtiens des erreurs de Linking.
    1>Linking...
    1>VNetDll.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: int __thiscall CVnetDoc::LoadModel(unsigned short const *)" (__imp_?LoadModel@CVnetDoc@@QAEHPBG@Z) referenced in function "public: __thiscall VNetSim::VNetSim(void)" (??0VNetSim@@QAE@XZ)
    1>MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
    1>C:\ProjNHEA\VnetPC\Debug\VNetPc.exe : fatal error LNK1120: 2 unresolved externals
    Est ce que vous avez une idée d'ou est ce que ca peut venir ?

    Merci

  11. #11
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 694
    Points : 188 894
    Points
    188 894
    Par défaut
    Pour la première erreur, je ne vois que peu de possibilités : lies-tu bien avec le .lib ? le symbole que tu demandes est-il défini dans le .lib ?

    Pour la seconde, cette page pourrait t'intéresser : http://social.msdn.microsoft.com/For...2-90d5b6c8c51c

  12. #12
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    Citation Envoyé par superjaja Voir le message
    Normalement quand on fourni une DLL pour VC++ on fourni 3 choses:
    -La DLL
    -Le fichier .lib associé
    -Le fichier .H correspondant

    Si tu n'a pas le .h ça va etre plus ennuyeux...
    Ben, tout a été dit je pense
    Le problème error LNK2019 est généralement dû à une mauvaise liaison lorsque tu as lié le .lib

    En effet, est-ce que tu as le .H? Car le LIB et le H doivent aller de pair

    Et il suffit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <gdiplus.h>				// Base include
    #pragma comment(lib, "gdiplus.lib")
    Pas besoin d'inscrire le DLL quelque part dans VC++! Mais faut toujours l'avoir bien sûr dans le bon répertoire

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Points : 119
    Points
    119
    Par défaut
    Merci pour vos réponses !

    Ca fonctionne maintenant. Ce que j'ai fait est explorer la dll avec Dependency Walker. J'ai vu que la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BOOL LoadModel(LPCTSTR pszFilename);
    dans le .h recu avec la dll existe dans la dll sous différente forme (d'après dependency walker):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BOOL LoadModel(const char* pszFilename);
    J'ai juste changer le .h et maintenant ca fonctionne !

    Merci pour votre aide !

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Visiblement, celui qui a fait la DLL n'a pas compris ce qu'était un TCHAR.
    Ou bien, il y a deux versions de la DLL et tu as pris la version non-unicode.

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

Discussions similaires

  1. Charger une dll avec MinGW
    Par bertrand125 dans le forum C++
    Réponses: 6
    Dernier message: 24/10/2012, 01h44
  2. [windows] charger une dll (avec classe)
    Par superpok dans le forum Windows
    Réponses: 11
    Dernier message: 09/09/2007, 12h15
  3. charger une DLL avec paramètres
    Par cyberchand dans le forum C#
    Réponses: 6
    Dernier message: 29/05/2007, 17h28
  4. Réponses: 3
    Dernier message: 24/11/2006, 12h12
  5. créér une dll avec borland c++ compiler
    Par juju62610 dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 26/02/2003, 10h46

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