Gracias infos muy útiles.
Versión para imprimir
Gracias infos muy útiles.
porque esto puede crear bucles de dependencia en el orden de carga de DLL. En este caso simple (mi enlace python) este problema no puede surgir. Pero es cierto que se necesita precaución y solo se hacen cosas simples y autocontenidas dentro de DllMain () porque, en última instancia, es el sistema operativo el que llama a esta función y no es fácil confiar en el orden exacto en que se llaman. En situaciones complejas o en qué momentos se llaman exactamente.Cita:
Iniciado por ;
[quote = M_j; 4969179] hola, una pequeña pregunta: es el DllMain de BOOL Apientry algo parecido a lo que hiciste en ti Pascal dll. con código PHP: <code> <span style = ???color: # 000000???> <span style = ???color: # 0000BB???> inicialización
PyStatus </span> <span style = ???color: # 007700???> : = </span> <span style = ???color: # 0000BB???> 0 </span> <span style = ???color: # 007700???>;
</span> <span style = ???color: # 0000BB ???> LoadPyDll </span> <span style =??? color: # 007700 ???> ();
</span> <span style =??? color: # 0000BB ???> finalization
UnloadPyDll </span > <span style = ???color: # 007700???> ();
</span> <span style = ???color: # 0000BB???> end </span> <span style = ???color: # 007700???> .
</span> <span style = ???color: # 0000BB???> </span> </span> </code> Sí, se llama desde exactamente esa función. El binario compilado siempre contendrá automáticamente el código de la biblioteca de tiempo de ejecución que siempre se necesita y una parte de este código es una función DllMain (bastante cumplida y flexible) que hace muchas cosas automáticamente (inicializardesinicializar la administración del montón, manejo de excepciones, Thread almacenamiento local, etc.), cosas que tendría que hacer manualmente en C. Hay algunos lugares donde puede conectarse a todo esto de una manera similar a la de Pascal, uno de estos lugares (existen algunos más) es la inicialización y finalización de las secciones. Se les llama desde dentro del DllMain (). aquí en la línea 27 está la función RTL que manejará la mayor parte de la llamada DllMain () (no se llama directamente DllMain (), todavía hay un poco más de magia de compilación envuelta alrededor de ella)
http://svn.freepascal.org/cgi-bin/vi...nc?view=markupLas secciones de inicialización y finalización se llaman desde algún lugar dentro de los procedimientos de PascalMain y FPC_Do_Exit que se llaman allí. Como puede ver, hay algunos lugares más posibles para conectarse asignando ciertas variables de procedimiento que se llaman allí. Todo esto es realmente material incondicional dentro de la biblioteca de tiempo de ejecución que solo debe ser entendido por los que piratean el compilador y la propia RTL. Si descarga estas fuentes e intenta seguir todas estas llamadas para ver lo que está pasando (o pasar a través de él con el depurador) encontrará que en realidad está bastante cumplido y hay muchas cosas que suceden bajo el capó para hacer que El programa Pascal idéntico (o biblioteca) se compila y ejecuta tan fácilmente en una amplia gama de arquitecturas y sistemas operativos. Los usuarios normales (programadores) solo usan las secciones de inicialización y finalización (si las necesitan o las dejan alejadas) (y tal vez algunas de las otras funciones de enlace como están documentadas) y no se preocupen por todo esto y todo debería funcionar. Pero aún es interesante ver este código y al menos intentar entenderlo (hasta ahora solo he entendido partes de él, pero no soy uno de los piratas informáticos del compilador, por lo que no necesito saber todo).
Cargar DLL en DllMain es una muy mala idea: http://msdn.microsoft.com/en-us/library/ms682583(v=VS.85).aspxCita:
Iniciado por ;
hola, 7 bits, una pequeña pregunta: es el Apollismo Dll de BOOL. Es algo similar a lo que hiciste en ti Pascal dll. con código PHP: <code> <span style = ???color: # 000000???> <span style = ???color: # 0000BB???> inicialización
PyStatus </span> <span style = ???color: # 007700???> : = </span> <span style = ???color: # 0000BB???> 0 </span> <span style = ???color: # 007700???>;
</span> <span style = ???color: # 0000BB ???> LoadPyDll </span> <span style =??? color: # 007700 ???> ();
</span> <span style =??? color: # 0000BB ???> finalization
UnloadPyDll </span > <span style = ???color: # 007700???> ();
</span> <span style = ???color: # 0000BB???> end </span> <span style = ???color: # 007700???> .
</span> <span style = ???color: # 0000BB???> </span> </span> </code> entraría en el BOOL Apientry DllMain si lo escribiera en C , de ser así, ¿cómo que parecen: Código PHP: <code> <span style = ???color: # 000000???> <span style = ???color: # 0000BB???> </span> <span style = ???color: # FF8000???>/ -------------------------------------------------- ----------------
/||
/ ------------------ ------------------------------------------------ < br> </span> <span style = ???color: # 0000BB???> BOOLAPIENTRYDllMain </span> <span style = ???color: # 007700???> (</span> <span style = ???color: # 0000BB???> HANDLEhModule </span> <span style = ???color: # 007700???>, </span> <span style = ???color: # 0000BB???> DWORDul_reason_for_call </span> <span style = ???color: # 007700???>,span> <span style = ???color: # 0000BB???> LPVOIDlpReserved </span> <span style = ???color: # 007700???>)
{
</span> <span style = ???color : # FF8000 ???>/----
</span> <span style =??? color: # 007700 ???> switch (</span> <span style =??? color: # 0000BB ???> ul_reason_for_call </span> <span style =??? color: # 007700 ???>)
{
case </span> <span style =??? color: # 0000BB ???> DLL_PROCESS_ATTACH <span> <span style = ???color: # 007700???>:
</span> <span style = ???color: # 0000BB???> PyStatus </span> <span style = ???color: # 007700???> = </span> <span style = ???color: # 0000BB???> 0 </span> <span style = ???color: # 007700???>;
</span> <span style = ???color: # 0000BB ???> LoadPyDll </span> <span style =??? color: # 007700 ???> ();
caso </span> <span style =??? color: # 0000BB ???> DLL_THREAD_ATTACH </span> <span style = ???color: # 007700???>:
estuche </span> <span style = ???color: # 0000BB???> DLL_THREAD_DETACH </span> <span style = ???color: # 007700???>: br> case </span> <span style = ???color: # 0000BB???> DLL_PROCESS_DETACH </span> <span style = ???color: # 007700???>:
</span> <span style = ???color : # 0000BB ???> UnloadPyDll </span> <span style =??? color: # 007700 ???> ();
break;
}
</span> <span style = ???Color: # FF8000???>/----
</span> <abarcan el estilo = ???Color: # 007700???> return (</span> <span style = ???color: # 0000BB???> TRUE </span> <span style = ???color: # 007700???>);
}
</span> <span style = ???color: # 0000BB???> </span> </span> </code> o uno pondría eso con DLL_THREAD_ATTACH, DLL_THREAD_DETACH
Muchas gracias 7bit. Muy amable de su parte.
Solo lo necesita si necesita conectarse a la cargadescarga, etc. De lo contrario, todo lo que hace es devolver el valor verdadero (lo que significa éxito) y la misma función vacía vacía (que solo devuelve el éxito y no hace nada más) debe instalarse automáticamente el compiladorenlazador cuando no lo declaras tú mismo.
Rango de gracias limitado. Pero diría que es aconsejable usar algo como el ejemplo de MT4 en la mayoría de los casos. O simplemente déjelo como una serie de otras dlls mt4.
Windows siempre llama a la función APIENTRY (si existe una), cada vez que se cargadescarga una DLL, y se puede usar para asignarliberar memoria y ejecutar rutinas de configuración. Dado que se proporciona un contexto adecuado código puede ser implementado. Esto puede ser útil para administrar recursos DLL internos cuando una DLL es utilizada muchas veces por una aplicación EG por múltiples indicadores o por múltiples EA. Lea aquí para más información
http://support.microsoft.com/kb/815065
Hola;
Solo una pequeña pregunta: miré un buen número de archivos de origen MT4 dll y noté que algunos usan: BOOL APIENTRY DllMain mientras que otros no.
(por ejemplo, expertos en MT4 oficialesmuestrasDLLSample
Código PHP: <code> <span style = ???color: # 000000???> <span style = ???color: # 0000BB???> </span> <span style = ???color: # FF8000???>/ ---- -------------------------------------------------- ------------
/||
/ ---------------------- --------------------------------------------
<span> <span style = ???color: # 0000BB???> BOOLAPIENTRYDllMain </span> <span style = ???color: # 007700???> (</span> <span style = ???color: # 0000BB???> HANDLEhModule </span > <span style = ???color: # 007700???>, </span> <span style = ???color: # 0000BB???> DWORDul_reason_for_call </span> <span style = ???color: # 007700???>, </span> < span style = ???color: # 0000BB???> LPVOIDlpReserved </span> <span style = ???color: # 007700???>)
{
</span> <span style = ???color: # FF8000??? >/----
</span> <span style = ???color: # 007700???> switch (</span> <span style = ???color: # 0000BB???> ul_reason_for_call </span> <span style = ???color: # 007700???>)
{
caso </span> <span style = ???color: # 0000BB???> DLL_PROCESS_ATTACH </span> <span style = ???color: # 00 7700 ???>:
caso </span> <span style =??? color: # 0000BB ???> DLL_THREAD_ATTACH </span> <span style =??? color: # 007700 ???>:
caso </span> <span style = ???color: # 0000BB???> DLL_THREAD_DETACH </span> <span style = ???color: # 007700???>:
case </span> <span style = ???color: # 0000BB???> DLL_PROCESS_DETACH <span> <span style = ???color: # 007700???>:
break;
}
</span> <span style = ???color: # FF8000???>/--- -
</span> <span style = ???color: # 007700???> return (</span> <span style = ???color: # 0000BB???> TRUE </span> <span style = ???color: # 007700 ???>);
}
</span> <span style =??? color: # 0000BB ???> </span> </span> </code> Mi pregunta: ¿hay alguna regla general? ¿Que tal como la muestra de MTF debería incluirse por defecto?