Création d'une dll C++ et appel depuis macro

Résolu
Little Developer -  
 Little Developer -
Bonjour à tous,

Je voudrai faire une dll en C++ et l'utiliser dans une macro vba-excel.

Je n'ai pas de problème à créer ma dll. En revanche, lors de l'appel, j'ai 2 types de problèmes:
- soit l'erreur dit (si j'ai un .def, un .h et mon .cpp lors de la génération): point d'entrée de la fonction [ma fonction] d'une dll introuvable dans [mon chemin]
- soit il dit (si j'ai juste un .h et un .cpp, et que l'instruction d'export se trouve dans le .cpp) : convention d'appel de la procédure incorrecte.

J'ai remarqué que ce problème n'est pas nouveau, mais le net francophone semble manquer de réponse précise à ce sujet.

Celui qui prendra le temps de répondre ne sera donc pas seulement loué par moi, mais par toute une myriade de little developers désespérés ;-)

Merci beaucoup d'avance !

4 réponses

  1. Little Developer
     
    Rebonjour,

    Bon j'ai trouvé, et je crois que la réponse sera utile à certains.

    Il ne suffit pas d'inclure le fichier .def au projet pour que l'éditeur de lien le prenne en compte.

    Pour cela il faut aller dans:

    projet->propriété de [le nom du projet]-->editeur de liens--> Entrée
    Dans la case définition de module, indiquer oui et mettre le chemin du fichier .def

    Et là, badaboum, ça marche impec (avec le code ci-dessus) !

    En revanche, le Unload Me dans l'exécutable vba ne fonctionne pas. Je suis obligé de le mettre en commentaire pour que ma fonction s'éxécute (cf le code ci-dessus). Quelqu'un a t il une idée ?

    En effet, j'ai lu que si on ne unload pas, la mémoire n'est pas libérée et cela diminue progressivement les capacités de mon ordi. De quoi faire frémir ;-)

    Merci !

    Little Developer
    5
  2. le père
     
    Bonjour,

    Pour créer des dll pour travailler avec VB5 (je suppose que c'est la même chose avec VBA) il faut déclarer les fonctions à exporter avec la convention d'appel __stdcall.

    Je l'ai fait plusieurs fois pour pouvoir utiliser en VB des bibliothèques qui me donnaient le même message que toi "convention d'appel de la procédure incorrecte"
    .
    2
    1. Little Developer
       
      Bonjour,

      merci à le père de ta réponse. Cependant, le problème vient d'ailleurs. voici le code actuel:

      dans le fichier: SampleCode.cpp

      #include "SampleCode.h"
      int __stdcall MyFunction (int nFirstNum, int nSecondNum)
      {
      return nFirstNum + nSecondNum;
      }

      dans le fichier SampleCode.h
      #include <windows.h>
      int nFirstNum;
      int nSecondNum;

      dans le fichier SampleCode.def
      LIBRARY sampleCode
      EXPORTS
      MyFunction @1

      Enfin, dans mon code VBA:
      Option Explicit


      Private Declare Function MyFunction Lib _
      "c:\myDll\Release\myDll.dll" (ByVal nFirstNum As Long, ByVal nSecondNum As Long) As Long

      Private Sub Form_Load()
      Dim lngResults As Long
      lngResults = MyFunction(5, 4)
      MsgBox "The total is " & CStr(lngResults)
      'Unload Me
      End Sub

      Compilation VB: point d'entrée introuvable... grrrr

      Peut être faut il modifier les paramètres de l'éditeur de liens (et donner le chemin du fichier .def- solution vue sur internet)? en ce cas, je ne sais pas où trouver ces fameux "paramètres de liens".

      Peut être ma fonction est-elle décorée, et dois-je indiquer un nom décoré dans l'appel VB ? En ce cas je ne sais pas où retrouver le nom de ma fonction dans le fichier map que je génère (rien ne ressemble à myFunction).

      Peut être d'autres suggestions encore ?

      Merci d'avance !!
      0
  3. le père
     
    Bonjour

    Heureux que ce soit résolu côté DLL
    En ce qui concerne le unload, ce que tu écris m'étonne. Le unload me servirait à fermer le module qui contient ton code VB, ce qui n'est certainement pas ce que tu veux.
    Ta crainte n'est justifiée que si tu fais toi même explicitement appel à la fonction LoadLibrary pour charger la DLL, auquel cas tu ne dois pas oublier de faire appel à FreeLibrary avant de quitter ton application. Mais dans ton cas, c'est VB qui gère ça.
    2
  4. Little Developer
     
    Great !

    Alors le sujet est complètement résolu !

    Merci le père.

    Little Developer
    1