Création d'une dll C++ et appel depuis macro
Résolu/Fermé
A voir également:
- C++ vba
- Appel inconnu - Guide
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Creation compte gmail - Guide
- Nommez une application d'appel vidéo ou de visioconférence - Guide
- Création compte google - Guide
4 réponses
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
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
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"
.
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"
.
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 !!
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 !!
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.
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.