Discusión sobre el artículo "Guía para escribir un DLL para MQL en Delphi" - página 2

 
marketeer:
Deberías añadir al menos un párrafo sobre depuración. El artículo menciona una situación en la que puede ocurrir AV, pero incluso dejando de lado el mar de otras fuentes potenciales de exeptsiones, intentar buscar manualmente (a ojo o mentalmente) la localización del error puede llevar mucho tiempo y sin éxito.

Gracias por tu comentario. Creo que esta sección puede ampliarse para incluir los errores más populares. Sin embargo, para evitar buscar errores "durante mucho tiempo y sin éxito", hazlo todo como está escrito en el artículo. Los ejemplos que aparecen en él son factibles. ¡Además, utilice el depurador en MetaEditor, es bastante decente, con depuración paso a paso y puntos de interrupción!

En este artículo, no quiero enseñar a nadie a programar. Si alguien comete errores elementales y luego grita en voz alta, , tal vez no debería crear sus propias DLLs todavía y empezar a aprender la parte del tapete.

 

Hola HideYourRichess.

¡Qué rápido eres! ¡Has escrito mucho! Deberías escribir tus propios artículos sobre Delphi.

Intentaré contestar brevemente y en orden:

1. Юниты SysUtils и Classes нужно было оставить в проекте.

¡SysUtils están en el proyecto! ¡Las clases no tienen nada que hacer! El manejador de excepciones además de SysUtils está implementado en System, que está conectado por defecto, así que no veo razón para preocuparse.

2. No deberías usar todo tipo de procedimientos dentro de DllEntryPoint (aka DllMain).

El ejemplo de DllEntryPoint está en internet en cada esquina. Es una forma estándar de crear eventos DLL, a los que, por ejemplo, puedes vincular la asignación y liberación de memoria del heap. Si tienes errores reales con este método de trabajo con la memoria, estoy dispuesto a considerarlo.

No discuto sobre todo lo demás que no se puede hacer en DllEntryPoint, porque no lo uso a menudo.

3. Has escrito mucho sobre el gestor de memoria. Sólo destacaré tu conclusión:

Así que puedes hacer que la DLL y la aplicación tengan un único gestor de memoria, y será el gestor de memoria de MT4.

El problema es que ninguno de nosotros sabemos como funciona el gestor de memoria de MT5(MT4). Y aunque supiéramos los nombres de las funciones que implementan este gestor, ¡cómo vas a usarlo, porque la API para MT5está cerrada! Así que la idea de un único gestor y DLL para MT5 es una utopía.

Para no confundir a los lectores, sugiero en su lugar utilizar la técnica clásica de manejo de memoria implementada en las funciones de laAPI . Se describe en el artículo en la sección de trabajar con cadenas.

Cuento con que en lugar de citar aquí libros y artículos de Delphi, se darán al autor del artículo afirmaciones sólo en relación con lo que realmente no funciona de lo que se describe en el artículo. Preferiblemente con ejemplos.


 
avoitenko :

Gracias por su comentario. Creo que esta sección puede ampliarse para incluir los errores más populares. Sin embargo, para evitar buscar errores "larga e infructuosamente", hazlo todo como está escrito en el artículo. Los ejemplos que aparecen en él son factibles. ¡Además, utilice el depurador en MetaEditor, es bastante decente, con depuración paso a paso y puntos de interrupción!

En este artículo, no quiero enseñar a nadie a programar. Si alguien comete errores elementales y luego grita en voz alta, , tal vez no debería crear sus propias DLLs todavía y empezar a aprender la parte del tapete.

Por desgracia, estás muy equivocado. No sólo los que están aprendiendo a programar cometen errores -tanto elementales como no tan elementales- sino también los programadores expertos.

Esto no tiene nada que ver con las matemáticas, sino con las herramientas de depuración. Recordemos la conocida estadística "80 por 20": el 80% del tiempo se dedica a depurar y sólo el 20% a escribir código. Por lo que tengo entendido, el objetivo del artículo es enseñar a escribir una DLL viable, es decir, no sólo el ejemplo concreto que se da, sino también otro código hipotético. Por supuesto, es imposible considerar todos los errores potenciales, pero necesitamos información sobre cómo detectarlos en principio. De lo contrario, los lectores no podrán hacer otra cosa que reproducir el ejemplo.

MetaEditor tampoco tiene nada que ver con esto, porque estamos hablando de depurar DLL, es decir, sus partes internas.

Usted es el autor - usted sabe mejor. Yo sólo he expresado mi opinión sobre algunas cosas incompletas en la presentación.

 
"¡Qué rápido eres! ¡Has escrito tanto! Deberías escribir tus propios artículos sobre Delphi".

Estos son extractos de un viejo artículo sobre dlls para mt4, inacabado. Acabo de copiar los extractos aquí. No es difícil y no es largo.

"¡Las SysUtils están en el proyecto! ¡Las clases no tienen nada que ver! El manejador de excepciones además de SysUtils está implementado en System que está conectado por defecto, así que no veo razón para preocuparse. "

Depende del propietario qué unidades incluir. Pero creo que es necesario especificar por qué. En este caso, SysUtils y Classes son las recomendadas por borland. Y hay razones para ello.

"El ejemplo con DllEntryPoint se da en Internet en cada esquina. Es una forma estándar de crear eventos DLL, a los que, por ejemplo,"

Borland no escondió DllMain de manos traviesas por accidente. La forma estándar de crear una DLL en Delphi es con un DllMain oculto. Piensa por qué esto es así. Y lee lo que recomienda la propia Microsoft

"Puedes enlazar la asignación y liberación de memoria desde el heap. Si tienes errores reales con este método de trabajar con memoria, estoy dispuesto a considerarlo."

Eso es cosa tuya. Pero mi recomendación es que no se haga nada en DllMain en absoluto.

"El problema es que ninguno de nosotros sabe cómo funciona el gestor de memoria en MT5(MT4). Y aunque supiéramos los nombres de las funciones que implementan este gestor, ¡cómo vas a usarlo, porque la API para MT5está cerrada! Así que la idea de un único gestor y DLL para MT5 es una utopía".

;-) para alguien es "cerrado" y "utopia" - y para otro "todo funciona". estamos hablando del 4. no he mirado el 5.

 

Cabe mencionar que existe una alternativa al uso de Delphi.

Si aún no eres usuario de Delphi deberías considerar usar Lazarus/FPC, es de código abierto, tiene casi las mismas características que Delphi (e incluso algunas más), es compatible en gran medida con el código fuente de Delphi e incluso apostaría a que todos los ejemplos anteriores compilan en Lazarus sin ninguna modificación.

Si prefieres el código abierto al software propietario (que es algo que deberías hacer de todos modos) entonces Lazarus es lo que estás buscando y no una versión comercial de prueba de Delphi.

 

En el artículo hay un procedimiento de este tipo:

//----------------------------------------------------------+
procedure DLLEntryPoint(dwReason: DWord); // controlador de eventos
//----------------------------------------------------------+
begin
    case dwReason of

      DLL_PROCESS_ATTACH: // DLL se adjunta al proceso;
          // asignación de memoria
          Buffer:=AllocMem(BUFFER_SIZE);

      DLL_PROCESS_DETACH: // DLL se desconecta del proceso;
          // liberar memoria
          FreeMem(Buffer);

    end;
end;

El compilador me pregunta qué es la variable no declarada BUFFER_SIZE.

Por favor, ¿podríais decirme cuál debería ser realmente y dónde debería declararse y de qué buffer se trata?

 
lucka88:

El compilador me pregunta qué es la variable no declarada BUFFER_SIZE.

¿Podríais decirme qué es lo que debería haber y dónde debería declararse y de qué buffer estamos hablando?

En el fichero de proyecto dll_mql5.dpr hay la siguiente declaración

const BUFFER_SIZE = 255;

Por una línea de código

Buffer:=AllocMem(BUFFER_SIZE);

la memoria para almacenar la cadena se asigna en el heap.

Y el propio puntero del Buffer se utiliza en la función GetStringBuffer, que demuestra el trabajo con cadenas.

 

DLL ayuda

¿Puede alguien ayudar a guiarme .. ¿Podemos utilizar MT4 archivo DLL en MT5 y si sí ... ¿dónde se instill en MT5 y cualquier otra cosa que necesito saber.

Tambien en que carpeta guardamos el archivo DLL.

Ya no tengo el codigo de la DLL asi que no puedo reescribirlo.

Cualquier sugerencia y ayuda será apreciada.

 

Al conectar el Asesor Experto en MT5 obtengo el error "dll is not 64-bit version".

¿Hay alguna forma de utilizar una dll de 32 bits?

Si no, ¿alguien puede decirme cómo compilar una dll de 64 bits en Delphi XE?

 
meneo:

¿cómo compilar 64it dll en Delphi XE?

El soporte para 64 bits apareció en Delphi XE2 y Lazarus.