Discusión sobre el artículo "Cómo deshacerse del lastre de las DLL caseras"

 

Artículo publicado Cómo deshacerse del lastre de las DLL caseras:

Si a un programador de MQL5 no le basta con la funcional del lenguaje, entonces deberá recurrir a instrumentos adicionales. Para ello debrá usar otro lenguaje de programación y crear un DLL intermedio. En MQL5 existe un mecanismo de representación de diversos tipos de datos, con ayuda de estructuras y su transmisión a API, pero por desgracia, el MQL5 no responde a la cuestión de cómo extraer los datos del índice adoptado. En este artículo vamos a poner punto final a esta cuestión, mostrando mecanismos sencillos de intercambio de tipos complejos de datos y cómo trabajar con ellos.

Estructura de representación del resultado a una solicitud en la memoria

Autor: o_O

[Eliminado]  
Gracias por el artículo, pregunta: al usar la función memcpy, en el ejemplo escribimos la dirección en int, si el sistema es x64, ¿debemos usar variable long? ¿Cómo podemos averiguar programáticamente qué sistema (x64, x86)? Gracias.
 

sobre la cuestión de long - se puede, pero no es necesario en absoluto, si se utiliza int como un receptor de 4 bytes de algo así de una matriz de caracteres. (es decir, pasas exactamente por el puntero &).

cómo averiguarlo - aquí puedes http://forum.ixbt.com/topic.cgi?id=26:37968

 
sergeev:

sobre la cuestión de long - se puede, pero no es necesario en absoluto, si se utiliza int como un receptor de 4 bytes de algo así de una matriz de caracteres. (es decir, usted pasa exactamente por el puntero &).

Cómo averiguarlo - aquí puede ser http://forum.ixbt.com/topic.cgi?id=26:37968

¿Puedes aclarar algo sobre el tiempo de intercambio en esta estructura (por ejemplo, para 10 números de formato Int)?
 
shelandr:
¿Puede aclarar algo sobre el tiempo de intercambio en esta estructura (por ejemplo, para 10 números de formato Int)?

aclara la pregunta.

¿preguntas por la velocidad de memcpy? creo que es una pregunta creativa relacionada más con el trabajo de una librería eólica que con mql.

 
Artículo muy útil e informativo sobre el trabajo con APIs DLL externas. Muchas gracias.
 

Buenas tardes. A pesar de que el artículo fue escrito hace relativamente mucho tiempo, el tema del intercambio de datos con dlls de librerías sigue siendo relevante. Yo mismo me enfrenté hace poco a la necesidad de implementar una determinada funcionalidad y tuve que elegir: escribir mi propia dll o seguir intentando utilizar dlls de librerías. Opté por esta última opción y, naturalmente, me encontré con la dificultad de transferir estructuras y recuperar datos. Después de leer este artículo no entendí bien algunos de los puntos, que en mi opinión son muy complicados. En este artículo, cuando se transfiere una estructura a un entorno externo, se sugiere utilizar un array como área de memoria asignada en la que la función de biblioteca pondrá el resultado y que necesitamos convertir para seguir trabajando. Tengo muy poca experiencia en este campo y quizá mi razonamiento parezca de aficionado, pero aun así expresaré mi opinión con la esperanza de que personas inteligentes me corrijan. Consideremos un ejemplo sencillo mencionado en un viejo artículo https://www.mql5.com/es/articles/1543.

Ese artículo trata el tema de la búsqueda de archivos mediante dlls de bibliotecas. También sugiere pasar un puntero a una matriz del tamaño requerido y luego extraer los datos requeridos de esta matriz.

¿Qué es una estructura? Es la misma sección de memoria. Ahora vamos a intentar cambiar el enfoque de pasar estructuras y recuperar datos:

// Declarar tipo de datos define

#define  DWORD int
#define  TCHAR short // Establece este tipo, ya que trabajaremos con unicode
#define  MAX_PATH (260)

// Declarar la estructura FILETIME
struct FILETIME {
  DWORD dwLowDateTime;
  DWORD dwHighDateTime; 
};

// Declarar la estructura de datos de los resultados de búsqueda
struct _WIN32_FIND_DATA {
  DWORD dwFileAttributes;
  FILETIME ftCreationTime;
  FILETIME ftLastAccessTime;
  FILETIME ftLastWriteTime;
  DWORD nFileSizeHigh;
  DWORD nFileSizeLow;
  DWORD dwReserved0;
  DWORD dwReserved1;
  TCHAR cFileName[MAX_PATH];
  TCHAR cAlternateFileName[14]; 
};

// Al declarar los tipos de datos copiamos las estructuras WinAPI sin ningún cambio
// Importar función de biblioteca
#import "kernel32.dll"
   int  FindFirstFileW(string path, _WIN32_FIND_DATA& answer);
#import 
//+------------------------------------------------------------------+
//| Función de inicialización experta|
//+------------------------------------------------------------------+
int OnInit()
  {
// Crear una variable con el tipo de la estructura creada anteriormente 
   _WIN32_FIND_DATA data;
// Llama a la función de la librería, pasando un puntero a nuestra estructura, y de hecho a la memoria asignada 
int handle = FindFirstFileW(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Experts\\*.mq5", data);
   if(handle!=-1)
      {
        // Ver el resultado de la búsqueda accediendo a los campos de nuestra estructura sin conversión adicional 
Print("Nombre de archivo encontrado: ", ShortArrayToString(data.cFileName));   
         Print("Nombre de archivo encontrado temporalmente: ", ShortArrayToString(data.cAlternateFileName));
         Print("Tamaño de archivo encontrado: ", data.nFileSizeLow); 
      }
//---
   return(INIT_SUCCEEDED);
  }
//+-
Групповые файловые операции
Групповые файловые операции
  • 2008.07.15
  • MetaQuotes Software Corp.
  • www.mql5.com
Иногда требуется проделать одинаковые операции для некоторой группы файлов. Если у вас есть список файлов, входящих в эту группу, то это не проблема. Но если этот список нужно получить самостоятельно, то возникает вопрос: "Каким образом?" В статье предлагается сделать это с помощью функций FindFirstFile() и FindNextFile(), входящих в библиотеку kernel32.dll.
 
Алексей Барбашин: También se sugiere pasar un puntero a un array del tamaño requerido y luego extraer los datos requeridos de este array. También sugieren pasar un puntero a un array del tamaño requerido y luego extraer los datos requeridos de este array.

¿Qué es una estructura en esencia? Es la misma sección de memoria. Ahora vamos a tratar de cambiar el enfoque de pasar estructuras y recuperar datos:

He pegado tu código correctamente a través del editor

 
Rashid Umarov:

He pegado tu código correctamente a través del editor


Muchas gracias. Todavía no he descubierto cómo formatear el código correctamente aquí. (((

 
Алексей Барбашин:

Muchas gracias. Todavía no he descubierto cómo codificar correctamente aquí. (((


Cómo insertar el código.

 
Vladimir Karputov:

Cómo insertar el código.


Gracias. ¡Voy a mirar en él! )))