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 :

Problème utilisation dll


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Problème utilisation dll
    Bonjour,

    J'ai réalisé une dll et je souhaite la tester depuis un autre projet (VS2008).

    Ca c'est mon appli de test pour appeler la dll : http://pastebin.com/6sLcwjWB

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // testlib1.cpp*: définit le point d'entrée pour l'application console.
    //
     
    #include "stdafx.h"
    #pragma comment (lib, "createmarker.lib")
    extern "C" __declspec(dllimport) int  createOneMarker(char *VCID_in);
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	createOneMarker("98385faf-7918-46d2-a663-4cc19e7f68cc");
    	return 0;
    }
    Et ça le .h de la dll en question : http://pastebin.com/b9Tsqxkx

    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
    // test_lib.h
    #pragma once
    //using namespace System;  // this had to be commented out
    namespace createmarker{
            public class createMarkers
            {
            // TODO: Add your methods for this class here.
            public:
    			 createMarkers(char *VCID)
                 :mCount(VCID)
                    {
                    }
    			 __declspec(dllexport) int createOneMarker(char *VCID_in);
            private:
                    char * mCount;
            };
    }
    Sachant que la fonction extraite est plutôt longue : http://pastebin.com/4J4cwyE3

    Mais je suis persuadé que l'erreur est dans le lien entre les deux premières parties. J'ai bien entendu ajouté dans le linker les lib et dll générées préalablement.

    Quelqu'un aurait-il une idée ?

    Merci d'avance pour votre aide.

  2. #2
    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
    Bonjour,
    Peux-tu préciser ton problème ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Oui forcément si je précise pas l'erreur ...

    1>testlib1.obj : error LNK2019: symbole externe non résolu __imp__createOneMarker référencé dans la fonction _wmain
    1>C:\Users\Schnapz\Desktop\testlib1\Debug\testlib1.exe : fatal error LNK1120: 1 externes non résolus

    Voilà.
    Désolé -_-

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Je ne suis pas sur qu'on puisse appeler une méthode de DLL aussi facilement.

    Il me semble qu'il faut dans un premier temps charger la dll avec :

    HMODULE monModule = LoadLibrary("lib.dll");

    puis tu appel ta fonction

    resultat = (void*)GetProcAddress(monModule, "maFonction");

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    merci pour ta réponse. Je crois que je m'approche du résultat. Cela dit, dans ce que tu m'as donné, tu sauvegarde le résultat de la fonction dans une variable "résultat" alors que tu indique un (void*) ensuite (je te le dis car il me donne un message d'erreur).
    Ensuite, il faudrait que je passe un paramètre à ma fonction mais (void*)GetProcAddress(monModule, "createOneMarker("10")"); n'est pas reconnu. Il compile lorsque ce que j'enlève le paramètre, mais il n'a pas l'air de faire grand chose ensuite lors de l'exécution (il devrait me créer une image).
    Comment faire pour savoir s'il appelle bien la fonction de la dll ? Et comment lui faire passer un argument si c'est le cas ?

    Merci d'avance.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Hm oui je suis allé un peu vite en besogne excuse moi.

    Remplaçons "resultat" par "fonction", ce sera bien plus cohérent.

    Ainsi on aurait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef int (*PFUNC)(void); // remplace int par le type de retour de ta fonction
     
    HMODULE monModule = LoadLibrary("lib.dll"); // On charge la dll
    PFUNC pFunc = (PFUNC)GetProcAddress(monModule, "maFonction"); // On récupère l'adresse de la fonction
    pFunc(); // On appel la fonction
    Dans le cas d'une fonction avec argument, tu n'as qu'à modifier ton type en fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef inf (*PFUNC)(int, float);
     
    ...
     
    pFunc(8, 3.14);

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci ! Cela se compile désormais.
    Mais j'ai une erreur lors de l'exécution de l'application.
    "Exception non gérée à 0x00000000 dans testlib1.exe*: 0xC0000005: Access violation."

    Après quelques recherches, j'ai vu que c'était probablement du à une initialisation de pointeur, mais comme là je nage en eaux troubles je ne sais pas vraiment quoi initialiser.

    Le debugueur m'indique que l'erreur se situe sur la dernière ligne avant le return, donc lors de l'appel de la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	typedef int (*PFUNC)(char*);
    	HMODULE monModule = LoadLibrary("createmarker.dll");
     
    	PFUNC pFunc = (PFUNC)GetProcAddress(monModule, "createOneMarker");	//createOneMarker("98385faf-7918-46d2-a663-4cc19e7f68cc");
    	pFunc("98385faf-7918-46d2-a663-4cc19e7f68cc");
    	return 0;

    Le code machine (on sait jamais ça peut servir):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	pFunc("98385faf-7918-46d2-a663-4cc19e7f68cc");
    011F1A70  mov         esi,esp 
    011F1A72  push        offset string "98385faf-7918-46d2-a663-4cc19e7f"... (11F6B20h) 
    011F1A77  call        dword ptr [pFunc] 
    011F1A7A  add         esp,4 // Le blocage est ici !
    011F1A7D  cmp         esi,esp 
    011F1A7F  call        @ILT+310(__RTC_CheckEsp) (11F113Bh)

    Une idée ?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Je ne connais pas vraiment Visual ni les dll mais il me semble que createOnMarker est un membre non-statique d'une classe et donc q'une instance est requise pour l'appeler

  9. #9
    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
    Salut,
    Ne serait-ce pas parce que GetProcAddress a retourné une adresse nulle ?

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Je n'arrive pas vraiment à déterminer si c'est le cas. Mais si ça l'est, où se situe l'erreur à corriger ?
    La dll ne semble pas fonctionner finalement car mon collaborateur n'a pas réussi à importer la fonction sous divers langages. Sa construction est-elle correcte ?

  11. #11
    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
    Pour savoir si GetProcAddress a échoué, il suffit de tester si la valeur retour est NULL
    Ceci dit, je pense que c'est le cas car tu essaies d'exporter dans ta DLL uniquement une fonction membre d'une classe et sa signature n'est surement pas "createOneMarker". De plus son appel nécessite un objet valide.

    Exporter une fonction C est relativement facile et bien utilisable. Ce tutoriel devrait t'aider : Les bibliothèques dynamiques (DLLs), par Melem.

    En C++, c'est un peu plus compliqué car une DLL créé avec une version de compilateur ne sera simplement utilisable qu'avec les programmes compilés avec le même compilateur. Tu pourras trouver des infos dans la F.A.Q. : DLL, ou dans ce message ou dans celui-là. Le tutoriel de Laurent Gomila aborde aussi la création d'une DLL.

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Ouhla si c´est le cas je suis mal barré... Enfin je vais aller lire tout ca merci beaucoup !

  13. #13
    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 590
    Points
    41 590
    Par défaut
    Si tu as le #pragma comment(lib) qui marche, tu ne devrais pas avoir besoin de passer par LoadLibrary() et GetProcAddress().

Discussions similaires

  1. Problème utilisation Dll créée en delphi dans une appli VB6
    Par Djelangelo dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 25/01/2011, 16h48
  2. Problème utilisation DLL Inpout32
    Par stephantasy dans le forum Général VBA
    Réponses: 7
    Dernier message: 23/03/2010, 19h27
  3. Problème utilisation DLL VC++
    Par lio33 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 29/06/2007, 14h57
  4. problème utilisation dll
    Par od.dev dans le forum Delphi
    Réponses: 13
    Dernier message: 09/01/2007, 14h51
  5. Problème utilisation DLL
    Par Tub-95 dans le forum MFC
    Réponses: 4
    Dernier message: 02/11/2005, 13h00

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