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

Résolu/Fermé
Little Developer - 4 juil. 2011 à 11:03
 Little Developer - 8 juil. 2011 à 12:50
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

Little Developer
5 juil. 2011 à 07:32
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
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
Little Developer
5 juil. 2011 à 04:36
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
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
Little Developer
8 juil. 2011 à 12:50
Great !

Alors le sujet est complètement résolu !

Merci le père.

Little Developer
1