• Viernes 8 de Noviembre de 2024, 20:54

Autor Tema:  cómo se accede a una funcion de una dll mediante GetProcAddr  (Leído 2393 veces)

black_flowers

  • Miembro activo
  • **
  • Mensajes: 40
    • Ver Perfil
cómo se accede a una funcion de una dll mediante GetProcAddr
« en: Jueves 18 de Noviembre de 2010, 19:16 »
0
hola, estoy intentando acceder dinamicamente a una dll, y tengo este codigo:

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

typedef int (__cdecl *MYPROC)(LPWSTR);

void main()
{    int,a=1;intb=1;int c;
   HINSTANCE hinstLib;
    MYPROC ProcAdd;
   hinstLib = LoadLibrary(TEXT("dll_cpp_otra_forma.dll"));            
    ProcAdd = (MYPROC) GetProcAddress(hinstLib, "suma");
     if (!ProcAdd)
     {cout<<"chungo";}
     else
     {cout<<"guay";}
    // c= ProcAdd(a,b);
    system("pause");
}


y el problema es que no se cómo acceder a la función a la que apunta ProcAdd. Todo funciona bien excepto la llamada ala función que no sé cómohacerla.
La función "suma" está definida así enla dll:

#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;
}

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: cómo se accede a una funcion de una dll mediante GetProcAddr
« Respuesta #1 en: Jueves 18 de Noviembre de 2010, 19:56 »
0
En este caso asi:
Código: C++
  1. ProcAdd(L"Parametro");
  2.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

black_flowers

  • Miembro activo
  • **
  • Mensajes: 40
    • Ver Perfil
Re: cómo se accede a una funcion de una dll mediante GetProcAddr
« Respuesta #2 en: Viernes 19 de Noviembre de 2010, 19:30 »
0
Cita de: "Eternal Idol"
En este caso asi:
Código: C++
  1. ProcAdd(L"Parametro");
  2.  
ok, ahora me acepta los parametros pero todavía no conseguí obtener la salida, utilicé esta instrucción pero lo que recojo es la dirección de la función, al menos eso creo porque no me cuadra el resultado y además el ProcAdd es un puntero.

      retorno=ProcAdd(L"a,b");
      cout<<retorno;


y me da un error al compilar que pone: "too many arguments for call"

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: cómo se accede a una funcion de una dll mediante GetProcAddr
« Respuesta #3 en: Sábado 20 de Noviembre de 2010, 11:53 »
0
Cita de: "black_flowers"
"too many arguments for call"
Hombre, creo que el error es explicativo por sí mismo: "demasiados argumentos para la llamada". Eso quiere decir que estás pasando más parámetros de los que admite la función.

black_flowers

  • Miembro activo
  • **
  • Mensajes: 40
    • Ver Perfil
Re: cómo se accede a una funcion de una dll mediante GetProcAddr
« Respuesta #4 en: Sábado 20 de Noviembre de 2010, 12:06 »
0
perdón , he debido tener un lapsus, el error no es ese para nada. El error es el siguiente: cuando yo llamo a la función de esta manera (que es la correcta porque compila bien)

      int retorno;
      retorno=ProcAdd(L"a,b");
      cout<<retorno;

lo que obtengo en "retorno" es un número que no se corresponde para nada con la suma de "a" y "b"  (que son dos valores enteros), no se si es que las está tratando como caracteres o es que lo que obtengo en "retorno" es la dirección de la función, ya que ProcAdd es un puntero.

he probado así:
 retorno=(*ProcAdd)(L"a,b");
 retorno=(int)(*ProcAdd)(L"a,b");

y me dá un número de 8 cifras,lo cual parece una dirección.Además el valor que devuelve es distinto cada vez que la ejecuto.
« última modificación: Sábado 20 de Noviembre de 2010, 12:13 por black_flowers »

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: cómo se accede a una funcion de una dll mediante GetProcAddr
« Respuesta #5 en: Sábado 20 de Noviembre de 2010, 12:10 »
0
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++
  1. int* retorno;
  2. retorno=ProcAdd(L"a,b");
  3. cout<<*retorno;
  4.  

black_flowers

  • Miembro activo
  • **
  • Mensajes: 40
    • Ver Perfil
Re: cómo se accede a una funcion de una dll mediante GetProcAddr
« Respuesta #6 en: Sábado 20 de Noviembre de 2010, 12:49 »
0
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

  • Miembro activo
  • **
  • Mensajes: 40
    • Ver Perfil
Re: cómo se accede a una funcion de una dll mediante GetProcAddr
« Respuesta #7 en: Sábado 20 de Noviembre de 2010, 13:35 »
0
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

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: cómo se accede a una funcion de una dll mediante GetProcAddr
« Respuesta #8 en: Sábado 20 de Noviembre de 2010, 13:50 »
0
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).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.