Ja, das ist es!!! Dank Ihnen habe ich die DLL in Ordnung gebracht! Danke! Aber es gibt Dinge, die ich nicht herausfinden kann, wie man sie in die DLL einfügt!
Funktionen werden nach bestimmten Regeln aufgerufen - Aufrufkonvention. MT4 arbeitet garantiert mit Funktionen, die sich an __stdcall halten (ein Spezialfall einer Regelvariante). Um sicher zu sein, dass die exportierte Funktion die oben genannten Regeln verwendet, sollte sie wie folgt aussehen: void __stdcall AnyFn();
2. Ich kenne zwei Möglichkeiten, Bibliotheksfunktionen zu exportieren - mit __declspec(dllexport) und mit def file (das ist einfacher, sonst muss man sich zusätzlich mit Funktionsdekodierung herumschlagen). Um in VS die def-Datei in das Projekt einzubinden, fügen Sie sie zuerst zu den Projektdateien hinzu, dann fügen Sie den Dateinamen zu: project properties/composer/input/module definition file.
P.S.: Das Beispielprojekt mit der Def-Datei befindet sich in: Terminalverzeichnis\ experts\samples\DLLSample.
2. Die Übergabe von int oder double an die Bibliothek führt dazu, dass die Variable kopiert wird. Wenn Sie also die Variable in der DLL ändern, gibt es keine Änderung in der DLL:
Wann immer ein Array oder eine Zeichenkette (String) an die DLL übergeben wird, handelt es sich eigentlich um einen Zeiger auf einen Speicherabschnitt (Pointer), der wie folgt an die Bibliothek übergeben wird
void __stdcall fn(int *pointer) {} // wie hier. Auf diese Weise können Sie als Array arbeiten, zum Beispiel pointer[4] = 4.
void __stdcall fn(int &reference) {} // oder so. Wir erhalten jedoch nur Zugriff auf ein Element, was relevant ist, wenn ein Array mit einem Element an die Bibliothek übergeben wird.
DLL:
#include <string.h>void __stdcall Temp(char *mqlStr)
{
size_t mqlStringSize = strlen(mqlStr);
char stroka[] = "DLL string"; // Эту строку передадим в MQL.
if(strlen(stroka) > mqlStringSize)
stroka[mqlStringSize] = '\0'; // Добавляем нуль-терминатор (обозначает конец строки).
strcpy(mqlStr, stroka);
return;
}
MQL:
#include "WaveCounter.dll"void Temp(string str);
#include
int start()
{
string str = "wwwwwsff"; // Задаем длину строки; Если длина будет меньше необходимого, то строка будет урезана.
Temp(str);
Alert(str);
return;
}
2. Das Zeichen * zeigt an, dass es sich um einen Zeiger handelt. Kurz gesagt, jede Variable hat nicht nur einen Wert, sondern auch eine Adresse, an der sie sich im Speicher befindet. Zeiger können mit dieser Adresse arbeiten. Dies ist ein Thema, das gut verstanden werden muss, ich denke, Sie sollten sich die C++-Bücher ansehen;
2. Das Zeichen * zeigt an, dass es sich um einen Zeiger handelt. Kurz gesagt, jede Variable hat nicht nur einen Wert, sondern auch eine Adresse, an der sie sich im Speicher befindet. Zeiger können mit dieser Adresse arbeiten. Das ist ein Thema, das gut verstanden werden muss, also sollten Sie sich vielleicht ein paar C++-Bücher ansehen;
Das ist es, was ich tue. Ich verwende C++, sehe mir Videos an und lese Bücher. Jetzt wird vieles von MKL 5 klar .......
Sie müssen nur mit den globalen Daten in der Bibliothek vorsichtig sein. Die MCL-Programme laufen unabhängig voneinander (teilen sich aber globale Variablen, da sie sich im selben Thread befinden), daher ist es möglich, dass mehrere Skripte in denselben Speicherplatz schreiben und lesen (was nicht gut ist). Dies erfordert eine Synchronisierung, z. B. durch die Verwendung kritischer Abschnitte. Ich betone, dass dies für globale Daten (außerhalb von Funktionen deklariert) gilt. Wenn Funktionen aufgerufen werden, wird ein eigener, unabhängiger Satz von Variablen erstellt.
Funktionen werden nach bestimmten Regeln aufgerufen - Aufrufkonvention. MT4 arbeitet garantiert mit Funktionen, die sich an __stdcall halten (ein Spezialfall einer Regelvariante). Um sicher zu sein, dass die exportierte Funktion die oben genannten Regeln verwendet, sollte sie wie folgt aussehen: void __stdcall AnyFn();
2. Ich kenne zwei Möglichkeiten, Bibliotheksfunktionen zu exportieren - mit __declspec(dllexport) und mit def file (das ist einfacher, sonst muss man sich zusätzlich mit Funktionsdekodierung herumschlagen). Um in VS die def-Datei in das Projekt einzubinden, fügen Sie sie zuerst zu den Projektdateien hinzu, dann fügen Sie den Dateinamen zu: project properties/composer/input/module definition file.
P.S.: Das Beispielprojekt mit der Def-Datei befindet sich in: Terminalverzeichnis\ experts\samples\DLLSample.
ÜBERGABE VON PARAMETERN AN EINE DLL-FUNKTION
1. Bei der Übergabe von String-Variablen wird ein Array von char (ANSI-Zeichen, benötigt 1 Byte) an die DLL übergeben.
2. Die Übergabe von int oder double an die Bibliothek führt dazu, dass die Variable kopiert wird. Wenn Sie also die Variable in der DLL ändern, gibt es keine Änderung in der DLL:
3. Um in MQL deklarierte int- und double-Variablen ändern zu können, sollten Arrays übergeben werden:
4. Bei der Übergabe eines Arrays aus String wird struct MqlStr an die DLL übergeben:
P.S.
Wann immer ein Array oder eine Zeichenkette (String) an die DLL übergeben wird, handelt es sich eigentlich um einen Zeiger auf einen Speicherabschnitt (Pointer), der wie folgt an die Bibliothek übergeben wird
void __stdcall fn(int *pointer) {} // wie hier. Auf diese Weise können Sie als Array arbeiten, zum Beispiel pointer[4] = 4.
void __stdcall fn(int &reference) {} // oder so. Wir erhalten jedoch nur Zugriff auf ein Element, was relevant ist, wenn ein Array mit einem Element an die Bibliothek übergeben wird.
Ich konnte keine richtige Erklärung für das * vor dem Zeiger finden, wofür ist es? Ist es nicht möglich, auf sie zu verzichten ?????
Und eine Frage zur Art und Weise, wie man Text aus einer DLL abrufen kann...
Ich konnte keine richtige Erklärung für das * vor dem Zeiger finden, wofür ist es? Ist es nicht möglich, auf sie zu verzichten ?????
Und eine Frage zur Art und Weise, wie man Text aus einer DLL abrufen kann...
1. Übertragen einer Zeichenfolge an den IDC:
2. Das Zeichen * zeigt an, dass es sich um einen Zeiger handelt. Kurz gesagt, jede Variable hat nicht nur einen Wert, sondern auch eine Adresse, an der sie sich im Speicher befindet. Zeiger können mit dieser Adresse arbeiten. Dies ist ein Thema, das gut verstanden werden muss, ich denke, Sie sollten sich die C++-Bücher ansehen;1. Übertragen einer Zeichenfolge an den IDC:
2. Das Zeichen * zeigt an, dass es sich um einen Zeiger handelt. Kurz gesagt, jede Variable hat nicht nur einen Wert, sondern auch eine Adresse, an der sie sich im Speicher befindet. Zeiger können mit dieser Adresse arbeiten. Das ist ein Thema, das gut verstanden werden muss, also sollten Sie sich vielleicht ein paar C++-Bücher ansehen;Sie müssen nur mit den globalen Daten in der Bibliothek vorsichtig sein. Die MCL-Programme laufen unabhängig voneinander (teilen sich aber globale Variablen, da sie sich im selben Thread befinden), daher ist es möglich, dass mehrere Skripte in denselben Speicherplatz schreiben und lesen (was nicht gut ist). Dies erfordert eine Synchronisierung, z. B. durch die Verwendung kritischer Abschnitte. Ich betone, dass dies für globale Daten (außerhalb von Funktionen deklariert) gilt. Wenn Funktionen aufgerufen werden, wird ein eigener, unabhängiger Satz von Variablen erstellt.