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 :

Utilisation de DLL dans une application C++


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2008
    Messages : 354
    Points : 139
    Points
    139
    Par défaut Utilisation de DLL dans une application C++
    Bonjour,
    J'ai créé une DLL (win32) (test.dll).
    Je veux maintenant l'utiliser dans un autre projet (projet 2).
    Donc j'ai pris le fichier .lib et je l'ai mis avec le code du projet 2.
    Ensuite, j'ai mis le .dll dans le répertoire debug.
    Propriétés du projet>Editeur des liens>Entrée>dépendances supplimentaire> test.lib.

    Dans cette DLL, j'ai un fichier client.h.
    lorsque j'ai mis #include "client.h": dans projet 2, il m'affiche: impossible de trouver les fichiers.
    Je veux pas ajouter les fichiers de la dll dans projet 2. J'utilise VC++ 2008
    est ce que quelqu'un peut m'aider.
    merci

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Salut moooona

    Alors déjà, une petite précision : si tu utilises la DLL, tu n'as à priori pas besoin du *.lib, et inversement. Les *.lib servent pour une édition de liens statique, et les *.dll pour une édition de lien dynamique. Il te faudra faire un choix.

    Sinon pour ton problème, c'est parce que tu confond les headers et la dll.

    Citation Envoyé par moooona Voir le message
    Dans cette DLL, j'ai un fichier client.h.
    Une DLL ne contient pas de fichiers. Pour utiliser une DLL dans un autre programme, il faut que celui-ci ai aussi accès aux headers que tu veux lui permettre d'utiliser. Donc il faut ajouter le répertoire qui contient client.h dans les includes de ton projet.

    Tu vas Propriétés du projet> C/C++ > Général > Répertoires d'include additionnels (mon visual est en anglais, j'ai vaguement traduit). Et tu ajoutes le ou les répertoires nécessaires, séparés par des points virgules.
    Find me on github

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2008
    Messages : 354
    Points : 139
    Points
    139
    Par défaut
    oui c'est vrai. Il me faut ajouter le répertoire qui contient les fichiers de la dll
    Propriétés du projet> C/C++ > Général > Répertoires d'include additionnels
    Mais ce que je veux exactement est d'utiliser les méthodes de la dll sans donner le répertoir du client.h.
    En fait, j'ai une dll qui contient un ensemble des classes et des méthodes.
    Je veux utiliser la dll sans code source.
    c'est à dire, en supposant que je sais les méthodes que je vais l'utiliser dans projet2 et j'ai pas le code source de la DLL.
    Comment je peux faire pour que je puisse utiliser les méthodes de la DLL dans projet 2.

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Alors déjà, une petite précision : si tu utilises la DLL, tu n'as à priori pas besoin du *.lib, et inversement. Les *.lib servent pour une édition de liens statique, et les *.dll pour une édition de lien dynamique. Il te faudra faire un choix.
    Faux en fait.
    Visual génére avec la DLL également la LIB correspondante. C'est un fichier de toute petite taille qui fait appel à la DLL. Ca permet de linker de la mème manière qu'avec une librairie statique.
    C'est très pratique, car il n'est en pratique que rarement utile de gérer le chargement de la DLL soi-même (LoadLibraryA, FreeLibrary, GetProcAddress...)

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par moooona Voir le message
    oui c'est vrai. Il me faut ajouter le répertoire qui contient les fichiers de la dll

    Mais ce que je veux exactement est d'utiliser les méthodes de la dll sans donner le répertoir du client.h.
    En fait, j'ai une dll qui contient un ensemble des classes et des méthodes.
    Je veux utiliser la dll sans code source.
    c'est à dire, en supposant que je sais les méthodes que je vais l'utiliser dans projet2 et j'ai pas le code source de la DLL.
    Comment je peux faire pour que je puisse utiliser les méthodes de la DLL dans projet 2.
    C'est pas possible. Comment est-ce que le compilateur va faire pour déviner le nom des fonctions, le nombre de paramètres, etc ? Il lui faut ces informations, et elles ne sont pas dans la DLL (ou dans le .so sur les autres plateformes).

    Lorsque tu fournis un SDK, tu fournis une DLL, ds fichiers headers et généralement une librairie statique permettant à celui qui le souhaite de faire le lien direct avec la DLL (c'est une librairie d'import). C'est comme ça
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par moooona Voir le message
    c'est à dire, en supposant que je sais les méthodes que je vais l'utiliser dans projet2 et j'ai pas le code source de la DLL.
    Comment je peux faire pour que je puisse utiliser les méthodes de la DLL dans projet 2.
    Tu peux cacher l'implémentation (le contenu des *.cpp) mais tu ne peux PAS cacher les interfaces dont tu as besoin (le contenu des *.h). C'est une des raisons pour lesquelles on utilise justement deux fichiers, un pour l'interface, un pour l'implémentation.
    Find me on github

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par moooona Voir le message
    Bonjour,
    J'ai créé une DLL (win32) (test.dll).
    Je veux maintenant l'utiliser dans un autre projet (projet 2).
    Donc j'ai pris le fichier .lib et je l'ai mis avec le code du projet 2.
    Ensuite, j'ai mis le .dll dans le répertoire debug.
    Propriétés du projet>Editeur des liens>Entrée>dépendances supplimentaire> test.lib.

    Dans cette DLL, j'ai un fichier client.h.
    lorsque j'ai mis #include "client.h": dans projet 2, il m'affiche: impossible de trouver les fichiers.
    Je veux pas ajouter les fichiers de la dll dans projet 2. J'utilise VC++ 2008
    est ce que quelqu'un peut m'aider.
    merci
    Est-ce que modifier la liste des repertoires cherches pour les fichiers inclus est une solution acceptable? Sinon donne plus de renseignement sur ce que tu veux accomplir et pourquoi.

    Les bibliotheques dynamiques permettent de retarder le moment ou l'edition de liens est faite. Plutot que lorsque le programme est batit, ca peut se faire au lancement du programme ou meme pendant son execution. Pourquoi est-ce qu'on veut faire ca?

    Historiquement, une raison principale etait pour economiser la place sur le disque en evitant que les differents programmes aient chacun leur copie. Cette raison n'a generalement plus lieu d'etre de nos jours.

    Une autre raison est de pouvoir mettre a jour la bibliotheque sans changer le programme. C'est une raison toujours valable, mais ca demande une excellente maitrise de ce qu'il est possible de changer et de ce qu'il n'est pas possible de changer.

    Dans ces deux cas, on retarde l'edition de liens au lancement du programme. Ca se fait sous Windows en liant avec un .LIB special, sous Unix en liant avec le .so. Dans ce genre de contexte, le programme utilisant la bibliotheque dynamique est concu et ecrit comme si c'etait une bibliotheque statique: seul l'edition de liens change. Il est donc de bonne pratique de referencer les entetes definissant l'interface de la bibliotheque (generalement il seront trouves parce qu'on aura specifie au systeme de build un repertoires ou chercher pour trouves les fichiers inclus).


    Dans quels cas peut-on vouloir retarder encore plus le chargement? Deux grandes classes:
    - la bibliotheque est connue quand on batit le programme; mais on ne veut pas la charger directement pour differentes raisons (par exemple economiser la memoire, diminuer le temps de chargement, en particulier si la bibliotheque n'est pas toujours utilisee).
    - la bibliotheque n'existe pas encore, ou du moins est concue de maniere separee. Exemple typique: les plugins.

    Dans la premiere cas, on peut agir comme avec une bibliotheque statique (et donc avoir besoin des entetes), specifier a l'edition de liens qu'on accepte d'avoir des symboles non resolus et charger explicitement la bibliotheque avant d'appeler les fonctions. (Je ne sais pas si c'est techniquement possible sous Windows). On peut aussi considerer la bibliotheque comme un plugin.

    Dans le cas des plugins, ce n'est plus le programme qui doit utiliser la bibliotheque en respectant son interface, c'est la bibliotheque qui doit fournir l'interface attendue par le programme. Et la maniere la plus simple de le faire est que le code de la bibliotheque inclu des entetes fournit par le programme et definissant l'interface. D'autes techniques sont possibles, ecrire le code sans essayer d'utiliser le langage pour verifier la coherence -- mais pourquoi diable chercher des problemes? -- ou accompagner la bibliotheque d'un fichier decrivant l'interface fournie ou meme ecrire le code sans verifier les attentes (mais le programme principal doit savoir lire ce fichier et en faire quelque chose, c'est peut-etre le plus souple au final, mais c'est le plus complexe a mettre en oeuvre).

    tl;dr Le programme et la bibliotheque doivent etre d'accord sur l'interface. La maniere la plus simple d'y arriver est que l'un des deux inclus des entetes fournis par l'autre.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    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
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Dans quels cas peut-on vouloir retarder encore plus le chargement? Deux grandes classes:
    - la bibliotheque est connue quand on batit le programme; mais on ne veut pas la charger directement pour differentes raisons (par exemple economiser la memoire, diminuer le temps de chargement, en particulier si la bibliotheque n'est pas toujours utilisee).
    - la bibliotheque n'existe pas encore, ou du moins est concue de maniere separee. Exemple typique: les plugins.
    J'en rajouterai une 3eme, la portabilité. Lorsque l'on veut utiliser une API plutôt qu'une autre en fonction de la version du systeme d'exploitation. Exemple récent (et vécu), Sur Windows pre-Vista, utiliser l'ancienne "API EventLog", sur les versions Vista et supérieures, utiliser la nouvelle "API Event Logging". Dans ce cas, tout se passe avec des LoadLibrary, GetProcAddress et autre pointeurs de fonction puisque les DLL de la nouvelle API n'existent pas sur les anciennes versions.
    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
    .

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

Discussions similaires

  1. Utilisation de GStreamer dans une application
    Par bouncebounce dans le forum C++
    Réponses: 4
    Dernier message: 13/04/2007, 16h44
  2. Utilisation de GStreamer dans une application
    Par bouncebounce dans le forum C
    Réponses: 1
    Dernier message: 13/04/2007, 08h24
  3. Integration d'un fichier dll dans une application Java
    Par menzlitsh dans le forum Langage
    Réponses: 3
    Dernier message: 21/09/2006, 15h54
  4. Utilisation d'une dll dans une application.
    Par jamais34 dans le forum MFC
    Réponses: 5
    Dernier message: 31/03/2006, 10h39
  5. Utiliser un timer dans une application console
    Par chavers dans le forum Langage
    Réponses: 8
    Dernier message: 25/05/2005, 14h07

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