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

 
GarF1eld:
wchar_t anstelle von char verwenden

Das Problem liegt in der mql selbst.

 
_DLLAPI void __stdcall demo(char *stream, char *buf){ buf=stream;}

Was für eine Art von Code ist das? Beim Kopieren eines Zeigers werden lediglich 4 Byte des Speichers kopiert, der die Adresse enthält.

In diesem Fall kann Ihnen memcpy helfen, wenn Sie sich vorher um die Zuweisung des erforderlichen Puffers in der empfangenden Zeile kümmern (im MQL5-Programm).

 
stringo:

Was für eine Art von Code ist das? Beim Kopieren eines Zeigers werden lediglich 4 Byte des Speichers kopiert, der die Adresse enthält.

In diesem Fall kann Ihnen memcpy helfen, wenn Sie für die Zuweisung des erforderlichen Puffers in der empfangenden Zeile (im MQL5-Programm) sorgen.

Was hat der Zeiger damit zu tun? Dieser Code funktioniert perfekt in mql4. Nicht nach der Migration auf mql5.

Jeder hier gibt Ratschläge, aber ich wünschte, man zeigte ein wirklich gutes Beispiel, wie man die Zeichenfolge von mql5 zu dll-Funktion übergeben.

 
antonix
:

...

Frage

Wo liegt das Problem? Wie man menschlich eine Zeichenfolge von MQL zu dll übergeben?

1) Ich danke Ihnen für Ihre Nachricht. Der Fehler wurde behoben. Bitte warten Sie auf ein Update.

2) Sie haben richtig über wchar _t gesagt worden - die Zeichenfolgen in MQL5 sind Unicode.

3) Was meinen Sie mit "Bei der Überprüfung in der visuellen Fehlersuche"?

4) Dies ist die richtige Art der Verwendung:

//--- нужно обеспечить буфер строки для заполнения его в DLL
StringInit(b,256);
//--- вызываем DLL функцию
demo("test",b);
//--- печатаем результат
Print(b);

//--- в DLL
_DLLAPI void __stdcall demo(wchar_t *stream, wchar_t *buf)
  {
   //--- проверим указатель
   if(stream==NULL || buf==NULL) return;
   //--- максимум 256 символов
   wcsncpy(buf,stream,256);
  }
 

Vielen Dank, dass Sie Programmierern wie mir helfen, die sich abmühen. :) Ihr Beispiel hat mir etwas Klarheit verschafft.

Ich habe beschlossen, die Funktion zu schreiben, um eine Zeichenkette von wchar_t in das gute alte char zu konvertieren. Diese Funktion kann für diejenigen nützlich sein, deren Projekte eine Menge Code enthalten, der den Typ char verwendet. Und da MQL5 nur wchar_t übergibt, ist es einfacher, bei der Eingabe zu konvertieren, als die Hälfte des DLL-Codes neu zu schreiben.

char* w2char(wchar_t* str){
      unsigned int lenght = wcslen(str)+1;
      char* ansi = new char[lenght];
      wcstombs(ansi, str, lenght);
      return ansi;
}
 
antonix:

Vielen Dank, dass Sie Programmierern wie mir helfen, die sich abmühen. :) Ihr Beispiel hat mir etwas Klarheit verschafft.

Ich habe beschlossen, die Funktion zu schreiben, um eine Zeichenkette von wchar_t in das gute alte char zu konvertieren. Diese Funktion kann für diejenigen nützlich sein, deren Projekte eine Menge Code enthalten, der den Typ char verwendet. Und da MQL5 nur wchar_t übergibt, ist es einfacher, bei der Eingabe zu konvertieren, als die Hälfte des DLL-Codes neu zu schreiben.

DLL-Funktionen, die Zeichenketten als char * akzeptieren, nehmen natürlich einen Zeiger auf das erste Element des Arrays vom Typ char. Das bedeutet, dass wir bei der Beschreibung des Imports solcher Funktionen im MQL5-Programm das char-Array als String-Parameter verwenden sollten.

Für diese Fälle haben wir die Funktion StringToCharArray bereitgestellt, die Zeichenketten korrekt in das nationale Alphabet umwandelt. Die Funktion wcstombs führt dies nicht immer korrekt aus.

 

Der Artikel ist interessant und nützlich.

1) Die Tatsache, dass der Quellcode enthalten ist, ist cool. Aber wo ist die kompilierte DLL? Offensichtlich ist es für einen Megaproger kein Problem, sie zu erstellen.

Aber was ist, wenn ich kein Mega und kein Proger bin?! :)

2) Der Artikel verwendet einen MS-Compiler. Ich bin damit nicht zufrieden:) Ich habe BC++. Können Sie den darauf abgestimmten Quellcode veröffentlichen?

(IMHO ist es wahrscheinlich immer besser, Quellen für MS und BC anzugeben, da es sich um zwei führende Unternehmen handelt, deren Schreibstil jedoch unterschiedlich ist).

 

Wir versuchen, potenziell gefährlichen Code (DLLs) nicht zu veröffentlichen, um die Benutzer nicht zu verunsichern. Außerdem ist dies nur ein Testbeispiel.

Leider habe ich den Borland C++ Compiler nicht zur Hand. Versuchen Sie, ihn selbst anzupassen, er besteht aus weniger als einer Seite Code.

 

yu-sha:

Sind die Ziele der Entwickler nicht zu hoch gesteckt?

Und warum sollte man das Rad neu erfinden, wenn alles schon vor langer Zeit gemacht wurde (C, Delphi, ...)?

Ich bin absolut einverstanden. Mir würde z.B. eine gut durchdachte COM-Schnittstelle oder im Rahmen der bestehenden Entwicklungsstrategie in Richtung FXRobot Developer Studio;-) zumindest die Möglichkeit der Übergabe eines Zeigers auf eine MQL5 Call Back Funktion in der DLL völlig ausreichen. Ich kann mich irren, aber ich habe den Eindruck, dass die Funktionen bisher nur für den internen Gebrauch exportiert werden können. Ich denke, wir müssen auf den Boden der Tatsachen zurückkehren und erkennen, dass MT als Entwicklungsumgebung niemals an Borland Delphi(Embarcadero RAD Studio), Visual Studio und viele andere herankommen wird. Das liegt nicht am Talent der Entwickler, sondern an den enormen Ressourcen, die für die Entwicklung einer modernen IDE erforderlich sind. Ich spreche nicht von der enormen Unterstützung der oben genannten Plattformen durch Drittanbieter und andere Dinge. In erster Linie möchte ich die Bemühungen der Entwickler sehen, eine perfekte Benutzeroberfläche, Standardfunktionalität und die Möglichkeit zu schaffen, MQL zu verwenden, um eine Brücke zwischen den Benutzerprogrammen und dem Server zu implementieren, wobei die Programme in MQL als Treiber fungieren werden. Verstehen Sie mich nicht falsch, ich möchte den Programmieranfängern nicht ihr Lieblingsspiel wegnehmen, aber es scheint mir, dass professionelle Programmierer und Händler, die eine perfekte fertige Lösung und keinen Selbstbaukasten wollen, ein wenig mehr Aufmerksamkeit erhalten sollten.
 

Man sollte nicht das tun, was richtig erscheint, sondern das, was nützlich ist. Denn Rentabilität ist das, was richtig ist. Und in diesem Fall (MT5+MQL5+Dienstleistungen) - ein riesiger Gewinn (wird zig- oder hundertfach zurückgezahlt) für MetaQuotes und ein riesiger Gewinn für die Trader. Nur nicht sofort.

Es ist immer gut, mindestens 5 Jahre weit in die Zukunft zu blicken. MetaQuotes hat genau das getan.

Grund der Beschwerde: