Convetion d'appel d'une DLL

Résolu
moreau_l Messages postés 35 Date d'inscription mercredi 8 octobre 2003 Statut Membre Dernière intervention 7 septembre 2007 - 4 mars 2005 à 09:24
moreau_l Messages postés 35 Date d'inscription mercredi 8 octobre 2003 Statut Membre Dernière intervention 7 septembre 2007 - 4 mars 2005 à 11:26
Bonjour tout le monde,



J'ai un petit problème avec une DLL que je fais sous VC++ 6 et que je veux utiliser sous VBA.



J'arrive sans problème à créer et utiliser ma DLL. Cependant, dès que
j'utilise des String en paramètre de fonction, j'ai un soucis. La
fonction est bien appellée et exécutée entierement mais VB me déclence
une erreur : "convention d'appel de DLL incorrecte"



Mes déclarations sont :

en C++ :

extern "C" char* t1(){ return "essai";}

extern "C" void t2(char *arg){MessageBox...}



en VB :

Public Declare Function t1 Lib "maDLL" () As String

Public Declare Sub t2 Lib "maDLL" (ByVal arg As String)



Donc, l'appel à t1 ne pose aucun problème. L'appel à t2 fonctionne (je
vois ma MessageBox qui affiche bien mon paramètre) mais me déclenche
une erreur de convention d'appel de DLL incorrecte.



Avez vous une idée sur mon problème ?



Merci,

Luc.

6 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 mars 2005 à 10:32
VB se sert de DLLs si elles exportent au standard API, à savoir __stdcall.

ciao...
BruNews, MVP VC++
3
cs_Stephane33 Messages postés 630 Date d'inscription samedi 15 février 2003 Statut Modérateur Dernière intervention 9 octobre 2011 1
4 mars 2005 à 09:49
extern "C" char* t1(){ return "essai";}


Public Declare Function t1 Lib "maDLL" () As String
0
moreau_l Messages postés 35 Date d'inscription mercredi 8 octobre 2003 Statut Membre Dernière intervention 7 septembre 2007
4 mars 2005 à 10:05
Je ne comprend pas ton message Stephane.

Je sais que char* en C++ equivaut à String en VB.



Cependant, c'est bien ce que j'utilise pour la procedure t2 pour son argument, et qui me pose problème.
0
cs_Stephane33 Messages postés 630 Date d'inscription samedi 15 février 2003 Statut Modérateur Dernière intervention 9 octobre 2011 1
4 mars 2005 à 10:17
Excuse j'ai lu un peu trop ton post.......

Une piste c'est pas plutôt
Public Declare Function t2 Lib "maDLL" (ByVal arg As String)

Ta DLL doit te retourner quelque chose donc c'est une fonction QuelquesChoses(truc as....)as
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 mars 2005 à 10:47
Autre rectif nécessaire:

char* équivaudrait à String de VB ?
ABSOLUMENT NON !!!

String est une zone mémoire allouée par SysAllocString() et autres APIs de sa catégorie (voir MSDN), cette zone comprend 4 octets au début, le compteur. Les données se trouvent donc à un offset 4 et peuvent contenir nimporte quelles valeurs y compris des zéros et n'a donc pas de délimiteur. Une chaine C n'en 'contient' jamais puisque le zéro est son délimiteur.

ciao...
BruNews, MVP VC++
0
moreau_l Messages postés 35 Date d'inscription mercredi 8 octobre 2003 Statut Membre Dernière intervention 7 septembre 2007
4 mars 2005 à 11:26
Ca fonctionne maitenant.

Il s'agissait bien du __stdcall. Merci BruNews



par contre, que l'argument (vb string) soit en c++ du char*, LPSTR ou LPCSTR . Tout fonctionne !



Pour Stephane, la déclaration de sub en vb ne pose aucun problème : déclaration en c++ : void proc(...)



Merci à vous pour vos réponse rapide !

A bientôt,

Luc.
0
Rejoignez-nous