Programación General > C/C++

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

(1/2) > >>

black_flowers:
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:
En este caso asi:

--- Código: C++ ---ProcAdd(L"Parametro");  

black_flowers:

--- Cita de: "Eternal Idol" ---En este caso asi:

--- Código: C++ ---ProcAdd(L"Parametro");  
--- Fin de la cita ---
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:

--- Cita de: "black_flowers" ---"too many arguments for call"
--- Fin de la cita ---
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:
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.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa