<html>
<head>
<style>
P
{
margin:0px;
padding:0px
}
body
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body><BR>he mirao en el devcpp, que es compilador que uso, y en parametros del linker en las propiedades del proyecto ya esta el parametro  --add-stdcall-alias  y como te digo da el error asi que no se porque cascará así.<BR>
 <BR>
respecto al delay load he encontrado una pista que es cuestion de investigar sobre lo siguiente:<BR>
<SPAN>#pragma comment(lib, "DelayImp.lib")</SPAN><BR>#pragma comment(linker, "/DelayLoad:Dll.Dll")<BR>#pragma comment(linker, "/Delay:unload")<BR><BR>en devcpp se que en lugar de .lib son .a asi que me gustaria saber como se adaptaria esto a devcpp, <BR>
 <BR>
saludos<BR><BR>

<HR id=stopSpelling>
<BR>
> Date: Mon, 9 Apr 2007 21:43:14 +0200<BR>> To: cconclase@listas.conclase.net<BR>> From: programante@gmail.com<BR>> Subject: Re: [C con Clase] carga retrasada de una dll<BR>> <BR>> AntonioFrancisco Gimenez escribió:<BR>> > a ver eso ya lo he probao y todo lo que sea sin referenciar en el <BR>> > linker el .lib no funciona entonces el tema es sin referenciarlo <BR>> > siguiendo un metodo parecido a ese pero al hacer GetProcAddress me <BR>> > retornaba siempre nulo eso usando simplemente punteros a una funcion <BR>> > declarada de la forma:<BR>> > <BR>> > float __declspec(dllexport) suma(float a,float b) ;<BR>> > <BR>> > a continuación incluyo el código de la carga dinamica de la dll:<BR>> > <BR>> > hlibrary=LoadLibrary("dll.dll") ;<BR>> > if (!hlibrary)MessageBox(hwnd,"error cargar","error <BR>> > cargar",MB_OK);<BR>> > ptrfnsuma=(PFNSUMA) GetProcAddress(hlibrary,"suma") ;<BR>> > if (ptrfnsuma==NULL) <BR>> > MessageBox(hwnd,"error","error",MB_OK);<BR>> > ptrfnsuma(2,3);<BR>> > FreeLibrary(hlibrary);<BR>> > <BR>> > el tipo PFNSUMA lo declaro como:<BR>> > <BR>> > typedef float __stdcall (WINAPI* PFNSUMA)(float,float) ;<BR>> En principio el código parece correcto. Tras los MessageBox deberías <BR>> salir de la función y te olvidas de que tu función retorne el valor de <BR>> ptrfnsuma (que supongo estará declarado como PFNSUMA).<BR>> <BR>> > al ejecutar el código de la carga dinamica todo va bien hasta que <BR>> > llamo a GetProcAddress que compruebo si me devuelve el puntero nulo y <BR>> > asi es<BR>> Preveo que la función que exportas no se llama suma. No es sólo <BR>> diferenciar suma de Suma y SUMA, sino que probablemente sea suma@8 Esto <BR>> es así para diferenciar el tipo de convención de llamada y que no se <BR>> pueda enlazar sin querer con otra. En stdcall es nombre@<tamaño <BR>> parámetros>, en la convención C se les antepone un prefijo, etc.<BR>> <BR>> Si la librería está compilada como C++ la cosa puede ser aún peor, <BR>> puesto que el nombre se decora (name mangling) para que contenga <BR>> información sobre los parámetros, y para colmo el decorado es diferente <BR>> para cada compilador. Así que podrías tener wqapsuma@8<BR>> <BR>> Normalmente nos interesará que se exporte como suma, pero por defecto <BR>> los compiladores adornarán el nombre exportado. ¿Cómo saber el nombre <BR>> *real* de la función?<BR>> Mencionas que tienes Visual C++, entre las utilidades hay una que es <BR>> dumpbin que nos permite saber precisamente eso:<BR>> dumpbin /exports retrasada.dll<BR>> nos dará todas las funciones que exporta. Y ahora sí, con el nombre de <BR>> verdad.<BR>> <BR>> Si el problema es ese, tienes dos formas de solucionarlo:<BR>> -El fácil: Cambiar tu código de GetProcAddress, para que llame a <BR>> "wqapsuma@8"<BR>> -El más complicado: Compilar la biblioteca para que la función se <BR>> exporte como 'suma'. Normalmente tendremos que realizar un archivo .dep <BR>> donde indicaremos el nombre real, el deseado, y el ordinal a indicarle. <BR>> Aunque algunos compiladores tienen opciones más rápidas, como <BR>> --add-stdcall-alias en los GNU (pasárselo de parámetro al linker), que <BR>> produce las funciones también sin el @...<BR>> <BR>> > ya ab urrido de dar vueltas buscando el porque sin saber porque me <BR>> > fallaba lei que existia una forma de carga de dlls llamada carga <BR>> > retrasada o delay load que se le expecifica al linker y el programa <BR>> > carga la dll solo si se accede a un recurso que asi lo requiera que es <BR>> > justo lo que quiero hacer venia un ejemplo para ms visual c++ decia <BR>> > que se supone que todos los linker tienen opciones parecidas, he <BR>> > encontrado tb indicaciones de esto en el msdn on line y por eso he <BR>> > hecho tal pregunta en este foro, que es donde me nutro de información <BR>> > acerca del compilador mingw(devcpp), aunque si me explicas porque no <BR>> > me funciona lo del GetProcAddress perfecto pues tambien me sirve.<BR>> > <BR>> > Saludos<BR>> Miraré sobre el delay load.<BR>> <BR>> Saludos<BR>> <BR>> _______________________________________________<BR>> Lista de correo Cconclase Cconclase@listas.conclase.net<BR>> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net<BR>> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ<BR><BR><br /><hr />Busca desde cualquier página Web con una protección excepcional. Consigue la Barra de herramientas de Windows Live hoy mismo y GRATUITAMENTE. <a href='http://www.toolbar.live.com' target='_new'>Pruébalo</a></body>
</html>