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 :

C++ et VB6 ne font pas bon ménage!


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 101
    Points : 38
    Points
    38
    Par défaut C++ et VB6 ne font pas bon ménage!
    Bonjour,

    Voila j'ai besoin de créer une DLL en C++ qui sera utilisé par un programme en VB6, j'ai beau testé tout les tutoriels qui se trouve sur le net, je n'y arrive pas.

    Sous VS2008 je créé un projet Win32 vide, qui contient 1 seul .cpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    extern "C"
    {
    	__declspec(dllexport) int DisplayHelloFromDLL(int a,int b)
    	{
    		return a+b;
    	}
    }
    Et voici le programme VB6:
    Déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Declare Function DisplayHelloFromDLL Lib "ma_dll.dll" (ByVal a As Long, ByVal b As Long) As Long
    Et l'appel de la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Private Sub Command1_Click()
    Dim a As Long
    Dim b As Long
     
    a = 1
    b = 2
     
        MsgBox API.DisplayHelloFromDLL(a, b)
    End Sub
    Et là je tombe sur une erreur:
    Erreur d'exécution 49: Convention d'appel de DLL incorrecte.

    Quel est le problème? Apparemment cette erreur est générer si lors de la déclaration je lui passe un mauvais type d'argument, mais ici se n'est pas le cas!

    J'ai oublié quelque chose dans ma DLL C++?
    J'ai tout essayer avec des fichiers .def, etc... mais rien ça ne veux pas!

    Merci

  2. #2
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Je ne connais pas trop VB, mais le fait de déclarer côté VB un point d'entrée avec des long en paramètre ne pose-t-il pas un problème si dans ta DLL la fonction a une interface avec des int? N'y-a-t-il pas un type équivalent en VB (int ou integer)?
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 101
    Points : 38
    Points
    38
    Par défaut
    Si en VB6 le type Integer existe et j'ai essayé aussi de déclarer ma fonction dans VB6 avec des Integer et non des Long mais rien a faire

  4. #4
    NairodDorian
    Invité(e)
    Par défaut
    "Erreur d'exécution 49: Convention d'appel de DLL incorrecte"
    Le message parle de lui même.
    Utilise la convention d'appel standard.
    Utilise un fichier def plutôt que __declspec(dllexport).

    Sinon pour revenir à la convention d'appel :
    #include <windows.h>
    __declspec(dllexport) int WINAPI DisplayHelloFromDLL(int a,int b)
    {
    return a+b;
    }

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 101
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par NairodDorian Voir le message
    Sinon pour revenir à la convention d'appel :
    #include <windows.h>
    __declspec(dllexport) int WINAPI DisplayHelloFromDLL(int a,int b)
    {
    return a+b;
    }
    Lorsque je fais ça, j'obtiens l'erreur: "Impossible de trouvé le point d'entrée DisplayHelloFromDLL dans madll.dll"




    J'ai beau essayer avec un fichier .def, mais je dois mal mis prendre:
    • Je génère le fichier MAP (.map)
    • Je récupère la signature de ma fonction (ici ?DisplayHelloFromDLL@@YGHHH@Z (int __stdcall DisplayHelloFromDLL(int,int)))
    • Mon fichier .def:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      LIBRARY	"MaDLL"
      EXPORTS
      	DisplayHelloFromDLL ?DisplayHelloFromDLL@@YGHHH@Z (int __stdcall DisplayHelloFromDLL(int,int))


    Mais quand je compile j'obtiens l'erreur:
    fatal error LNK1118: syntax error in '?DisplayHelloFromDLL@@YGHHH@Z' statement

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 101
    Points : 38
    Points
    38
    Par défaut
    Ah ba c'est bon ça fonctionne!

    Dans le fichier .def, il faut mettre l'ordinal et non le nom de la fonction décorée
    Soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LIBRARY	"MaDLL"
    EXPORTS
    	DisplayHelloFromDLL @1
    @1 étant l'ordinal qui m'est donné dans le fichier .map généré par VS

  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
    Généralement, j'utilise ceci:
    Code C/C++ : 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
    //MaDLL.h
    #ifndef EXTERN_C
    #ifdef __cplusplus
    #define EXTERN_C extern "C"
    #else
    #define EXTERN_C extern
    #endif
    #endif
     
    #ifdef MADLL_EXPORTS
    #define MADLL_API __declspec(dllexport)
    #else
    #define MADLL_API __declspec(dllimport)
    #endif
     
    EXTERN_C MADLL_API int __stdcall DisplayHelloFromDLL(int a,int b);
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //MaDLL.cpp
    EXTERN_C MADLL_API int __stdcall DisplayHelloFromDLL(int a,int b)
    {
    return a+b;
    }

    Et soit j'utilise directement le nom décoré en VB:

    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Declare Function DisplayHelloFromDLL Lib "ma_dll.dll" Alias "_DisplayHelloFromDLL@8" (ByVal a As Long, ByVal b As Long) As Long

    Soit je corrige dans un fichier def:
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LIBRARY "MaDLL"
    EXPORTS
    	DisplayHelloFromDLL=_DisplayHelloFromDLL@8
    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.

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

Discussions similaires

  1. [DisplayTag] Tri et pagination ne font pas bon ménage
    Par tiboudchou dans le forum Taglibs
    Réponses: 4
    Dernier message: 31/03/2010, 12h22
  2. [Linux]Thread et sockets qui ne font pas bon ménage
    Par manudwarf dans le forum Threads & Processus
    Réponses: 1
    Dernier message: 13/10/2009, 00h09
  3. rich:calendar, DIV et IE ne font pas bon ménage
    Par chotana dans le forum JSF
    Réponses: 1
    Dernier message: 20/04/2009, 17h16
  4. Le wifi et Club Internet ne font pas bon ménage!
    Par Ylias dans le forum La taverne du Club : Humour et divers
    Réponses: 5
    Dernier message: 20/08/2007, 10h30
  5. Réponses: 2
    Dernier message: 12/08/2007, 15h27

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