cs_Salim45
Messages postés5Date d'inscriptionvendredi 29 avril 2005StatutMembreDernière intervention 2 août 2007
-
15 avril 2007 à 10:37
racpp
Messages postés1910Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 2014
-
15 avril 2007 à 11:33
Bonjour à tous,
J'essaye d'accéder à des fonctons d'une Dll et j'ai une erreur de compilation de visual C++ :
Module:
File: i386\chkesp.c
Line: 42
The value of ESP was not properly saved across a function call.
Voiçi un bout de mon code qui pemet d'accéder à la DLL:
#include "stdafx.h"
#include <windows.h>
typedef void /*_stdcall*/ (*oupfuncPtr)(short PortAddress, short data);
typedef short /*_stdcall*/ (*inpfuncPtr)(short PortAddress);
oupfuncPtr _Out32;
inpfuncPtr Inp32;
int Reset(void)
{
HINSTANCE hInstLibrary = LoadLibrary("inpout32.dll");
if (hInstLibrary == NULL) {
FreeLibrary(hInstLibrary);
return 1; //pb de chargement de la Dll
}
_Out32 = (oupfuncPtr) GetProcAddress(hInstLibrary, "Out32");
Inp32 = (inpfuncPtr) GetProcAddress(hInstLibrary, "Inp32");
if ((_Out32 NULL) || (Inp32 NULL)) {
FreeLibrary(hInstLibrary);
}
//_Out32(78,11); // ça plante ici
Inp32(0x34); // ça plante ici
}
Est-ce quelqu'un d'entre vous pourquoi j'ai cette erreur ?
En vous remerciant par avance pour vos réponses.
Ps:
J'utilise VC++ 6.0 sous XP.
Le code du dessus est dans un source portant l'extension .c (et non pas .cpp).
A voir également:
The value of esp was not properly saved across a function call
cs_Salim45
Messages postés5Date d'inscriptionvendredi 29 avril 2005StatutMembreDernière intervention 2 août 2007 15 avril 2007 à 11:03
Bonjour racpp,
Merci pour votre réponse. Ca fonctionne bien. Par contre, peut-tu me dire pourquoi ça ne
marchais pas avant. Ceci m'aidera à comprendre mais aussi pour les autres.
Sincères salutations.
racpp
Messages postés1910Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201415 15 avril 2007 à 10:50
Salut,
Il parait que c'est un problème de convention d'appel. Essaie de définir les types de pointeurs des fonctions comme ceci:
typedef void (_stdcall *oupfuncPtr)(short PortAddress, short data);
typedef short (_stdcall *inpfuncPtr)(short PortAddress);
racpp
Messages postés1910Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201415 15 avril 2007 à 11:33
La convention d'appel concerne l'utilisation des paramètres pour l'appel d'une fonction. Par défaut, le compilateur utilise __cdecl mais les DLLs utilisent __stdcall.
__cdecl = Les paramètres sont mis dans la pile par l'appelant. Ils sont également retirés de la pile par l'appelant après l'appel de la fonction.
__stdcall = Les paramètres sont mis dans la pile par l'appelant. Ils sont retirés de la pile au sein de la fonction appelée.