[C con Clase] carga retrasada de una dll

AntonioFrancisco Gimenez antoniof.gimenez en gmail.com
Lun Abr 9 20:15:56 CEST 2007


a ver eso ya lo he probao y todo lo que sea sin referenciar en el linker el
.lib no funciona entonces el tema es sin referenciarlo siguiendo un metodo
parecido a ese pero al hacer GetProcAddress me retornaba siempre
nulo eso usando simplemente punteros a una funcion declarada de la forma:

float __declspec(dllexport) suma(float a,float b) ;

a continuación incluyo el código de la carga dinamica de la dll:

                 hlibrary=LoadLibrary("dll.dll") ;
                if (!hlibrary)MessageBox(hwnd,"error cargar","error
cargar",MB_OK);
                ptrfnsuma=(PFNSUMA) GetProcAddress(hlibrary,"suma") ;
                if (ptrfnsuma==NULL) MessageBox(hwnd,"error","error",MB_OK);
                ptrfnsuma(2,3);
                FreeLibrary(hlibrary);

el tipo PFNSUMA lo declaro como:

typedef float __stdcall (WINAPI* PFNSUMA)(float,float) ;

al ejecutar el código de la carga dinamica todo va bien hasta que llamo a
GetProcAddress que compruebo si me devuelve el puntero nulo y asi es, ya ab
urrido de dar vueltas buscando el porque sin saber porque me fallaba lei que
existia una forma de carga de dlls llamada carga retrasada o delay load que
se le expecifica al linker y el programa carga la dll solo si se accede a un
recurso que asi lo requiera que es justo lo que quiero hacer venia un
ejemplo para ms visual c++ decia que se supone que todos los linker tienen
opciones parecidas, he encontrado tb indicaciones de esto en el msdn on
line y por eso he hecho tal pregunta en este foro, que es donde me nutro de
información acerca del compilador mingw(devcpp), aunque si me explicas
porque no me funciona lo del GetProcAddress perfecto pues tambien me sirve.

Saludos

El día 9/04/07, Programante <programante en gmail.com> escribió:
>
> AntonioFrancisco Gimenez escribió:
> > hola alguien me podria comentar como se le expecifica al linker del
> > devcpp que deseo cargar un dll de forma retrasada??
> >
> > Saludos
> ¿Enlazar de forma retrasada? Que yo sepa eso no existe en el formato PE.
> Creo que lo que quieres es cargar la dll de forma dinámica.
>
> Puedes hacer:
> HINSTANCE dll = LoadLibrary("Retrasada.dll")
> int (*Suma) (int, int) = GetProcAddress(dll, "Funcion1");
> cout << Funcion1(7, 4);
>
> Hasta que no se ejecute esa parte, Retrasada.dll no se carga.
>
> Podrías afinarlo aún más, haciendo "stubs", para que llamarlas en lugar
> de a las de la librería y que comprueben si está cargada la dll, en caso
> contrario la carguen y pasen el control a la función homónima de la dll.
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20070409/c4d30826/attachment.html>


Más información sobre la lista de distribución Cconclase