Programación General > C/C++

 cómo se accede a una funcion de una dll mediante GetProcAddr

<< < (2/2)

m0skit0:
Yo nunca he programado para Windows con C++, pero si es un puntero lo que te devuelve será un puntero con el resultado, no un puntero a función, ya que entonces no tendría mucho sentido pasarle los argumentos. Si es así, prueba con


--- Código: C++ ---int* retorno;retorno=ProcAdd(L"a,b");cout<<*retorno; 

black_flowers:
va a ser más complejo que todo eso, he estado provando con otra función que no sea suma por ejemplo:

extern "C" __declspec(dllexport) int valor(int *v)
{
    return *v;
}

extern "C" __declspec(dllexport) int doce()
{
    return 12;
}

la función "valor" devuelve el valor que se le pasa como parámetro y la función "doce" devuelve un 12.
al llamar a la función doce de esta forma:
retorno=ProcAdd(L"");
en retorno tengo el valor 12 con lo cual es correcto.

pero al llamar a la función valor de esta forma:
retorno=ProcAdd(L"b");
en retorno obtengo un 98 que es el código ascii del caracter "b".

conclusión el problema está en el paso de parámetros, que se los estoy pasando como cadena de caracteres.
La solución sería pasarselos como enteros pero no podría ser de la forma que me has indicado tú, de manera literal; osea:
retorno=ProcAdd(L"b");

black_flowers:
he encontrado una solución que funciona, en lugar de declarar el puntero a la funcion como "MYPROC" , que por cierto ni siquiera sé lo que es, lo hago así:

#include "windows.h"
#include <iostream>
using namespace std;

void main()
{  
   int retorno;
   int a =1;
   int b=2;

    HINSTANCE hinstLib;
    int (*MyFunc)(int,int);

    hinstLib = LoadLibrary(TEXT("dll_cpp_otra_forma.dll"));              
    MyFunc=(int(*)(int,int))GetProcAddress(hinstLib, "suma");

    retorno=MyFunc(a,b);
    cout<<retorno;
    system("pause");
    FreeLibrary(hinstLib);

}

y la dll es esta:

#include <stdio.h>
#include <windows.h>

 BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                )
{
   switch (ul_reason_for_call)
   {
   case DLL_PROCESS_ATTACH:
   case DLL_THREAD_ATTACH:
   case DLL_THREAD_DETACH:
   case DLL_PROCESS_DETACH:
      break;
   }
   return TRUE;
}


extern "C" __declspec(dllexport) int suma(int s1,int s2)
{
   return s1+s2;
}



gracias m0skit0 un saludo! :beer:

Eternal Idol:
GetProcAddress devuelve la direccion de memoria de la funcion (o 0) es decir un puntero a la funcion, despues la funcion puede ser como ella quiera en cuanto a sus parametros y tipo de retorno. Ese MYPROC es un typedef simplemente para simplificar ... fijate bien en el codigo y vas a ver que podes reemplazarlo con un MYPROC correspondiente (que tenga los parametros y el tipo de retorno de la funcion en cuestion, no podes usar un solo MYPROC para cualquier funcion).

Navegación

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa