Diskussion über "Wie man eine DLL für MQL5 schreibt und Daten in 10 Minuten austauscht". - Seite 10

 

Das ist ja das Problem, das Skript bricht einfach ab, wie kann ich den Fehlercode danach sehen? Oder kann sie bei der nächsten Ausführung sofort gelesen werden?

Im Prinzip wurde das Problem durch Kompilieren der DLL für 64x gelöst. Obwohl, danach bekam ich mehr Fehler, aber es ist nicht wichtig. Ich brauchte nur zu verstehen, wie zu bauen und Link-Bibliotheken für c/s++ zu mql5 im Allgemeinen. Mein Beispiel funktioniert jetzt einwandfrei.

 
Wird es eine Aktualisierung des Artikels geben? Hat sich der Betrieb von dll geändert?
 

Wenn Sie Studio 2017 haben und diese Anleitung für Ihr altes Studio ansehen und nicht wissen, was Sie tun sollen oder wie Sie es tun sollen, empfehle ich Ihnen, zuerst diesen Artikel zu lesen: https://docs.microsoft.com/ru-ru/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=vs-2017

Dann, wenn Sie Ihre DLL nach dem Beispiel aus diesem Artikel erstellt und auf einer Client-Anwendung getestet haben, lesen Sie diese Anweisung, beginnend mit Punkt 2, "In MQL5-Programm sollte es wie folgt beschrieben und aufgerufen werden:". Mit anderen Worten: Deklarieren Sie Ihre DLL in mt5 so, wie sie dort beschrieben ist.

Ich habe mein Problem auf diese Weise gelöst.

 

Ich hätte gerne eine Liste von Typkorrelationen zwischen C++ und MQL in Form von Makros.

#define  MQL_STRING wchar_t
 
@Renat Fatkhullin, ich brauche ein Beispiel dafür, wie man die Größe von Arrays und Strings in der DLL ändert. Sollte es durch realloc() getan werden oder können die übergebenen Daten nicht freigegeben werden, sondern nur den Zeiger auf ein neues Datenfeld ändern?
 

Hier ist mein Code in Visual Studio 2012 C++. Datei main. mit cpp-Erweiterung (main.cpp)

#define  MT4_EXPFUNC __declspec(dllexport) создал макрос чтобы не писать запись __declspec(dllexport)int __stdcall add(int a=0, int b=0)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)и так пробовал тоже
MT4_EXPFUNC int __cdecl add(int a=0, int b=0)//stdcall данная примитивная функция ничего не делает а просто возвращает значение 18
{return (18);пробовал так return 18;}

Dann habe ich eine Datei mit der Haupterweiterung def (main.def) erstellt, die eine Listeder exportierten Funktionenenthält, der Code sieht wie folgt aus:

LIBRARY "dllmt42"
EXPORTS
add

Dann habe ich es in den Compiler importiert

#import "dllmt42.dll"
int _add(int a=0, int b=0);
#import

Keine Probleme nach der Kompilierung, aber wenn Sie den EA auf dem Diagramm zu verlassen, bekomme ich verwirrt

Unaufgelöster Importfunktionsaufruf, Suche nach '_add' in 'dllmt42.dll'. Total Comander sieht beim Ziehen der Datei sowohl die Funktion als auch den Compiler selbst

Wer kann helfen, wie das Problem mit dem Fehler zu lösen ist, immerhin gibt es eine Datei mit der Endung .def, die den korrekten Export von Funktionen speichert und dafür zuständig ist?


 
Seric29:

Hier ist mein Code in C++ Visual Studio 2012. Die Datei main. mit der Erweiterung cpp (main.cpp)

Dann habe ich eine Datei mit der Haupterweiterung def (main.def) erstellt, die eine Listeder exportierten Funktionenenthält, der Code sieht wie folgt aus:

Dann habe ich es in den Compiler importiert

Keine Probleme nach der Kompilierung, aber wenn Sie den EA auf dem Diagramm zu verlassen, bekomme ich verwirrt

Unaufgelöster Importfunktionsaufruf, Suche nach '_add' in 'dllmt42.dll'. Total Comander sieht beim Ziehen der Datei sowohl die Funktion als auch den Compiler selbst

Wer kann helfen, wie das Problem mit dem Fehler zu lösen ist, schließlich gibt es eine Datei mit der Endung .def, die Funktionen speichert und für den korrekten Export zuständig ist?


extern "C" sollte sowohl zu den Deklarationen als auch zu den Implementierungen der exportierten Funktionen hinzugefügt werden, da dies C++ ist. Andernfalls sind die Eingabesignaturen "plus" und MT (sowie alle anderen) sehen sie nicht.

 
Maxim Kuznetsov:

extern "C" muss sowohl in den Deklarationen als auch in den Implementierungen der exportierten Funktionen hinzugefügt werden, da es sich um C++ handelt. Andernfalls sind die Eingabesignaturen "plus" und MT (wie alle anderen) kann sie nicht sehen.

Ich habe sie auf diese Weise hinzugefügt

#define  MT4_EXPFUNC extern "C" __declspec(dllexport)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)
MT4_EXPFUNC int __cdecl add(int a=0, int b=0)//stdcall
{
    return (18);
}

Aber immer noch das Gleiche -nicht aufgelöster Importfunktionsaufruf, Suche nach '_add' in 'dllmt42.dll'... D.h. ich brauche reines C ohne ++?

 
Die .def-Datei ist überhaupt nicht erforderlich. Sie müssen die Funktionen im Abschnitt #import in MQL duplizieren
 
Roffild:
Die .def-Datei ist überhaupt nicht erforderlich. Sie müssen die Funktionen im Abschnitt #import in MQL duplizieren

Nun, ja, und ohne dass ich es gesehen habe und so, ich gehe nicht, na ja, zeigen Sie mir, was es bereits dupliziert ist den Weg zeigen?