Frage zur DLL ...... - Seite 6

 
 
Ist die Frage für den Autor noch relevant? Ich schreibe eine Dll für mich selbst, ich kann Ihnen ein kleines Beispiel geben.
 
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.



 

Ü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.

#import "myLib.dll"

void fn(string var);

#import

DLL:

void __stdcall fn(char *pointer) {}


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:

#import "myLib.dll"

void fn(int var);

void fn(double var);

#import

DLL:

void __stdcall fn(int var) {}


3. Um in MQL deklarierte int- und double-Variablen ändern zu können, sollten Arrays übergeben werden:

#import "myLib.dll"

void fn(int var[]);

void fn(double var[]);

#import

DLL:

void __stdcall fn(int *var) {}

void __stdcall fn(double *var) {}


4. Bei der Übergabe eines Arrays aus String wird struct MqlStr an die DLL übergeben:

МКЛ прототип:

#import "myLib.dll"

void fn(string var[]);

#import

DLL:
struct MqlStr
{
   int len;
   char *string;
};

void __stdcall fn(MqlStr *var) {}


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.

 
#import "myLib.dll"

void fn(string var);

#import

DLL:

void __stdcall fn(char *pointer) {}

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...

 
VOLDEMAR:

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...

Sie brauchen keinen Text abzurufen. Zumindest nicht in diesem Jahr.
 

1. Übertragen einer Zeichenfolge an den IDC:

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;
 
220Volt:

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;
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.

Grund der Beschwerde: