PavICF
Messages postés17Date d'inscriptiondimanche 8 août 2004StatutMembreDernière intervention14 avril 2007
-
10 mars 2005 à 13:47
PavICF
Messages postés17Date d'inscriptiondimanche 8 août 2004StatutMembreDernière intervention14 avril 2007
-
10 mars 2005 à 14:56
Bonjour à tous!<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
J'ai créé une dll de gestion de base de données en c++ et, pour me simplifier la tache côté présentation, je fais l'interface graphique en Vb.
J'ai testé ma Dll et elle ne contient aucune erreur.
Seulement voilà: lorsque j'importe ma dll dans VB:
Public Declare Function TDBOpenDB Lib "DllTennisCDB.dll" (ByRef path As String) As Long
exportée en C++ par la définition suivante: (avec extern "C" en en-tête)
DLLEXPORT int __stdcall TDBOpenDB(const char *path);
J'ai le message d'erreur suivant lorsque je lance (avec "Run") le programme en VB:
"Erreur 49: Convention d'appel de Dll incorrect" à la ligne:
Dim res As Long
res = TDBOpenDB("C:\Temp\Tdb")
Pourtant, si je compile mon programme sans rien y changer, et qu'ensuite je lance l'exécutable, il n'y a aucune erreur et tout marche bien. Cependant, je suis encore en phase de développement et j'ai besoin de tester les fonctions sans perdre du temps à compiler à chaque fois mon programme.
J'ai essayé avec et sans le "__stdcall" avec le même résultat, j'ai aussi cherché sur internet mais je n'ai rien trouvé qui puisse m'apporter une réponse.
Si quelqu'un a une idée sur la cause de l'erreur, je serais ravi d'entendre son avis.
(Je développe sous Windows 2000 avec Microsoft Visual Studio 6.0)
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 10 mars 2005 à 14:25
Perso lorsque je passe des chaines à une DLL, je met ByVal et non ByRef
car la variable de type string en VB est en réalité (je crois) un
"pointeur" sur une chaine et non la chaine elle même.
Je ne sais si ça a une influence mais pour stdcall, je l'écrit avec un seul underscore et je ne met pas const dans la déclaration des paramètre dans les fonctions de la dll.
Je n'ai pas non plus extern "C" dans la dll, par contre je l'ai mis
pour les déclarations des fonctions de la dll dans une appli en C
C'est peut-etre aussi le fait de passer la chaine directement (en VB),
essaye de passer par une variable intermédaire plutot que de mettre la
chaine directement dans l'appel de la fonction.
<hr size="2" width="100%">Si le cerveau était assez simple pour que nous puissions le comprendre,
nous serions assez bête pour ne pas le comprendre malgré tout.
PavICF
Messages postés17Date d'inscriptiondimanche 8 août 2004StatutMembreDernière intervention14 avril 2007 10 mars 2005 à 14:56
Merci pour ta réponse.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
En ce qui concerne les ByRef, je les ai mi en désespoir de cause, à la base il y avait des ByVal. Ce que tu dis est vrai pour les chaînes de caractères en VB, il passe un pointeur et non une valeur (cf documentation MSDN).
En fait, je viens juste de résoudre le problème, bien que je ne sache pas exactement d'où il venait, j'ai ma petite idée sur la question.
J'ai enlevé extern "C" (qui sert à exporter des noms de fonctions non décorés), et du coup ça marche.
Je pense que lors de l'exécution du programme à partir de Vb, le compilateur doit avoir besoin des noms de fonctions décorés pour connaître le type des arguments passés à la fonction.
Mais ce qui est bizare, c'est que lorsque le fichier est compilé et devient un exécutable, ce dernier n'en a pas besoin.