Discussão do artigo "Eliminação de DLLs autogeradas"

 

Novo artigo Eliminação de DLLs autogeradas foi publicado:

Se a linguagem MQL5 funcional não é suficiente para o cumprimento de tarefas, um programador MQL5 tem que usar ferramentas adicionais. Ele \ ela tem que passar para outra linguagem de programação e criar uma DLL intermediária. O MQL5 tenha a possibilidade de apresentar vários tipos de dados e transferí-los à API mas, infelizmente o MQL5 não pode resolver a questão levando em consideração a extração de dados do ponteiro aceito. Neste artigo vamos pontuar todos os "i"s e mostrar mecanismos simples de transferência e trabalho tipos complexos de dados.

Exemplo de cópia de 4 bytes com o uso de memcpy

Autor: o_O

[Excluído]  
Obrigado pelo artigo. Pergunta: ao usar a função memcpy, no exemplo, escrevemos o endereço em int. Se o sistema for x64, devemos usar uma variável long? Como podemos descobrir programaticamente qual é o sistema (x64, x86)? Obrigado.
 

Quanto à questão do long - você pode, mas não é necessário, se usar o int como receptor de 4 bytes de algo assim a partir de uma matriz de caracteres. (ou seja, você passa exatamente pelo ponteiro &).

Como descobrir - aqui você pode http://forum.ixbt.com/topic.cgi?id=26:37968

 
sergeev:

Quanto à questão do long, você pode, mas não é necessário, se usar o int como receptor de 4 bytes de algo parecido a partir de uma matriz de caracteres. (ou seja, você passa exatamente pelo ponteiro &).

Como descobrir - aqui pode ser http://forum.ixbt.com/topic.cgi?id=26:37968

Você pode esclarecer algo sobre o tempo de troca nessa estrutura (por exemplo, para 10 números do formato Int)?
 
shelandr:
Você pode esclarecer algo sobre o tempo de troca nessa estrutura (por exemplo, para 10 números de formato Int)?

Esclareça a pergunta.

Você está perguntando sobre a velocidade do memcpy? Acho que essa é uma pergunta criativa relacionada mais ao trabalho de uma biblioteca wind do que ao mql.

 
Artigo muito útil e informativo sobre como trabalhar com APIs de DLL externas. Muito obrigado.
 

Boa tarde. Apesar do fato de o artigo ter sido escrito há relativamente muito tempo, a questão da troca de dados com dlls de biblioteca ainda é relevante. Recentemente, eu mesmo me deparei com a necessidade de implementar uma determinada funcionalidade e tive uma escolha: escrever minha própria dll ou ainda tentar usar dlls de biblioteca. Optei pela segunda opção e, naturalmente, enfrentei a dificuldade de transferir estruturas e obter dados de volta. Depois de ler este artigo, não entendi muito bem alguns dos pontos, que, em minha opinião, são muito complicados. Nesse artigo, ao transferir uma estrutura para um ambiente externo, é sugerido o uso de uma matriz como uma área de memória alocada na qual a função da biblioteca colocará o resultado e que precisaremos converter para o trabalho posterior. Tenho muito pouca experiência nessa área e talvez meu raciocínio pareça amador, mas mesmo assim expressarei minha opinião na esperança de que pessoas inteligentes me corrijam. Vamos considerar um exemplo simples mencionado em um artigo antigo https://www.mql5.com/pt/articles/1543.

Esse artigo trata da questão da pesquisa de arquivos por meio de dlls de biblioteca. Ele também sugere passar um ponteiro para uma matriz do tamanho necessário e, em seguida, extrair os dados necessários dessa matriz.

O que é uma estrutura? É a mesma seção de memória. Agora vamos tentar mudar a abordagem para passar estruturas e recuperar dados:

// Declare as definições de tipo de dados

#define  DWORD int
#define  TCHAR short // Definir esse tipo, pois trabalharemos com unicode
#define  MAX_PATH (260)

// Declare a estrutura FILETIME
struct FILETIME {
  DWORD dwLowDateTime;
  DWORD dwHighDateTime; 
};

// Declarar a estrutura de dados dos resultados da pesquisa
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]; 
};

// Ao declarar os tipos de dados, copiamos as estruturas WinAPI sem nenhuma alteração
// Importar função de biblioteca
#import "kernel32.dll"
   int  FindFirstFileW(string path, _WIN32_FIND_DATA& answer);
#import 
//+------------------------------------------------------------------+
//| Função de inicialização de especialista|
//+------------------------------------------------------------------+
int OnInit()
  {
// Criar uma variável com o tipo da estrutura criada anteriormente 
   _WIN32_FIND_DATA data;
// Chame a função da biblioteca, passando um ponteiro para nossa estrutura e, de fato, para a memória alocada 
int handle = FindFirstFileW(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Experts\\*.mq5", data);
   if(handle!=-1)
      {
        // Visualize o resultado da pesquisa acessando os campos de nossa estrutura sem conversão adicional 
Print("Nome do arquivo encontrado: ", ShortArrayToString(data.cFileName));   
         Print("Nome do arquivo temporário encontrado: ", ShortArrayToString(data.cAlternateFileName));
         Print("Tamanho do arquivo encontrado: ", data.nFileSizeLow); 
      }
//---
   return(INIT_SUCCEEDED);
  }
//+-
Групповые файловые операции
Групповые файловые операции
  • 2008.07.15
  • MetaQuotes Software Corp.
  • www.mql5.com
Иногда требуется проделать одинаковые операции для некоторой группы файлов. Если у вас есть список файлов, входящих в эту группу, то это не проблема. Но если этот список нужно получить самостоятельно, то возникает вопрос: "Каким образом?" В статье предлагается сделать это с помощью функций FindFirstFile() и FindNextFile(), входящих в библиотеку kernel32.dll.
 
Алексей Барбашин: Há também uma sugestão para passar um ponteiro para uma matriz do tamanho necessário e, em seguida, extrair os dados necessários dessa matriz. Eles também sugerem passar um ponteiro para uma matriz do tamanho necessário e, em seguida, extrair os dados necessários dessa matriz.

Em essência, o que é uma estrutura? É a mesma seção de memória. Agora vamos tentar mudar a abordagem para passar estruturas e recuperar dados:

Colei seu código corretamente no editor

 
Rashid Umarov:

Colei seu código corretamente no editor


Muito obrigado! Ainda não descobri como formatar o código corretamente aqui. (((

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

Muito obrigado! Eu ainda não descobri como codificar corretamente aqui. (((


Como inserir o código.

 
Vladimir Karputov:

Como inserir o código.


Obrigado! Vou dar uma olhada nisso! )))