Pb: Erreur lors de l'utilisation de ma Dll c++ en Vb

Résolu
PavICF Messages postés 17 Date d'inscription dimanche 8 août 2004 Statut Membre Dernière intervention 14 avril 2007 - 10 mars 2005 à 13:47
PavICF Messages postés 17 Date d'inscription dimanche 8 août 2004 Statut Membre Dernière intervention 14 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)


Merci d'avance, et bonne programmation!

2 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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.
3
PavICF Messages postés 17 Date d'inscription dimanche 8 août 2004 Statut Membre Dernière intervention 14 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.


En ce qui me concerne cela reste un mystère.


Mais bon, ça marche et c'est l'essentiel.


Merci pour ta réponse et bonne programmation!
0
Rejoignez-nous