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 :

dll C++ pour VBA : erreur 49 et 453


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    24
    D�tails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 24
    Par d�faut dll C++ pour VBA : erreur 49 et 453
    Bonjour,
    je peine depuis quelques jours � cr�er une dll en c++ qui puisse �tre appel�e depuis VBA. J'ai bien s�r trouv� quelques exemples de code qui marchent, mais je n'arrive pas � transposer ces exemples dans mon propre code pour le faire fonctionner.
    Voici mon probl�me, en d�tail :
    Avec Code::Blocks (et sous Windows XP), je g�n�re** une dll "TestDLL.dll" dont le code est le suivant :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <windows.h>
    #ifdef __cplusplus
    extern "C" {
    #endif
    void __stdcall SomeFunction(const LPCSTR sometext)
    {
        MessageBox(0, sometext , "DLL Message", MB_OK | MB_ICONINFORMATION);
    }
    #ifdef __cplusplus
    }
    #endif
    Lors de la compilation, je demande � Code::Blocks (Project>Properties>Targets) de cr�er un fichier .def.
    Celui-ci, que Code::Blocks appelle libTestDLL.def, contient les lignes suivantes :

    EXPORTS
    SomeFunction@4 @1

    Dans VBA, j'appelle la dll de la sorte :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    Private Declare Sub SomeFunction Lib "C:\Documents and Settings\...\TestDLL8\TestDLL.dll" (ByVal chaine As String)
    Sub Test()
    SomeFunction ("toto")
    End Sub
    Et l� : erreur 453 (point d'entr�e de la fonction introuvable)!

    Bien s�r, dll et fichier def sont dans le m�me dossier. Bien s�r, j'ai essay� de modifier le fichier .def, en changeant son nom (en TestDLL.def)ou en modifiant son contenu. Par exemple :

    LIBRARY TestDLL
    EXPORTS
    SomeFunction=SomeFunction@4 @1;

    Je pense avoir essay� toutes les combinaisons de variantes imaginables...
    J'ai �galement v�rifi� avec Quick View Plus 8.0 que SomeFunction@4 est bien le nom de la fonction telle qu'elle appara�t dans la table d'exportation de la dll.

    En ce qui concerne le code c++, c'est celui qu'un forumeur m'a conseill� de prendre apr�s mes vaines tentatives avec des fichiers .h. Ses conseils me semblent de bon aloi, car son exemple de dll est en fait le seul qui marche (sans que je sache pourquoi...).

    Maintenant, il y a plus surprenant : lorsque je supprime le __stdcall (j'�cris "void SomeFunction(const LPCSTR sometext)"), alors le code commence par fonctionner correctement (j'ai un petit mesage "toto"), puis juste apr�s une erreur 49 (convention d'appel incorrecte).

    C'est donc soit l'une (erreur 453), soit l'autre (erreur 49). J'aimerai assez sortir de ce dilemme!

    Bien cordialement, et en vous remerciant par avance pour votre aide,

    EL

    ** Pour g�n�rer une dll avec Code::Blocks, je cr�e un nouveau projet (New Project>Dynamic Library File) en sp�cifiant de ne pas cr�er de nouveaux fichiers (option "Do not create any files"). J'importe alors dans ce projet le fichier TestDLL.cpp contenant le code ci-dessus. Je nomme le projet TestDLL et sp�cifie (Project>Properties>Targets) que le nom de la dll en sortie doit �tre TestDLL.dll.

    PS : j'ai �galement post� ce message sur le forum VB, la question concernant aussi ce langage. J'esp�re que ce doublon ne pose pas de probl�me.

    Addendum : on vient de m'indiquer une astuce en VBA qui permet de faire fonctionner le code (d�clarer la fonction dans l'appel VB en mettant en alias le nom de la fonction transform�e par le __stdcall). J'ai donc indiqu� que le probl�me �tait r�solu du c�t� du VB. Je le laisse ici, car il reste probablement un probl�me du c�t� de la gestion du .def ou du code c++. Si quelqu'un � une id�e...

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Euh, je crois que pour communiquer avec VB, les fonctions doivent utiliser des BSTR et non des cha�nes ANSI simples...
    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.

  3. #3
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    24
    D�tails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 24
    Par d�faut
    Merci pour votre aide M�dinoc. Le probl�me vient d'�tre r�solu par un intervenant de la partie VB de la discussion. Il s'agissait en fait d'un probl�me de gestion des fichiers .def par Code::Blocks. Je cite :

    Citation Envoy� par bbil
    pour clore le sujet j'ai trouv� ce qu'il fallait faire dans code::bocks pour qu'il prenne en compte le .def...

    Projet/Build Options/Linker/ Et dans listbox "Other linker option" rajout de -d sample.def

    (sample.def... �tant le fameux fichier def.. :


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    LIBRARY sample.dll
     
    EXPORTS
        SomeFunction=SomeFunction@4 @1
    Bien cordialement, et en esp�rant que cela puisse �tre utile � quelqu'un d'autre une prochaine fois,

    EL

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Dll C++ pour VBA
    Par hadGP dans le forum Visual C++
    R�ponses: 15
    Dernier message: 30/11/2014, 01h56
  2. DLL pour postgreSQL : erreur violation d'acc�s
    Par valda dans le forum PostgreSQL
    R�ponses: 1
    Dernier message: 11/02/2011, 13h27
  3. [XL-2003] Erreur d'execution '453' Point d'entr�e d'une DLL introuvable
    Par Mastein dans le forum Macros et VBA Excel
    R�ponses: 4
    Dernier message: 11/08/2009, 16h12
  4. erreur 91 : pour vba de access
    Par vava433 dans le forum VBA Access
    R�ponses: 5
    Dernier message: 04/08/2009, 15h38
  5. [VBA]dll C++ : erreur 49 et 453
    Par EL0807 dans le forum G�n�ral VBA
    R�ponses: 24
    Dernier message: 18/03/2006, 22h52

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