PDA

Visualizza la versione completa : (C) importare una funzione da una dll


manu86
28-01-2010, 12:32
Buongiorno a tutti,
stavo cercando di capire come vengono importate dinamicamente le funzioni dalle librerie DLL quando mi sn imbattuto in questo errore di debug:

The value of ESP was not properly saved across function call..ecc ecc


Il codice del mio programma questo



#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
typedef HGLOBAL (*GLOBALALLOC)(UINT,SIZE_T);


int main(){
GLOBALALLOC MyGlobalAlloc;
MyGlobalAlloc=(GLOBALALLOC)GetProcAddress(LoadLibr ary("Kernel32.dll"),"GlobalAlloc");
char *rrr=(char *)MyGlobalAlloc(GPTR,sizeof(char)*2);
return 0;
}


dove sbaglio?? :master:

MItaly
28-01-2010, 14:39
Le API di Windows usano come convenzione di chiamata stdcall, mentre l nel typedef non hai specificato alcuna convenzione di chiamata, per cui, salvo impostazioni contrastanti a livello di progetto, di default cdecl. Ovviamente chiamando una funzione con una convenzione di chiamata differente da quella che si aspetta il risultato la corruzione dello stack.
Per risolvere, cambia il typedef in


typedef HGLOBAL (WINAPI * GLOBALALLOC)(UINT,SIZE_T);
(WINAPI non altro che un #define per __declspec(stdcall)).

manu86
28-01-2010, 15:24
grazie

MItaly
28-01-2010, 15:36
:ciauz:

Loading