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
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
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
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
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