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 :
Lors de la compilation, je demande � Code::Blocks (Project>Properties>Targets) de cr�er un fichier .def.
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
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 :
Et l� : erreur 453 (point d'entr�e de la fonction introuvable)!
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
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...
Partager