Diskussion zum Artikel "Eine DLL für MQL5 in 10 Minuten (Teil II): Erstellen mit Visual Studio 2017"
Vielleicht wird es für jemanden nützlich sein, in letzter Zeit habe ich es so gemacht:
Es ist möglich (und sogar einfacher), die CodeLight IDE zu verwenden. Im Vergleich zu Studio, ist es schnell und weniger "gierig", es akzeptiert verschiedene Compiler, einschließlich Microsoft's.
Um die seltsame, aber DLL mit gcc ist einfacher gebaut. In den Einstellungen des DLL-Projekts geben Sie die notwendige Tulchain an (gcc32 bit für MT4, gcc64 für MT5). Und das ist alles. Optional den Befehl "DLL in MT-Hierarchie kopieren" zu PostBuild hinzufügen
Keine Fummelei mit *.def ist unnötig, def wird automatisch generiert, wenn nötig. Übrigens, DllMain ist überhaupt nicht nötig, man kann es wegwerfen :-) Um genauer zu sein, manchmal wird es benötigt, aber sehr selten und es ist jenseits der Bedürfnisse von MT-Bibliotheken.
Ein weiterer Punkt, der in dem Artikel nicht behandelt wird, aber sehr gefragt ist.
Wenn C++, dann sollte es vielleicht Klassen geben, und zwar auf beiden Seiten, sowohl in Mql als auch in C++.
"Eine C++-Klasse in Mql ziehen".
1. Schreiben Sie eine Klasse (oder nehmen Sie eine vorgefertigte) :-)
erhalten Sie etwas wie dieses :
#ifndef MQLPLUG_H #define MQLPLUG_H 1 #include "mql45.h" /** Beispiel für eine Klasse, die in MT "gezogen" wird **/ class Plug { public: Plug(); ~Plug(); mql_int OnInit(); void OnDeinit(mql_int); mql_int Sum(mql_int,mql_int); mql_double Median(MqlRates *rate); }; /* Da C++-Methoden nicht durch die DLL "gezogen" werden können, sondern nur C-Funktionen , werden einfache Funktionen, die den Aufruf an das Objekt delegieren, */ erstellt. MQL_API(Plug *) Plug_New(); MQL_API(void) Plug_Delete(Plug *); MQL_API(mql_int) Plug_OnInit(Plug *); MQL_API(void) Plug_OnDeinit(Plug *,mql_int); MQL_API(mql_int) Plug_Sum(Plug *,mql_int,mql_int); MQL_API(mql_double) Plug_Median(Plug *,MqlRates *rate); #endif
2. Die Implementierung von "Funktionsdelegaten" ist trivial - das erste Argument ist ein Zeiger auf ein Objekt, innerhalb der Funktion sollten wir seine Korrektheit überprüfen, eine Methode aufrufen und Ausnahmen abfangen.
/// MqlPlug.cpp #include "MqlPlug.h" /*** Wrapper-Funktionen der Plug-Klassen-Methoden erhalten alle (außer _New) einen Zeiger auf Objekt als erstes Argument. Andere Argumente sind die gleichen wie bei der Methode .Wenn der übergebene Zeiger korrekt ist (nicht nullptr), wird die Methode aufgerufen und gleichzeitig werden alle Ausnahmen ***/ abgefangen. /// Konstrukteur MQL_API(Plug *) Plug_New() { try { return new Plug; } catch (...) { } return nullptr; } /// destruktor MQL_API(void) Plug_Delete(Plug *plug) { try { delete plug; } catch (...) { } } // andere Methoden MQL_API(mql_int) Plug_Sum(Plug *plug,mql_int one,mql_int two) { try { if (plug) return plug->Sum(one,two); } catch (...) { } return 0; } // и так далее
3. und schließlich Mql ! In den Importrichtlinien beschreiben Sie functions-delegates, und schreiben eine Klasse, die ein einziges Feld obj hat - einen Handler (Zeiger auf) das Objekt, und Methoden, die Delegates aufrufen.
#ifdef __MQL4__ // bei 4k ist der Deskriptor (Zeiger) 32 Bit) #define HANDLE int #else // für eine 5 - 64 #define HANDLE long #endif #import "Mql4Plug.dll" HANDLE Plug_New(void); void Plug_Delete(HANDLE); int Plug_OnInit(HANDLE); void Plug_OnDeinit(HANDLE,const int reason); int Plug_Sum(HANDLE,int,int); double Plug_Median(HANDLE,MqlRates &); #import class Plug { public: HANDLE obj; Plug() { obj = Plug_New(); } ~Plug() { Plug_Delete(obj); } int OnInit() { if (obj != NULL) { return Plug_OnInit(obj); } return INIT_FAILED; } void OnDeinit(const int reason) { if (obj != NULL) { Plug_OnDeinit(obj,reason); } } int Sum(int one,int two) { if (obj != NULL) { return Plug_Sum(obj,one,two); } return 0; } double Median(MqlRates &rates) { if (obj!=NULL) { return Plug_Median(obj,rates); } return EMPTY_VALUE; } };
PS/ Einmal wurde eine solche Anfrage gestellt und ich habe ehrlich versucht, sie zu erklären. Aber entweder war ich kein sehr guter Lehrer oder mein Vis-à-Vis in Sachen Programmierung war nicht sehr gut :-)) Aber die beliebten Beispiele sind geblieben - also teile ich sie
Guten Abend. Ich werde versuchen, alles sofort zu beantworten.
...
Es ist nicht nötig, mit *.def herumzufummeln, def wird automatisch generiert, wenn es nötig ist. Übrigens, DllMain ist überhaupt nicht nötig, du kannst es wegwerfen :-) Um genauer zu sein, manchmal wird es benötigt, aber sehr selten und es ist jenseits der Bedürfnisse von MT-Bibliotheken.
In diesem Artikel geht es nicht darum, wie man eine Definitionsdatei erzeugt, ob es möglich ist oder nicht, welches Tool man dafür verwenden sollte. Der Artikel spricht darüber, wofür sie benötigt wird, wofür sie in VS verwendet werden kann und was dabei herauskommt. Und wie man es macht, womit und wann, das spielt keine Rolle.
Über DllMain. Theoretisch hast du recht. Ja, man kann auf diese Funktion verzichten. Ich kenne Tools, bei denen DllMain nicht aufgerufen wird, selbst wenn sie vorhanden ist. Aber ich bin mit Ihrer kategorischen Schlussfolgerung, dass sie "jenseits der Grenze" ist, überhaupt nicht einverstanden. Ich bin überzeugt, dass eine solche Schlussfolgerung vom Entwickler selbst gezogen werden sollte, da er für das Ergebnis verantwortlich ist. Wenn er es braucht, kann er etwas in DllMain aufrufen. Wenn er das nicht will, kann er eine separate exportierbare Funktion schreiben. Ich persönlich fühle mich nicht kompetent genug, ihm diese zusätzliche Funktion so einfach vorzuenthalten.
Ein weiterer Punkt - nicht im Artikel behandelt, aber auf Nachfrage.
Wenn C++, dann sollte es vielleicht Klassen auf beiden Seiten geben, sowohl in Mql als auch in C++.
"Eine C++-Klasse in Mql ziehen".
Es ist absolut nicht notwendig, dass es einen Klassenexport gibt. )) Vielen Dank für die Erwähnung dieser Funktion und besonderen Dank für das Beispiel. Mir persönlich wäre es nicht in den Sinn gekommen, so etwas zu tun, und noch weniger, Anfängern eine solche Technik zu empfehlen. Sehen Sie sich die Künstlichkeit dieses Codes und seine Irrationalität an. Und welche Notwendigkeit kann einen Entwickler dazu bringen, Zeiger auf so seltsame Weise zu behandeln. Mit anderen Worten, wenn dieser Code nicht abstürzt, ist er als theoretisches Beispiel interessant, aber aus praktischer Sicht - kaum) Ich will mehr sagen, meiner Meinung nach, wenn ein Entwickler einen solchen Export benötigt, hat er höchstwahrscheinlich einen Fehler beim Design gemacht. Außerdem möchte ich Ihre Aufmerksamkeit auf die Tatsache lenken, dass etwa die Hälfte des Artikels Strukturen gewidmet ist, und diese sind "fast Klassen". Es lohnt sich, hier aufzuhören und nicht in die Fußstapfen einiger unserer Kollegen aus dem Forum zu treten, die am liebsten alles C++17 in MQL stecken würden )).
Ich will nicht mit Ihnen streiten ;-)
nur ein paar Notizen, die mir in den Sinn kamen, vielleicht findet jemand sie nützlich.
ohne dem Artikel widersprechen zu wollen
welche Art von"Programmieranfängern" gibt es an der Kreuzung zweier Sprachen ?
PS/ Übrigens, du hast ein langes Gedächtnis :-)
Ich streite mich nicht mit Ihnen ;-)
Also - ein paar Notizen, an die ich mich erinnert habe, vielleicht ist es für jemanden nützlich.
Vielen Dank, es wird nützlich sein.
aber leider sind solche guten Beispiele sehr oft in Forenthemen, es ist sehr schwierig, sie zu finden, leider, ich versündige mich )))).
Wenn Sie nicht faul sind, sollten Sie solche hervorragenden Beispiele in Ihren Blog stellen, zumindest besteht eine gewisse Wahrscheinlichkeit, dass Sie sie schneller finden, aber es ist auch keine Tatsache (((( - MQL hat erstaunliche Möglichkeiten, aber manchmal ist es schneller, es selbst zu googeln und ein fertiges Beispiel zu finden... Übrigens, dieses Forum wird von Google sehr gut indiziert, fast alle Anfragen zum Thema neuronale Netze führen zu MQL-Artikeln ;)
Ich streite mich nicht mit Ihnen ;-)
so - einige Notizen, die ich erinnerte, vielleicht wird es nützlich sein, jemand.
ohne mit dem Artikel zu argumentieren
Welche Art von"Programmieranfängern" gibt es an der Schnittstelle zwischen zwei Sprachen?
PS/ Übrigens, Sie haben da eine Menge Speicherplatz.
Was hat es mit dem Speicher auf sich, habe ich mich irgendwo vertan?
Anfängerprogrammierer ist ein dehnbarer Begriff ) Ich bin definitiv ein Anfänger in Python ) Oder in Java Script. Und viele andere Dinge, in denen ich mich als Anfänger bezeichnen kann. Auch hier stellt sich die Frage, wie es ist, wenn jemand noch nie Bibliotheken erstellt hat, sich aber seit zwanzig Jahren mit CAD beschäftigt oder Plugins für Adobe-Programme schreibt? Natürlich ist er ein Anfänger auf einem neuen Gebiet, aber erfahren auf seinem alten. Wie auch immer, es ist alles in Ordnung, diese Terminologie ist hier nicht so wichtig.
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Neuer Artikel Eine DLL für MQL5 in 10 Minuten (Teil II): Erstellen mit Visual Studio 2017:
Der ursprüngliche Basisartikel hat seine Relevanz nicht verloren. Daher, wenn Sie an diesem Thema interessiert sind, sollten Sie unbedingt den ersten Artikel lesen. Es ist viel Zeit seitdem vergangen, und Visual Studio 2017 verfügt mittlerweile über eine aktualisierte Oberfläche. Auch der MetaTrader 5 hat neue Funktionen erhalten. Der Artikel enthält eine Beschreibung der Phasen der DLL-Projektentwicklung sowie das Einrichten und Interagieren mit dem MetaTrader 5.
Erstellen einer einfachen DLL
Der gesamte Prozess wurde bereits im Originalartikel beschrieben. Nun werden wir ihn unter Berücksichtigung von Software-Updates und -Änderungen wiederholen.
Öffnen Sie Visual Studio 2017 und navigieren Sie zu File -> New -> Project. Erweitern Sie im linken Teil des neuen Projektfensters die Liste Visual C++ und wählen Sie Windows Desktop aus. Wählen Sie die Zeile Windows Desktop Wizard im mittleren Teil aus. Mit Hilfe von Eingabefeldern im unteren Teil können Sie den Projektnamen bearbeiten (es ist ratsam, einen eigenen aussagekräftigen Namen zu vergeben) und den Projektstandort festlegen (es wird empfohlen, ihn wie vorgeschlagen zu behalten). Klicken Sie auf OK und fahren Sie mit dem nächsten Fenster fort:
Wählen Sie Dynamic Link Library (.dll) aus der Dropdown-Liste und aktivieren Sie "Export Symbols". Das Überprüfen dieses Elements ist optional, aber Anfängern wird empfohlen, dies zu tun. In diesem Fall wird den Projektdateien ein Demo-Code hinzugefügt. Dieser Code kann eingesehen und dann gelöscht oder kommentiert werden. Mit einem Klick auf "OK" werden Projektdateien erstellt, die dann bearbeitet werden können. Allerdings müssen wir zunächst die Projekteinstellungen berücksichtigen. Erstens, denken Sie daran, dass MetaTrader 5 nur mit 64-Bit-Bibliotheken funktioniert. Wenn Sie versuchen, eine 32-Bit-DLL zu verbinden, erhalten Sie die folgenden Meldungen:
'E:\...\MQL5\Libraries\Project2.dll' is not 64-bit version
Cannot load 'E:\MetaTrader 5\MQL5\Libraries\Project2.dll' [193]
Daher können Sie solche Bibliothek nicht verwenden.
Autor: Andrei Novichkov