Acceder à une dll

Résolu
cs_Salim45 Messages postés 5 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 2 août 2007 - 15 avril 2007 à 10:37
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 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).

3 réponses

cs_Salim45 Messages postés 5 Date d'inscription vendredi 29 avril 2005 Statut Membre Derniè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.

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