Diskussion zum Artikel "Den Ballast selbstgemachter "dynamischer Programmbibliotheken" loswerden"

 

Neuer Artikel Den Ballast selbstgemachter "dynamischer Programmbibliotheken" loswerden :

Wenn der Funktionsumfang der Programmiersprache MQL5 zur Erfüllung bestimmter Aufgaben nicht ausreicht, muss sich ein MQL5-Programmierer weiterer Hilfsmittel bedienen. Ein Weg besteht im Wechsel zu einer anderen Programmiersprache und dem Anlegen einer zwischengelagerten dynamischen Programmbibliothek (DLL). MQL5 bietet die Möglichkeit, unterschiedliche Datenarten abzubilden und sie an eine Programmierschnittstelle (API) weiterzugeben, leider ist MQL5 jedoch nicht in der Lage, das Problem des Auszugs von Daten aus einer zugelassenen Speicheradresse zu lösen. In diesem Beitrag wollen wir auf jedes „i“ einen Punkt setzen und einige einfache Mechanismen für den Austausch und die Arbeit mit komplexen Datenarten vorstellen.

Wie funktioniert das?

In der Abbildung 1 werden die ungefähren Größen einiger Datenarten im Vergleich zueinander dargestellt.

Die Größen unterschiedlicher Datenarten in MQL5


Der Zweck der Funktion Memcpy besteht darin, Daten aus einem Speicherbereich in einen anderen zu kopieren.
In Abbildung 2 ist der Kopiervorgang für vier Bytes zu sehen.

Beispiel für das Kopieren von 4 Bytes mittels memcpy

Autor: o_O

[Gelöscht]  
Vielen Dank für den Artikel, Frage: bei der Verwendung von memcpy Funktion, in dem Beispiel schrieben wir die Adresse in int, wenn das System x64 ist, sollten wir lange Variable verwenden? Wie können wir programmatisch herausfinden, welches System (x64, x86)? Vielen Dank!
 

auf die Frage der langen - Sie können, aber es ist überhaupt nicht notwendig, wenn Sie int als 4-Byte-Empfänger von etwas wie das aus einem Array von Zeichen verwenden. (d.h. man übergibt genau durch den &-Zeiger).

wie man das herausfindet - hier kann man http://forum.ixbt.com/topic.cgi?id=26:37968

 
sergeev:

auf die Frage der langen - Sie können, aber es ist überhaupt nicht notwendig, wenn Sie int als 4-Byte-Empfänger von etwas wie das aus einem Array von Zeichen verwenden. (d.h. man übergibt genau durch den &-Zeiger).

Wie man das herausfindet - hier kann es http://forum.ixbt.com/topic.cgi?id=26:37968 sein.

Können Sie etwas zur Austauschzeit in dieser Struktur sagen (z.B. für 10 Zahlen im Int-Format)?
 
shelandr:
Können Sie etwas zur Austauschzeit in dieser Struktur sagen (z. B. für 10 Zahlen im Format Int)?

Klären Sie die Frage.

Fragen Sie nach der Geschwindigkeit von memcpy? Ich denke, dies ist eine kreative Frage, die mehr mit der Arbeit einer Windbibliothek als mit mql zu tun hat.

 
Sehr nützlicher und informativer Artikel über die Arbeit mit externen DLL-APIs. Ich danke Ihnen so sehr.
 

Guten Tag! Obwohl der Artikel schon vor relativ langer Zeit geschrieben wurde, ist die Frage des Datenaustauschs mit Bibliotheks-DLLs immer noch aktuell. Ich selbst stand vor kurzem vor der Notwendigkeit, eine bestimmte Funktionalität zu implementieren und hatte die Wahl: meine eigene DLL zu schreiben oder weiterhin Bibliotheks-DLs zu verwenden. Ich entschied mich für Letzteres und sah mich natürlich mit der Schwierigkeit konfrontiert, Strukturen zu übertragen und Daten zurückzubekommen. Nach der Lektüre dieses Artikels habe ich einige der Punkte, die meiner Meinung nach sehr kompliziert sind, nicht ganz begriffen. In diesem Artikel wird vorgeschlagen, bei der Übertragung einer Struktur an eine externe Umgebung ein Array als zugewiesenen Speicherbereich zu verwenden, in dem die Bibliotheksfunktion das Ergebnis ablegt und den wir für die weitere Arbeit konvertieren müssen. Ich habe nur sehr wenig Erfahrung auf diesem Gebiet, und vielleicht erscheint meine Argumentation laienhaft, aber ich werde trotzdem meine Meinung äußern, in der Hoffnung, dass kluge Leute mich korrigieren werden. Betrachten wir ein einfaches Beispiel, das in einem alten Artikel https://www.mql5.com/de/articles/1543 erwähnt wird.

In diesem Artikel geht es um die Suche nach Dateien mit Hilfe von Bibliotheks-DLLs. Er schlägt auch vor, einen Zeiger auf ein Array mit der gewünschten Größe zu übergeben und dann die gewünschten Daten aus diesem Array zu extrahieren.

Was ist eine Struktur? Es handelt sich um denselben Speicherbereich. Versuchen wir nun, den Ansatz für die Übergabe von Strukturen und das Abrufen von Daten zu ändern:

// Datentyp-Definitionen deklarieren

#define  DWORD int
#define  TCHAR short // Legen Sie diesen Typ fest, da wir mit Unicode arbeiten werden
#define  MAX_PATH (260)

// Deklarieren Sie die FILETIME-Struktur
struct FILETIME {
  DWORD dwLowDateTime;
  DWORD dwHighDateTime; 
};

// Deklarieren Sie die Datenstruktur der Suchergebnisse
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]; 
};

// Durch die Deklaration von Datentypen kopieren wir WinAPI-Strukturen ohne jegliche Änderungen
// Bibliotheksfunktion importieren
#import "kernel32.dll"
   int  FindFirstFileW(string path, _WIN32_FIND_DATA& answer);
#import 
//+------------------------------------------------------------------+
//| Experteninitialisierungsfunktion|
//+------------------------------------------------------------------+
int OnInit()
  {
// Erstellen einer Variablen mit dem Typ der zuvor erstellten Struktur 
   _WIN32_FIND_DATA data;
// Aufruf der Bibliotheksfunktion mit Übergabe eines Zeigers auf unsere Struktur und tatsächlich auf den zugewiesenen Speicher 
int handle = FindFirstFileW(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Experts\\*.mq5", data);
   if(handle!=-1)
      {
        // Anzeige des Suchergebnisses durch Zugriff auf die Felder unserer Struktur ohne zusätzliche Konvertierung 
Print("Dateiname gefunden: ", ShortArrayToString(data.cFileName));   
         Print("Name der temporär gefundenen Datei: ", ShortArrayToString(data.cAlternateFileName));
         Print("Gefundene Dateigröße: ", data.nFileSizeLow); 
      }
//---
   return(INIT_SUCCEEDED);
  }
//+-
Групповые файловые операции
Групповые файловые операции
  • 2008.07.15
  • MetaQuotes Software Corp.
  • www.mql5.com
Иногда требуется проделать одинаковые операции для некоторой группы файлов. Если у вас есть список файлов, входящих в эту группу, то это не проблема. Но если этот список нужно получить самостоятельно, то возникает вопрос: "Каким образом?" В статье предлагается сделать это с помощью функций FindFirstFile() и FindNextFile(), входящих в библиотеку kernel32.dll.
 
Алексей Барбашин: Es wird auch vorgeschlagen, einen Zeiger auf ein Array mit der gewünschten Größe zu übergeben und dann die gewünschten Daten aus diesem Array zu extrahieren. Es wird auch vorgeschlagen, einen Zeiger auf ein Array der erforderlichen Größe zu übergeben und dann die erforderlichen Daten aus diesem Array zu extrahieren.

Was ist eine Struktur im Grunde genommen? Es ist derselbe Speicherbereich. Lassen Sie uns nun versuchen, den Ansatz für die Übergabe von Strukturen und das Abrufen von Daten zu ändern:

Ich habe Ihren Code korrekt in den Editor eingefügt

 
Rashid Umarov:

Habe Ihren Code korrekt in den Editor eingefügt


Herzlichen Dank! Ich habe noch nicht herausgefunden, wie ich den Code hier richtig formatieren kann. (((

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

Ich danke Ihnen vielmals! Ich habe noch nicht herausgefunden, wie man hier richtig codiert. (((


Wie man den Code einfügt.

 
Vladimir Karputov:

Wie man den Code einfügt.


Ich danke Ihnen! Ich werde es mir ansehen! )))