| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
builder Invitado
|
Publicado: Lun 27 Ene, 2003 9:35 pm Asunto: Usar una DLL dinámicamente |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 28 Ene, 2003 12:48 am Asunto: |
|
|
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 |
|
 |
builder Invitado
|
Publicado: Mar 28 Ene, 2003 1:57 am Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 28 Ene, 2003 2:00 am Asunto: |
|
|
| 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 |
|
 |
zerokull Cdt

Registrado: 10 Sep 2009Mensajes: 9
|
Publicado: Mie 05 Oct, 2011 11:05 am Asunto: |
|
|
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 |
|
 |
|