Ante todo, gracias por la respuesta.
efectivamente me da 0 el getprocaddress, pero parece que no existe la version A, en todo caso mas raro aun es que dentro del interprete parace estar funcionando ya que obtengo valores
el codigo del interprete que ejecuta estas funciones:
case LOADLIB: // "" -- hmo
TOS=(int64_t)LoadLibraryA((char*)TOS);goto next;
case GETPROCA: // hmo "" -- ad
TOS=(int64_t)GetProcAddress((HMODULE)*NOS,(char*)TOS);NOS--;goto next;
case SYSCALL0: // adr -- rs
TOS=sys0(TOS);goto next;
y el codigo de sys0 que es la llamada con tus indicaciones
int64_t sys0(int64_t fn) { return ((int64_t (__stdcall *)())fn)(); }
estoy compilando esto en gcc-4.9.2 64 bits en dev-ccp
el main de prueba es este
////////////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
int64_t hFunc;
HMODULE hLib=LoadLibraryA((LPCSTR)"Kernel32.dll");
if (!hLib) {
printf("Load Error\n");
return 0;
}else{
//printf("Load OK\n");
hFunc=(int64_t)GetProcAddress((HMODULE)hLib,"WriteConsole");
printf("Address=%p ",hFunc);
HANDLE hStdout;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
// hFunc=(int64_t)(* (int64_t(*)(int64_t,int64_t,int64_t,int64_t,int64_t))hFunc)((int64_t)hStdout,(int64_t)"coso",5,0,0) ;
//sys5((int64_t)hFunc,(int64_t)hStdout,(int64_t)"coso",5,0,0);
WriteConsole(hStdout, "coso", 5, 0, 0);
printf("ok?");
}
char filename[1024];
if (argc>1)
strcpy(filename,argv[1]);
else
strcpy(filename,"main.r3");
if (!r3compile(filename)) return -1;
runr3(boot);
return 0;
}
la salida del codigo en
Address=0000000000000000 coso ok?
r3vm - PHREDA
compile:main.r3... ok.
inc:0 - words:24 - code:0Kb - data:0Kb - free:1023Kb
hola fe400000 fe425290 fe41e0a0 fe41d490 fe424ee0 fe424fd0 fe4252f0 fe4253a0 0 allocfe425290
--------------------------------
Process exited after 2.451 seconds with return value 3221225477
Press any key to continue . . .
efectivamente sigue obteniedo 0 pero los numeros que aparecen despues de hola son los valores que obtiene dentro del interprete
Seguire intentando alternativas.
La razon por el que los parametros son todos interos es que en forth todos los parametros son pasados por una pila de numeros.
recien me di cuenta, WriteConsole, da 0 el resto no..
seguire probando..
gracias compañero !
Lo encontre!, no estaba guardando los 64bits en la memoria que almacena las direcciones de las funciones...