Appel de DLL : convertir un vba en C [Résolu]

Messages postés
27
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
1 novembre 2018
- - Dernière réponse : cs_louis14
Messages postés
788
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
8 mars 2017
- 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
Afficher la suite 

4 réponses

Messages postés
93
Date d'inscription
samedi 26 mars 2005
Statut
Membre
Dernière intervention
23 septembre 2015
0
Merci
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?
Commenter la réponse de dragonjoker59
Messages postés
27
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
1 novembre 2018
0
Merci
Les fonctions retournent un nombre différent de zéro ("# 0"), sauf l'appel à myfun qui se plante.
Commenter la réponse de salut67
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
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...
Commenter la réponse de yann_lo_san
Messages postés
788
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
8 mars 2017
5
0
Merci
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
Commenter la réponse de cs_louis14