Convetion d'appel d'une DLL [Résolu]

Signaler
Messages postés
35
Date d'inscription
mercredi 8 octobre 2003
Statut
Membre
Dernière intervention
7 septembre 2007
-
Messages postés
35
Date d'inscription
mercredi 8 octobre 2003
Statut
Membre
Dernière intervention
7 septembre 2007
-
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

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

ciao...
BruNews, MVP VC++
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 123 internautes nous ont dit merci ce mois-ci

Messages postés
630
Date d'inscription
samedi 15 février 2003
Statut
Modérateur
Dernière intervention
9 octobre 2011
1
extern "C" char* t1(){ return "essai";}


Public Declare Function t1 Lib "maDLL" () As String
Messages postés
35
Date d'inscription
mercredi 8 octobre 2003
Statut
Membre
Dernière intervention
7 septembre 2007

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.
Messages postés
630
Date d'inscription
samedi 15 février 2003
Statut
Modérateur
Dernière intervention
9 octobre 2011
1
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
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
23
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++
Messages postés
35
Date d'inscription
mercredi 8 octobre 2003
Statut
Membre
Dernière intervention
7 septembre 2007

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.