Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Usar una DLL dinámicamente

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Usar una DLL dinámicamente Responder citando

Leo una libreria DLL con LoadLibrary, bien, luego al intentar coger la direccion de la funcion que tengo en la DLL con GetProcAdd me devuelve NULL indicando que no encontro la funcion especificada. ¿Que habre hecho mal? ¿Alguien sabe como definir las funciones en la DLL para que sean encontradas? ¿Y en el EXE?

Thanks
Volver arriba
Mensaje    Asunto: Responder citando

En la dll:
Código:
extern "C" __declspec(dllexport) int __stdcall Funcion(int x)
{
    return x;
}

En el ejecutable:
Código:
typedef int (__stdcall *PFuncion)(int);
PFuncion Funcion;
HINSTANCE hLib = LoadLibrary("tu_dll.dll");
if (hLib)
{
    Funcion = reinterpret_cast<PFuncion>(GetProcAddress(hLib, "Funcion"));

    // Comprobamos si no se ha cargado
    if (!Funcion)
        throw Exception("No se pudo cargar la function");

    // Probamos la funcion
    int x = Funcion(130);

    FreeLibrary(hLib);
}

También puedes usar TDUMP.EXE en línea de comandos del siguiente modo para comprobar con que nombre se han exportado las funciones:
Código:
TDUMP -ee tu_dll.dll
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Si ese es un codigo parecido al que yo tengo, el problema es que para saber que nombre de funcion hay que poner hay que mirarlo en el fichero DEF, se puede sacar el DEF poniendo en la línea de comandos: implib nombre.def nombre.dll
normalmente el unico cambio que produce el linkador es que si tenias como nombre "funcion", en la dll aparece como "@funcion$qv"
Volver arriba
Mensaje    Asunto: Responder citando

Efectivamente, así es cuando no usas extern "C" en la declaración. Y esa "decoración" del nombre no es estándar, cada fabricante la hace como quiere. Mientras que usando lo anterior en la declaración el nombre no se "decora".
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

hola buenos dias ante todo haber como me explico estoy empezado a realizar programas metiendo las funciones dentro de una libreria he realizado el enlace estatico y me funciona correctametne mi problema surge cuando realizo el enlace dinamico , el codigo de mi dll es el siguiente

CODIGO:
#include <windows>
#include <stdio>
#include <stdlib>
#include <vcl>
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
//---------------------------------------------------------------------------
extern "C" __declspec(dllexport) int __stdcall cable()
{
int suma;
suma=2+3;
return suma;
}

y el codigo del programa es el siguiente:

CODIGO:

typedef int (__stdcall *PFuncion)(int);
PFuncion Funcion;
HINSTANCE hLib = LoadLibrary("libreria.dll");
if (hLib)
{
Funcion = reinterpret_cast<PFuncion>(GetProcAddress(hLib, "cable"));

// Comprobamos si no se ha cargado
if (!Funcion)
throw Exception("No se pudo cargar la function");

// Probamos la funcion
int x = Funcion(0);

FreeLibrary(hLib);
}


el problema me surge que a la hora de compilar el proyecto me sale el siguiente error:

Cannot convert 'char const[13]' to 'const wchar_t *'

que pertenece a la siguiente linea de codigo :


HINSTANCE hLib = LoadLibrary("libreria.dll");

segun los ejemplos que he en contrado en el foro deberia de ser correcto pero no se que estare haciendo mal o que me pueda faltar

gracias y un saludo de antemano.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.