Appel de DLL : convertir un vba en C

Résolu
salut67 Messages postés 27 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 1 novembre 2018 - 20 sept. 2015 à 19:42
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 - 19 oct. 2015 à 08:59
Bonjour,
j'ai un script VBA qui appelle une fonction de DLL. J'aimerais le convertir en un programme C (pour l'intégrer dans un autre programme C). Mais lors de l'exécution, plantage avec message Windows.

Script VBA fonctionnel :
option explicit
declare function myfun lib "mylib" (byval p1$, p1len as integer, byval p2$, p2len as integer, byval p3$, p3len as integer) as integer
type mytype
p1 as string : p1len as integer
p2 as string : p2len as integer
p3 as string : p3len as integer
end type
sub main
dim myvar as mytype
dim p1len as integer, p2len as integer, p3len as integer
dim p1$, p2$, p3$
let mytype.p1 = string$(255, " ") : let mytype.p1len = 255
let mytype.p2 = string$(255, " ") : let mytype.p2len = 255
let mytype.p3 = string$(255, " ") : let mytype.p3len = 255
ret = myfun(mytype.p1, mytype.p1len, mytype.p2, mytype.p2len, mytype.p3, mytype.p3len)
end sub


Programme C qui plante :
typedef LPTSTR (*GLI)(LPTSTR s);
typedef void (*GLIX)(char *p1, int p1len, char *p2, int p2len, char *p3, int p3len);
typedef struct { char c[255]; } c255;
void main(void)
{
HMODULE hm = LoadLibrary(TEXT("C:\\mylib.dll")); // retour # 0
GLIX myfun = (GLIX)GetProcAddress(hm, "myfun"); // retour # 0
c255 p1, p2, p3;
strcpy(p1.c, " ");
strcpy(p2.c, " ");
strcpy(p3.c, " ");
int p1len = 255, p2len = 255, p3len = 255;
myfun(p1, p1len, p2, p2len, p3, p3len); // plantage Windows
}


J'ai essayé de changer la taille des variables p1len, p2len, p3len : unsigned char, unsigned short, unsigned long, unsigned long long, toujours ko.
Si les pro peuvent me mettre sur une piste, merci d'avance.
Jean-Claude

4 réponses

dragonjoker59 Messages postés 92 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 23 septembre 2015
23 sept. 2015 à 17:16
Salut!

Dans tes commentaires, tu as mis que l'appel à LoadLibrary retourne zéro. As-tu vérifié avec GetLastError la raison de l'échec de l'appel?
0
salut67 Messages postés 27 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 1 novembre 2018
23 sept. 2015 à 20:21
Les fonctions retournent un nombre différent de zéro ("# 0"), sauf l'appel à myfun qui se plante.
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
15 oct. 2015 à 20:29
Salut,

tu peux essayer ceci

memset(p1.c, ' ', 255);
memset(p2.c, ' ', 255);
memset(p3.c, ' ', 255);

int p1len = strlen(p1.c);
int p2len = strlen(p2.c);
int p3len = strlen(p3.c);


bye...
0
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
19 oct. 2015 à 08:59
Bonjour,
Il faut être sûr des paramètres de la fonction : char, unsigned char, wchar ou autres.
Je te recommande de lire cet article en anglais : https://support.microsoft.com/en-us/kb/205277#bookmark-21.
Tu peux aussi installé un outil comme "dependencies Walker" afin de voir les fonctions exportées de ta dll et peut-être le type.

Bon courage
0
Rejoignez-nous