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

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

Votre réponse

4 réponses

Messages postés
93
Date d'inscription
samedi 26 mars 2005
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
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
Dernière intervention
23 janvier 2016
20
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
Dernière intervention
8 mars 2017
6
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.