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. #1
    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 : 41
    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 [DLL] problème pour appeler une fonction d'une DLL
    bonjour,

    j'ai commencé à découvrir les DLL Lundi. j'ai fait quelques tests pour voir si j'arrivais à en écrire une qui marche avant de me lancer dans une DLL plus compliquée (pour mon stage).

    la DLL toute bête fonctionne (exportation d'une fonction simple qui renvoie un double - liaison dynamique avec LoadLibrary).

    par contre la DLL que je suis en train d'écrire, que dalle. elle compile, mais lorsque j'appelle la fonction dans mon prog ---> plantage

    Debug Assertion Failed
    ...
    Expression: _CrtIsValidHeapPointer(pUserData)
    voilà le dernière version de ce que je fais (je suis sous Visual C++):

    1) j'inclus la lib dans mon programme

    2) j'importe ma fonction barbare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _declspec&#40;dllimport&#41; vector<so_contrainte *> analyse_spec &#40;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&#41;;
    3) je bidouille pour l'utiliser (désolé )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		vector<int> v1&#40;3&#41;,v2&#40;3&#41;,v3&#40;3&#41;;
    		for &#40;int w=0;w<3;w++&#41;
    		&#123;
    			v1&#91;w&#93; = 0;
    			v2&#91;w&#93; = 0;
    			v3&#91;w&#93; = 0;
    		&#125;
    		vector<so_contrainte*> vContrainte&#40;3&#41;;
    		vContrainte = analyse_spec &#40;1,"parallelisme",monEntite,monEntite,NULL,NULL,v1,v2,v3&#41;;
    voilà le code de la DLL :

    .h
    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
    #ifndef _C_EXPORT_
    #define EXPORT __declspec&#40;dllexport&#41;
    #endif
     
    #define _ANALYSE_SPEC_DLL_
     
    #include <bd_typ_t.h>
    #include <so_typ_t.h>
    #include <sp_inc_t.h>
     
    #include <so_con_t.h>
    #include <so_ent_t.h>
    #include <so_pro_t.h>
    #include <li_pro_t.h>
     
    #include <vector>
    #include <string>
     
    using namespace std;
     
     
     
    EXPORT vector<so_contrainte *> analyse_spec &#40;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&#41;;
    .cpp
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    // Analyse_Spec.cpp &#58; Defines the entry point for the DLL application.
    //
     
    #include <stdafx.h>
    #include <Analyse_Spec.h>
     
    //----------------------------------------------------------------------------------------------------------------------
     
    BOOL APIENTRY DllMain&#40; HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
    					 &#41;
    &#123;
        return TRUE;
    &#125;
     
    //----------------------------------------------------------------------------------------------------------------------
     
    char * nom_contrainte&#40;int nTypeContrainte&#41;
    &#123;
    	switch &#40;nTypeContrainte&#41;
    	&#123;
    	case 200&#58;
    		return "meme@posage";
    		break;
    	case 201&#58;
    		return "egalite@choix@appui";
    		break;
    	case 202&#58;
    		return "impose@appui";
    		break;
    	case 204&#58;
    		return "impose@reference";
    		break;
    	default&#58;
    		return "";
    	&#125;
    &#125;
     
    //----------------------------------------------------------------------------------------------------------------------
     
    so_contrainte * pose_contrainte &#40;int nTypeContrainte, so_entite * pEnt1, so_entite * pEnt2, int nTypeProcessus, int nClasse, BOOLEEN bIsActive, int nTypeRelation&#41;
    &#123;
    	char * cTypeContrainte = nom_contrainte &#40;nTypeContrainte&#41;;
    	so_contrainte * pContrainte = new so_contrainte&#40;cTypeContrainte,nTypeContrainte,pEnt1,pEnt2,nTypeProcessus,nClasse,bIsActive,nTypeRelation&#41;;
    	return pContrainte;
    &#125;
     
    //----------------------------------------------------------------------------------------------------------------------
     
    vector<so_contrainte *> parallelisme &#40;double val_anno, so_entite * pEntite,so_entite * pRef1, so_entite * pRef2, so_entite * pRef3,\
    									  vector<int> capa_eb, vector<int> capa_dfi, vector<int> capa_fi&#41;
    &#123;
    	// variables ---------------------------------------------------
     
    	bool appui1, appui2, surf_appui_entite, surf_appui_ref1;
    	bool spi_geo_read_integer_feature = true; // temporaire
     
    	int pos_capa = 7;
     
    	vector<so_contrainte *> vContrainte&#40;3&#41;;
    	for &#40;int i=0;i<3;i++&#41; vContrainte&#91;i&#93; = NULL;
     
    	int type_entite = pEntite->gettype_entite&#40;&#41;;
    	int type_ref1	= pRef1->gettype_entite&#40;&#41;;
     
    	// instructions ------------------------------------------------
     
    	if &#40;&#40;type_entite==SPI_ELTTYPE_FACE_FEATURE&#41; || &#40;type_entite==SPI_ELTTYPE_POCKET_FEATURE&#41;&#41;
    	&#123;
    		appui1 = true; // temporaire
    		if &#40;spi_geo_read_integer_feature&#41;  // a remplacer &#58; définir une fonction 'bool spi_geo_read_integer_feature&#40;...&#41;'
    		&#123;
    			if &#40;appui1&#41;	surf_appui_entite = true;
    		&#125;
    		else surf_appui_entite = false;
    	&#125;
     
    	if &#40;&#40;type_ref1==SPI_ELTTYPE_FACE_FEATURE&#41; || &#40;type_ref1==SPI_ELTTYPE_POCKET_FEATURE&#41;&#41;
    	&#123;
    		appui2 = true; // temporaire
    		if &#40;spi_geo_read_integer_feature&#41;  // a remplacer &#58; définir une fonction 'bool spi_geo_read_integer_feature&#40;...&#41;'
    		&#123;
    			if &#40;appui2&#41;	surf_appui_ref1 = true;
    		&#125;
    		else surf_appui_ref1 = false;
    	&#125;
     
    	if &#40;val_anno<=capa_eb&#91;pos_capa&#93;&#41;
    	&#123;
    		// règle 0-1
    		if &#40; &#40;surf_appui_entite&#41;&&&#40;surf_appui_ref1&#41; &#41;
    		&#123;
    			vContrainte&#91;0&#93; = pose_contrainte&#40;EGALITE_CHOIX_APPUI_POSAGE,pEntite,pRef1,TYPE_PROC_EBAUCHE,CLASSE_ERREUR,VRAI,CONT_PARALLELISME&#41;;
    		&#125;
     
    		// règle 0-2
    		else if &#40; &#40;surf_appui_entite&#41;&&&#40;!surf_appui_ref1&#41; &#41;
    		&#123;
    			vContrainte&#91;0&#93; = pose_contrainte&#40;IMPOSE_APPUI_PROCESSUS_SUIVANT,pEntite,pRef1,TYPE_PROC_EBAUCHE,CLASSE_ERREUR,VRAI,CONT_PARALLELISME&#41;;
    		&#125;
     
    		// règle 0-3
    		else if &#40; &#40;!surf_appui_entite&#41;&&&#40;surf_appui_ref1&#41; &#41;
    		&#123;
    			vContrainte&#91;0&#93; = pose_contrainte&#40;IMPOSE_APPUI_PROCESSUS_SUIVANT,pRef1,pEntite,TYPE_PROC_EBAUCHE,CLASSE_ERREUR,VRAI,CONT_PARALLELISME&#41;;
    		&#125;
     
    		// règle 0-4
    		else if &#40; &#40;!surf_appui_entite&#41;&&&#40;surf_appui_ref1&#41; &#41;
    		&#123;
    			vContrainte&#91;0&#93; = pose_contrainte&#40;MEME_POSAGE,pEntite,pRef1,TYPE_PROC_EBAUCHE,CLASSE_ERREUR,VRAI,CONT_PARALLELISME&#41;;
    		&#125;
     
    		// règle 1
    		if &#40;pRef2!=NULL&#41;
    		&#123;
    			vContrainte&#91;1&#93; = pose_contrainte&#40;IMPOSE_REFERENCE_PROCESSUS_SUIVANT,pEntite,pRef2,TYPE_PROC_EBAUCHE,CLASSE_ERREUR,VRAI,CONT_PARALLELISME&#41;;
    		&#125;
     
    		// règle 2
    		if &#40;pRef3!=NULL&#41;
    		&#123;
    			vContrainte&#91;2&#93; = pose_contrainte&#40;IMPOSE_REFERENCE_PROCESSUS_SUIVANT,pEntite,pRef3,TYPE_PROC_EBAUCHE,CLASSE_ERREUR,VRAI,CONT_PARALLELISME&#41;;
    		&#125;
    	&#125;
     
    	return vContrainte;
    &#125;
     
    //----------------------------------------------------------------------------------------------------------------------
     
    EXPORT vector<so_contrainte *> analyse_spec &#40;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&#41;
    &#123;
    // je fais la meme chose partout pour l'instant
    	if &#40;contrainte=="parallelisme"&#41;
    		return parallelisme &#40;val_anno,pEntite,pRef1,pRef2,pRef3,capa_eb,capa_dfi,capa_fi&#41;;
    	else if &#40;contrainte=="perpendicularite"&#41;
    		return parallelisme &#40;val_anno,pEntite,pRef1,pRef2,pRef3,capa_eb,capa_dfi,capa_fi&#41;;
    	else if &#40;contrainte=="localisation"&#41;
    		return parallelisme &#40;val_anno,pEntite,pRef1,pRef2,pRef3,capa_eb,capa_dfi,capa_fi&#41;;
    	else if &#40;contrainte=="symetrie"&#41;
    		return parallelisme &#40;val_anno,pEntite,pRef1,pRef2,pRef3,capa_eb,capa_dfi,capa_fi&#41;;
    	else // inclinaison
    		return parallelisme &#40;val_anno,pEntite,pRef1,pRef2,pRef3,capa_eb,capa_dfi,capa_fi&#41;;
    &#125;
     
    //----------------------------------------------------------------------------------------------------------------------
    merci pour les courageux qui vont s'attarder sur mon problème.

    (NOTE : j'ai aussi essayé de lier ma DLL dynamiquement avec LoadLibrary, puisqu'au final je devrais faire comme ça, mais ça ne marche pas non plus)

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    septembre 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2003
    Messages : 98
    Points : 75
    Points
    75
    Par défaut
    Est ce que la fonction que tu as écrite est effectivement bien exportée?
    Tu as vérifiée en regardant les dépendances de ta dll? (click droit sur ton fichier dll -> view dependencies)

  3. #3
    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 : 41
    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,

    click droit sur ton fichier dll -> view dependencies
    c'est où le view dependancies?

    je viens de tester s'il trouve la fonction

    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
    		typedef vector<so_contrainte*> &#40;CALLBACK* ANALYSESPEC&#41;&#40;double,string,so_entite *,so_entite *,so_entite *,so_entite *,vector<int>,vector<int>,vector<int>&#41;;
     
    		HINSTANCE hInstance;
    		ANALYSESPEC pAS;
     
    		hInstance = LoadLibrary&#40;"e&#58;\\utilisateurs\\falola\\Analyse_Spec.dll"&#41;;
     
    		if &#40;hInstance!=NULL&#41;
    		&#123;
    			pAS = &#40;ANALYSESPEC&#41; GetProcAddress&#40;hInstance,"analyse_spec"&#41;;
     
    			if &#40;!pAS&#41;
    			&#123;
    				FreeLibrary&#40;hInstance&#41;;
    				AfxMessageBox&#40;"erreur"&#41;;
    			&#125;
    			else
    			&#123;
    				vector<int> v1&#40;3&#41;,v2&#40;3&#41;,v3&#40;3&#41;;
    				for &#40;int w=0;w<3;w++&#41;
    				&#123;
    					v1&#91;w&#93; = 0;
    					v2&#91;w&#93; = 0;
    					v3&#91;w&#93; = 0;
    				&#125;
    				vector<so_contrainte*> vContrainte&#40;3&#41;;
    				vContrainte = pAS&#40;1,"parallelisme",monEntite,monEntite,NULL,NULL,v1,v2,v3&#41;;
     
    				FreeLibrary&#40;hInstance&#41;;
    			&#125;
    		&#125;
    évidemment, il me sort la MessageBox "ERREUR" !
    je ne vois pas mon erreur.

  4. #4
    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 : 41
    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
    NOTE : j'ai testé la fonction sans utiliser de DLL, en la mettant dans le code de mon EXE. elle marche nickel. l'erreur vient de l'exportation ou de l'importation de ma fonction à partir de la DLL.

  5. #5
    fd
    fd est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2002
    Messages : 131
    Points : 160
    Points
    160
    Par défaut
    pour la charger avec loadlibrary il faut la déclarer en extern "C"

  6. #6
    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 : 41
    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,

    comment peut-on exporter des fonctions C++ d'une DLL ?
    (note: sans le .LIB)

    dans mon cas, je ne peux pas mettre extern "C"

  7. #7
    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 330
    Points
    17 330
    Par défaut
    salut,
    en faisant une dll d'extensions voir mon dernier post dans le post it de la faq.

  8. #8
    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 : 41
    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 dois utiliser une DLL win32.
    1. avec les DLL d'extension je ne peux pas lier statiquement la DLL aux MFC (or mon application doit pouvoir tourner sur toute machine avec windows)
    2. avec les DLL classique MFC, je peux lier statiquement, mais je ne peux exporter que des fonctions C. pas de classes, pas de fonctions C++.
    3. je n'ai pas besoin des MFC dans mes DLL.



    arf, je galère grave là-dessus

    j'ai pas trouvé de bouquins qui traitent des DLL win32 à la BU. uniquement des DLL MFC dans les bouquins de Visual C++

    et pour l'instant sur internet, sucette
    je ne dois chercher ce qu'il faut

  9. #9
    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 330
    Points
    17 330
    Par défaut
    re,
    si tu peux/veux pas utiliser les MFC en shared dll tu es dans une impasse
    ceci dis c'est pas la mort de distribuer les dll sur les postes (c'est ce que je fais pour mes applis).
    et mes applis tournent de 98 a XP (j'en peux plus de win95 basta !).

  10. #10
    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 : 41
    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 ce cas quelles sont les DLL que je dois fournir avec mon appli ?
    mfc42.dll ?

  11. #11
    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 : 41
    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
    ah! et aussi,

    peut-on faire des liaisons explicites style LoadLibrary + GetProcAdress + FreeLibrary si la fonction exportée de la DLL est une fonction C++
    (pas de extern "C", juste _declspec(export) et _declspec(import)).

    parce que l'utilisateur de mon appli doit pouvoir choisir la DLL qui doit être utilisée (ça peut être une DLL qu'il a écrite lui-même).
    je ne peux pas utiliser de LIB.

    si je ne peux pas faire ça avec les DLL d'extension, alors le problème reste entier (i.e. je suis dans KK )

  12. #12
    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 330
    Points
    17 330
    Par défaut
    re,
    l'article MSDN:
    http://www.msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvc60/html/redistribvc6.asp
    en trouve VCREDIST.EXE
    dans le repertoire du service pack installé:
    FRENCH\VS60SP6\VC98\REDIST\VCREDIST.EXE

  13. #13
    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 586
    Points
    2 586
    Par défaut
    L'utilisation de LoadLibrary est compliquée dès qu'on exporte des classes. On peut tout de même y arriver en faisant un peu de gym.
    Je me suis pris la tête dessus il y a un an.
    J'ai précieusement garder un lien qui pourra surement t'y aider.

    vlà
    http://www.codeguru.com/Cpp/W-P/dll/...ticle.php/c123

  14. #14
    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 586
    Points
    2 586
    Par défaut
    Citation Envoyé par bigboomshakala
    ah! et aussi,

    peut-on faire des liaisons explicites style LoadLibrary + GetProcAdress + FreeLibrary si la fonction exportée de la DLL est une fonction C++
    (pas de extern "C", juste _declspec(export) et _declspec(import)).
    si c'est juste une fonction il n'y a pas de problème à utiliser extern C.
    Le problème se pose si tu veux exporter des classes.

  15. #15
    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 : 41
    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 commence à comprendre à quoi sert le extern "C". en effet je peux le mettre.

    je n'exporte pas de classes (pour l'instant, mais je vais devoir faire une DLL qui en exporte), juste une fonction.

    je résume ce que je fais maintenant (j'ai fais des changements qui vont peut-être simplifier le bazar)

    pour la DLL :

    .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define EXPORT extern "C" __declspec&#40;dllexport&#41;
    ...
    EXPORT void analyse_spec &#40;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 *>&#41;;
    .cpp
    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
    void analyse_spec &#40;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&#41;
    &#123;
    	vContrainte.resize&#40;3&#41;;
    	for &#40;int i=0;i<3;i++&#41; vContrainte&#91;i&#93; = NULL;
     
    	if &#40;contrainte=="parallelisme"&#41;
    		vContrainte = parallelisme &#40;val_anno,pEntite,pRef1,pRef2,pRef3,capa_eb,capa_dfi,capa_fi&#41;;
    	else if &#40;contrainte=="perpendicularite"&#41;
    		vContrainte = parallelisme &#40;val_anno,pEntite,pRef1,pRef2,pRef3,capa_eb,capa_dfi,capa_fi&#41;;
    	else if &#40;contrainte=="localisation"&#41;
    		vContrainte = parallelisme &#40;val_anno,pEntite,pRef1,pRef2,pRef3,capa_eb,capa_dfi,capa_fi&#41;;
    	else if &#40;contrainte=="symetrie"&#41;
    		vContrainte = parallelisme &#40;val_anno,pEntite,pRef1,pRef2,pRef3,capa_eb,capa_dfi,capa_fi&#41;;
    	else // inclinaison
    		vContrainte = parallelisme &#40;val_anno,pEntite,pRef1,pRef2,pRef3,capa_eb,capa_dfi,capa_fi&#41;;
    &#125;
    pour l'application :

    1. je link ma lib (project settings, link...)

    2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    extern "C" _declspec&#40;dllimport&#41; void analyse_spec &#40;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&#41;;
     
    typedef void &#40;CALLBACK* ANALYSESPEC&#41;&#40;double,string,so_entite *,so_entite *,so_entite *,so_entite *,vector<int>,vector<int>,vector<int>,vector<so_contrainte*>&&#41;;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    vector<int> v1&#40;14&#41;,v2&#40;14&#41;,v3&#40;14&#41;;
    for &#40;int w=0;w<14;w++&#41;
    &#123;
    	v1&#91;w&#93; = 100;
    	v2&#91;w&#93; = 100;
    	v3&#91;w&#93; = 100;
    &#125;
    vector<so_contrainte*> vContrainte&#40;3&#41;;
    analyse_spec&#40;1,"parallelisme",monEntite,monEntite,NULL,NULL,v1,v2,v3,vContrainte&#41;;
    la DLL compile bien (debug et release)

    l'appli bug à la compil

    Linking...
    Tab1.obj : error LNK2001: unresolved external symbol __imp__analyse_spec
    Debug/MyOMEGA.exe : fatal error LNK1120: 1 unresolved externals
    je ne suis pas sorti de l'auberge

  16. #16
    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 586
    Points
    2 586
    Par défaut
    Ton link ne doit pas être bon

    fais le par le code comme ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #pragma comment&#40;lib, "talib.lib"&#41;

  17. #17
    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 : 41
    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
    si je mets le chemin complet de la lib,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #pragma comment&#40;lib, "e&#58;\\...\\malib.lib"&#41;
    j'ai

    Linking...
    Tab1.obj : error LNK2001: unresolved external symbol __imp__analyse_spec
    Debug/MyOMEGA.exe : fatal error LNK1120: 1 unresolved externals
    si je donne un chemin erroné, j'ai

    Linking...
    LINK : fatal error LNK1104: cannot open file "E:\Utilisateurs\Falola\_SAUVEGARDES\MyOMEGA\Debug\Analyse_Spec.lib"

  18. #18
    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 586
    Points
    2 586
    Par défaut
    tu es sur que ta DLL compiles bien ?
    utilises tu la dernière version de la lib générée ?

    Parce qu'on est pas loin ça devrait marcher là

  19. #19
    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 : 41
    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 je suis sur d'appeler la bonne LIB (qui compile bien, au warning près : 'LINK : warning LNK4089: all references to "SHELL32.dll" discarded by /OPT:REF')

    j'ai retenté un LoadLibrary/GetProcAdress avec ma fonction exportée qui renvoie void maintenant, ça compile super (l'appli).
    à l'exécution il chope la DLL, mais quand je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ANALYSESPEC * pAS = &#40;ANALYSESPEC*&#41; GetProcAddress&#40;hInstance,"analyse_spec"&#41;;
    pAS est NULL

    (NOTE: j'ai enlevé le CALLBACK* dans le typedef, d'où le ANALYSESPEC* ici)

    ça me ronge, je ne vois ski cloche. j'ai l'impression que la fonction de la DLL n'est pas exportée. d'où l'impossibilité de l'importer dans l'appli !!!

  20. #20
    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 586
    Points
    2 586
    Par défaut
    euh ..
    t'as pas mis __declspec(dllexport) sur la définition de la fonction dans le .cpp de la DLL

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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, 11h18
  2. Problème d'appel de fonction d'une dll
    Par Daemon80 dans le forum Langage
    Réponses: 0
    Dernier message: 25/05/2012, 12h23
  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, 17h28
  4. Réponses: 1
    Dernier message: 01/04/2010, 15h49
  5. Réponses: 4
    Dernier message: 17/03/2004, 18h24

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