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 :

Création et utilisation de DLL sous Visual Sudio 2005 pour appli graphique


Sujet :

Visual C++

  1. #1
    Membre du Club Avatar de Artusamak
    Inscrit en
    Mai 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 76
    Points : 55
    Points
    55
    Par défaut Création et utilisation de DLL sous Visual Sudio 2005 pour appli graphique
    Bonjour à toutes et à tous, je viens solliciter votre aide pour une question de prog sous VS 2005.

    Je suis entrain de chercher à faire une DLL classique que je pourrais réutiliser pour mon appli graphique réalisée sous Visual Studio 2005 en tant que Projet Windows Forms.

    L'IHM est réalisée sans problèmes, le soucis c'est que cette IHM doit utiliser une DLL et que je ne parviens pas à appeler les méthodes de cette DLL, c'est une série de messages d'erreurs à la sortie.

    Pour la réalisation de la DLL, j'ai tenté différentes façons :

    Premier essai :


    Création d'un Projet Win32 et lors de la configuration à l'initalisation du projet j'ai choisi "DLL" et coché la case "Projet vide". Ensuite dans ce projet vide j'ai ajouté le code bateau d'une méthode qui retourne juste une valeur histoire de tester.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h> 
     
    extern "C" 
    { 
      __declspec(dllexport) int methode_dll_return() 
      { 
        return 5;
      } 
    }
    Ensuite pour l'importation dans mon appli graphique, j'ai copié/collé la dll et le fichier .lib dans le répertoire de mon apli graphique ensuite j'ai ajouté le .lib comme entrée au linkage. Et j'ai droit au message d'erreur suivant quand je compile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Erreur 1 error C3861: 'methode_dll_return' :
    identificateur introuvable
    c:\documents and settings\artusamak\mes documents\visual studio 2005\projects\ihm_domocan_2007\ihm_domocan_2007\Form1.h	30

    Deuxième essai :


    Création d'une DLL comme au dessus en projet Win32 mais cette fois au lieu de projet vide, je sélectionne la case "Exporter des symboles" histoire d'avoir un .h pour les méthodes de la dll.
    Une fois la config faite le source de la DLL ressemble à ça :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include "stdafx.h"
    #include "projet_developpez.h"
     
     
    #ifdef _MANAGED
    #pragma managed(push, off)
    #endif
     
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
    					 )
    {
    	switch (ul_reason_for_call)
    	{
    	case DLL_PROCESS_ATTACH:
    	case DLL_THREAD_ATTACH:
    	case DLL_THREAD_DETACH:
    	case DLL_PROCESS_DETACH:
    		break;
    	}
        return TRUE;
    }
     
    #ifdef _MANAGED
    #pragma managed(pop)
    #endif
     
     
    // Il s'agit d'un exemple de fonction exportée.
    PROJET_DEVELOPPEZ_API int methode_dll_return(void)
    {
    	return 5;
    Donc je génère ma DLL, copie le .dll et le .lib généré ainsi que le .h dans le répertoire de mon appli graphique.
    Côté config de l'appli graphique je spécifie le .lib comme point d'entrée au linkage, ajoute le .h au projet et ajoute un #include du .h dans le source de l'appli. Et lorsque je compile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Erreur 3 error LNK2028: jeton non résolu (0A000056) "int __clrcall methode_dll_return(void)"
    (?methode_dll_return@@$$FYMHXZ)
    référencé dans la fonction "public: __clrcall IHM_DomoCAN_2007::Form1::Form1(void)"
    (??0Form1@IHM_DomoCAN_2007@@$$FQ$AAM@XZ)	IHM_DomoCAN_2007.obj
     
     
    Erreur 4 error LNK2019: symbole externe non résolu "int __clrcall methode_dll_return(void)"
    (?methode_dll_return@@$$FYMHXZ)
    référencé dans la fonction "public: __clrcall IHM_DomoCAN_2007::Form1::Form1(void)"
    (??0Form1@IHM_DomoCAN_2007@@$$FQ$AAM@XZ)
    IHM_DomoCAN_2007.obj


    Voilà donc je ne sais plus comment m'y prendre pour pouvoir utiliser une DLL dans cette IHM

    Merci à vous si vous avez un éclat de génie !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Points : 347
    Points
    347
    Par défaut
    Bonjour

    Voila la procedure que j'utilise et qui semble marcher chez moi!!

    Creation de la DLL:

    Declaration des fonctions à exporter sous les include de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int __stdcall ResetduDSP(int SrPortNo);
    et plus loin son code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int __stdcall ResetduDSP(int Port)
    {
    	CString strbis;
    	int result;
    	strbis.Format("COM%d",Port);
    result = 	InitCom(strbis);
    if (result ==1) CloseHandle(hPort);
     	return result;
    }
    De plus creation d'un fichier nomdeladll.def
    de la forme pour ne pas avoir le nom des fonctions décorées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ; GetList.def : Declares the module parameters for the DLL.
     
    LIBRARY      "GetList"
    DESCRIPTION  'GetList Windows Dynamic Link Library'
     
    EXPORTS
        ; Explicit exports can go here
     
    	GetListTag			@1
    	GetSerialPortNumber @2
    	ResetduDSP			@3
    2 utilisation de la DLL sans besoin de la lib et du .h

    On met la DLL ou sera present l'exe qui doit l'utiliser

    on declare un pointeur de la fonction avec les type entree sortie correspondant sous les include
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef int (CALLBACK* LPFNRESETS)(int);
    puis on charge la DLL et on attribut le pointeur a la fonction que l'on veut.
    C'est la que le .def te permet d'avoir le nom de ta fonction que tu a ecris sans la decoration du nom des fonctions de la DLL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    HINSTANCE hClcltr=LoadLibrary("GetList.dll");
     
    LPFNRESETS	lpfnResets;		
     
    lpfnResets = (LPFNRESETS)GetProcAddress(hClcltr,"ResetduDSP");
    il reste justa a utiliser la fonction comme une fonction classique


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int IdOK;
    int mynumport = 1;
    IdOk=lpfnResets(mynumport);
    Par contre tres important de decharger la DLL a la fin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FreeLibrary( hClcltr );

  3. #3
    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
    Ricky: Génial, on pose une question sur la liaison implicite et tu réponds par une liaison explicite...

    Artusamak : Les fonctions doivent être déclarées en __declspec(dllimport) dans le programme qui utilise.
    Typiquement, on fait le header comme ça:
    http://www.developpez.net/forums/sho...42&postcount=6
    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.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    J'ai moi aussi des problèmes pour appeler une DLL sous VS2005 : je bosse sur du code managé, et il semble que les instructions __clr et __declspec(dllexport) soient incompatibles (erreurs de compilation C3387 et C3395).

    Médinoc, pourrais-tu me faire un petit topo sur la déclaration des classes et fonctions dans la DLL, et sur les procédures à suivre dans un programme appelant STP ?
    Ça me tirerait une bonne épine du pied : en effet, je vois gavé de doc sur l'appel de DLL en C++ natif par du code managé, mais je ne vois pas comment faire un simple appel de DLL managée par du code managé. Même dans la doc MSDN c'est très flou : je suis tombé sur des commentaires du genre "__clr et __declspec(dllexport) sont incompatibles" sans plus de détails...


    Merci !

  5. #5
    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
    Je ne m'y connais pas vraiment pour les DLLs managées, mais il me semble que .Net fait ça tout seul: Toute classe .Net marquée public sera exportée.
    Ensuite, pour l'utiliser depuis du C++/CLI, je crois que c'est pareil que pour utiliser n'importe quelle autre DLL managée: Un ajout de référence et (ou?) un #using pour déclarer que tu utilises les classes managées de la DLL...

    Ce que j'ai posté avant, c'était pour les DLLs natives, naturellement.
    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.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Merci pour ta réponse Médinoc...

    J'en ai touché un mot à Nico qui m'a dit que si mon appli et mes DLL étaient en pur CLI, il fallait que je me penche sur les assemblies, qui seraient l'équivalent des DLL en .NET
    Et là je suis tombé sur des histoires de manifest, mais je n'ai pas encore trouvé de doc qui m'explique clairement, en commençant pas le début, ce que c'est, pouquoi c'est fait, et surtout comment je gère ça dans Visual.
    L'info est fragmentée et encore très floue pour moi, j'ai du mal à obtenir un bon vieux manuel bien complet... Quelle usine à gaz !

  7. #7
    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
    En effet, .Net est beaucoup plus simple en VB.Net et C# qu'en C++.
    Surtout, Intellisense est beaucoup plus puissant en C#, ce qui facilite pas mal le boulot.

    Mais bon, faut pas trop se plaindre non plus: Au moins maintenant, on a C++/CLI, avant on n'avait droit qu'à Managed Extensions for C++...
    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.

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/10/2010, 12h52
  2. utiliser une dll sous visual 2008 c++
    Par milach dans le forum Visual C++
    Réponses: 4
    Dernier message: 11/01/2010, 17h36
  3. VB6 vers SQLite création de SQLiteVB.dll sous visual 2005
    Par lathenor dans le forum Visual C++
    Réponses: 3
    Dernier message: 21/05/2007, 11h39
  4. Réponses: 15
    Dernier message: 13/04/2006, 13h32
  5. Utilisation d'une Dll sous Visual C++
    Par Hokagge dans le forum MFC
    Réponses: 3
    Dernier message: 11/01/2006, 14h40

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