Acceder à une dll [Résolu]

Signaler
Messages postés
5
Date d'inscription
vendredi 29 avril 2005
Statut
Membre
Dernière intervention
2 août 2007
-
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
-
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:

3 réponses

Messages postés
5
Date d'inscription
vendredi 29 avril 2005
Statut
Membre
Dernière intervention
2 août 2007

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.

ps:
je n'oublie pas d'accepter la réponse.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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);
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.