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

MFC Discussion :

[DLL] problème pour appeler une fonction d'une DLL


Sujet :

MFC

  1. #21
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    je l'ai remis (je l'avais enlevé dans le CPP) ça ne change rien.

  2. #22
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    j'ai chargé dans mon appli une autre DLL que j'ai écrite. pas de problème elle marche

    DLL d'essai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define EXPORT extern "C" __declspec(dllexport)
     
    EXPORT double SquareRoot(double d);
    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
    #include "stdafx.h"
    #include "basicDLL.h"
    #include "math.h"
     
    //------------------------------------------------------------------------------
     
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
    					 )
    {
        return TRUE;
    }
     
    //------------------------------------------------------------------------------
     
    EXPORT double SquareRoot(double d)
    {
    	if (d>=0.0)
    		return sqrt(d);
    	else
    		return ZERO;
    }

    je ne comprend pas, j'ai écrit la 2è DLL sur le même modèle.
    est-ce à cause des classes que j'utilise ?
    ces classes sont connues dans le code qui appelle la fonction de la DLL, ça ne devrait pas poser de problème.

  3. #23
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    faut-il que j'exporte les classes utilisées dans la fonction de la DLL, ou le fait qu'elles soient déjà définies dans le code appelant de mon appli est-il suffisant?

  4. #24
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par bigboomshakala
    faut-il que j'exporte les classes utilisées dans la fonction de la DLL, ou le fait qu'elles soient déjà définies dans le code appelant de mon appli est-il suffisant?
    Non.

    Tu as clairement un problème dans ta DLL. La fonction que tu crois exportée ne l'est pas.

    Au niveau de la DLL, tu n'as aucune différence dans la signature de analyse_spec dans le .h et le .cpp ? notamment le CALLBACK.

    Fais voir le code des signatures stp

  5. #25
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    bonjour,

    dans le .h de ma dll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define EXPORT extern "C" _declspec(dllexport)
     
    EXPORT void analyse_spec (double val_anno, string contrainte, so_entite * pEntite,so_entite * pRef1, so_entite * pRef2, so_entite * pRef3,\
    							vector<int> capa_eb, vector<int> capa_dfi, vector<int> capa_fi,vector<so_contrainte *>);
    dans le .cpp de ma dll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    _declspec(dllexport) void analyse_spec (double val_anno,string contrainte,\
    				 so_entite * pEntite,so_entite * pRef1, so_entite * pRef2, so_entite * pRef3,\
    				 vector<int> capa_eb, vector<int> capa_dfi, vector<int> capa_fi,vector<so_contrainte *> & vContrainte)
    {
       ...
    }
    (j'ai essayé avec et sans _declspec(dllexport))

    dans le code appelant
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    typedef void (ANALYSESPEC)(double,string,so_entite *,so_entite *,so_entite *,so_entite *,vector<int>,vector<int>,vector<int>,vector<so_contrainte*>&);
    ...
    		HINSTANCE hInstance;
    		ANALYSESPEC * pAS;
     
    		hInstance = LoadLibrary("E:\\Utilisateurs\\Falola\\_SAUVEGARDES\\Analyse_Spec\\Release\\Analyse_Spec.dll");
     
    		typedef double (SQRTPROC)(double);
    		HINSTANCE hInstance2;
    		SQRTPROC * pSquareRoot;
     
    		hInstance2 = LoadLibrary("E:\\Utilisateurs\\Falola\\_SAUVEGARDES\\basicDLL\\Release\\basicDLL.dll");
    		pSquareRoot = (SQRTPROC*) GetProcAddress(hInstance2,"SquareRoot");
     
    		if (pSquareRoot) AfxMessageBox("ok");
     
    		if (hInstance!=NULL)
    		{
    			//ptr = (pANALYSESPEC) GetProcAddress(hInstance,"pAnalyse_spec");
    			pAS = (ANALYSESPEC*) GetProcAddress(hInstance,"analyse_spec");
     
    			if (!pAS)
    			{
    				FreeLibrary(hInstance);
    				AfxMessageBox("erreur");
    			}
    			else
    			{
    				//pAS = ptr();
    				vector<int> v1(14),v2(14),v3(14);
    				for (int w=0;w<14;w++)
    				{
    					v1[w] = 100;
    					v2[w] = 100;
    					v3[w] = 100;
    				}
    				vector<so_contrainte*> vContrainte(3);
    				(*pAS)(1,"parallelisme",monEntite,monEntite,NULL,NULL,v1,v2,v3,vContrainte);
     
    				FreeLibrary(hInstance);
    			}
    		}
    j'ai aussi essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef void (CALLCACK* ANALYSESPEC)(double,string,so_entite *,so_entite *,so_entite *,so_entite *,vector<int>,vector<int>,vector<int>,vector<so_contrainte*>&);
    ...
    OH ! je remarque à l'instant que dans la signature de analyse_spec du .h il manque '&' après vector<so_contrainte*>.
    j'espère que l'erreur vient de là

  6. #26
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    je suis pas sur que l'on puisse exporter dans une dll classique une fonction qui contient une reference aux stl.
    vu que l'on exporte des fonctions en C les stl c'est pas du C .
    au pire je transmettrais des pointeurs void a la place des vector ....

  7. #27
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    oui j'y ai pensé hier!
    je pensais tester ça demain.
    si j'ai le courage, j'installe VC++ et la MSDN chez moi et je regarde à ça tout à l'heure.
    faut que je speed. une semaine avant la fin du stage. et comme j'ai fait pas mal de choses et que ça marche, on m'en demande toujours plus.

    encore un peu de courage

  8. #28
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    dans un exemple simple, je viens de vérifier que l'on peut utiliser les vector dans les dll.
    j'ai modifié dans ma dll de tests la fonction SquareRoot pour qu'elle prenne un pointeur sur vector en paramètre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    EXPORT double SquareRoot(double d,vector<int> * v)
    {
    	(*v).resize(1);
    	(*v)[0] = 10;
     
    	if (d>=0.0)
    		return sqrt(d);
    	else
    		return 0;
    }
    dans le code appelant j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    v[0] = 3;
    m_dOutput = (*pSquareRoot)(m_dInput,&v);
    et en affichant v[0] dans un AfxMessageBox j'ai bien

    par contre si je passe une référence au lieu d'un pointeur sur le vecteur, ça ne me renvoie pas le bon résultat (mais ça ne plante pas)

  9. #29
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    yeah !!!

    c'est bon ma DLL marche. c'était bel et bien à cause de la signature qui n'était pas la même dans le .H et dans le .CPP
    (erreur idiote !!! comme la plupart que l'on fait)

    tout ça à cause d'un '&'

    merci à tous, je respire

  10. #30
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Pour les référence c'est normal. c'est exclusivement C++. Alors que ta fonction est marquée extern C.
    Mais ça ne plante pas à la compil ??

  11. #31
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    ouaip c'est tres bizarre tout ça !
    ça ne devrait pas fonctionner !

  12. #32
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    et non, ça ne plante pas dans le SquareRoot

    mieux encore, les références marchent a priori pour la fonction exportée analyse_spec (extern "C"). dans le prog appelant je teste le vecteur passé par référence et les données kil contient sont celles attendues (comme il nété pa initialisé avant l'appel, les données ne peuvent venir que du traitement par analyse_spec)

    je perds mes repères là. dans les DLL c'est censé être exclusivement du C ou alors on peut faire du C et du C++ ?
    d'autant que je peux utiliser les string dans les DLL (c'est du C++ ça)

  13. #33
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par abelman
    Pour les référence c'est normal. c'est exclusivement C++. Alors que ta fonction est marquée extern C.
    Mais ça ne plante pas à la compil ??
    Encore une connerie. En fait le extern C c'est juste pour éviter que le compilo C++ ne décore le nom de la fonction avec des symboles bizzares.

    On peut utiliser C et C++ dans les DLL. La référence devrait fonctionner aussi.
    Fais voir le code stp.

  14. #34
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    au temps pour moi
    ça marche avec les références dans mon SquareRoot. j'avais du faire une bêtise taleur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    EXPORT double SquareRoot(double d,vector<int> & v)
    {
    	v.resize(1);
    	v[0] = 10;
     
    	if (d>=0.0)
    		return sqrt(d);
    	else
    		return 0;
    }
    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
    void CRacine_carreDlg::OnCalcul() 
    {
    	// TODO: Add your control notification handler code here
    	if (m_csPath!="")
    	{
    		typedef double (SQRTPROC)(double,std::vector<int>&);
    		HINSTANCE hInstance;
    		SQRTPROC * pSquareRoot;
     
    		hInstance = LoadLibrary(m_csPath);
    		pSquareRoot = (SQRTPROC*) GetProcAddress(hInstance,"SquareRoot");
     
    		UpdateData(TRUE);
    		std::vector<int> v(1);
    		v[0] = 3;
    		m_dOutput = (*pSquareRoot)(m_dInput,v);
    		UpdateData(FALSE);
    		char buf[10];
    		AfxMessageBox(itoa(v[0],buf,10));
     
    		FreeLibrary(hInstance);
    	}
    	else AfxMessageBox("Choississez une DLL");
    }

  15. #35
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    encore une question.

    pourquoi est-ce que après FreeLibrary les données de mon vecteur sont perdues?

    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
    34
    35
    		typedef void (ANALYSESPEC)(double,string,so_entite *,so_entite *,so_entite *,so_entite *,vector<int>,vector<int>,vector<int>,vector<so_contrainte*>&);
    		HINSTANCE hInstance;
    		ANALYSESPEC * pAS;
     
    		hInstance = LoadLibrary("E:\\Utilisateurs\\Falola\\_SAUVEGARDES\\Analyse_Spec\\Release\\Analyse_Spec.dll");
    		vector<so_contrainte*> vContrainte(3);
     
    		if (hInstance!=NULL)
    		{
    			pAS = (ANALYSESPEC*) GetProcAddress(hInstance,"analyse_spec");
     
    			if (!pAS)
    			{
    				FreeLibrary(hInstance);
    				AfxMessageBox("erreur");
    			}
    			else
    			{
    				vector<int> v1(14),v2(14),v3(14);
    				for (int w=0;w<14;w++)
    				{
    					v1[w] = 100;
    					v2[w] = 100;
    					v3[w] = 100;
    				}
     
    				(*pAS)(1,"parallelisme",monEntite,monEntite,NULL,NULL,v1,v2,v3,vContrainte);
     
    				AfxMessageBox(vContrainte[0]->getnom());
     
    				FreeLibrary(hInstance);
    			}
    		}
     
    		if (vContrainte[0]==NULL) AfxMessageBox("toto");
    le message "toto" est affiché dnas ce cas. par contre si je mets le FreeLibrary après "toto", "toto" n'est pas affiché (le vecteur contient des données je peux faire vContrainte[0]->getnom() et récupérer l'info).

    normalement vContrainte devrait être conservé après FreeLibrary puisqu'il est déclaré dans le code appelant et que je l'ai passé par référence dans ma fonction exportée

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. Problème d'appel de fonction d'une dll
    Par Daemon80 dans le forum Langage
    Réponses: 0
    Dernier message: 25/05/2012, 11h23
  3. Type d'argument pour appel de fonction dans une DLL
    Par Lio590 dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 06/07/2011, 16h28
  4. Réponses: 1
    Dernier message: 01/04/2010, 14h49
  5. Réponses: 4
    Dernier message: 17/03/2004, 17h24

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