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

salut67 22 Messages postés mercredi 19 janvier 2011Date d'inscription 13 avril 2018 Dernière intervention - 20 sept. 2015 à 19:42 - Dernière réponse : cs_louis14 788 Messages postés mardi 8 juillet 2003Date d'inscription 8 mars 2017 Dernière intervention
- 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

Répondre au sujet
dragonjoker59 93 Messages postés samedi 26 mars 2005Date d'inscription 23 septembre 2015 Dernière intervention - 23 sept. 2015 à 17:16
0
Utile
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
salut67 22 Messages postés mercredi 19 janvier 2011Date d'inscription 13 avril 2018 Dernière intervention - 23 sept. 2015 à 20:21
0
Utile
Les fonctions retournent un nombre différent de zéro ("# 0"), sauf l'appel à myfun qui se plante.
Commenter la réponse de salut67
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 15 oct. 2015 à 20:29
0
Utile
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
cs_louis14 788 Messages postés mardi 8 juillet 2003Date d'inscription 8 mars 2017 Dernière intervention - 19 oct. 2015 à 08:59
0
Utile
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.