In MQL5 gibt es immer Raum für einen Exploit! ;)

 

Ich schlage vor, alle Arten von mql5 "Unmöglichkeiten" zu posten und zu analysieren, wie diese hier: Conditional Compilation.

Es ist möglich, zunächst die Möglichkeit aufzuzeigen(ohne die Umsetzung zu verraten), um neugierige Menschen zu quälen und die eigene Kreativität des Lesers anzuregen.

Aber am Ende ist es notwendig (obligatorisch!), das Geheimnis zu lüften und ein Beispiel für die Umsetzung zu geben.

Natürlich ist eine solche "Zwei-Phasen-Form" voller Schwindel, aber ich verlasse mich auf ehrliche Aussagen von Wundertätern, die bereit sind, "zurückzutreten". :)

--

So........ HIER GEHT'S LOS!

 
Итак........ НАЧАЛИ !

Los geht's. Ich zuerst. :)

Obwohl die "magischsten" Orte sehr langsam sind - aber... Vielleicht findet einer der mql5-Assistenten einen Weg, das Ganze zu beschleunigen?

// Sie können selbst sehen, wie langsam sie sind, der Test ist der Messung ihrer Geschwindigkeit gewidmet.

Dieser Code funktioniert nach der üblichen Syntax für zweidimensionale Arrays.

void OnStart()
  {
   float  FA[5][3];
   long st=GetTickCount();
   for(int t=0;t<1000000;t++)
     {
      for(int i=0;i<5;i++)
        {
         for(int j=0;j<3;j++)
           {
            FA[i][j] = (i+1.5)*(j+1.3);
           }
        }
     }
   Print("====",GetTickCount()-st," ms ====");
   
   st=GetTickCount();
   C2DMagicArray  MA(5,3);   
   for(int t=0;t<1000000;t++)
     {
      for(int i=0;i<MA.SizeL();i++)
        {
         for(long j=0;j<MA.MaxR();j++)
           {
            MA[i][j] = (i+1.5)*(j+1.3);  
            // ^  ^  Как это сделано ??? Можете повторить ? :))
           }
        }
     }
   Print("====",GetTickCount()-st," ms ====");
   st=GetTickCount();
   for(int t=0;t<1000000;t++)
     {
      for(int i=0;i<MA.SizeL();i++)
        {
         for(long j=0;j<MA.MaxR();j++)
           {
            MA.Set(i,j,float((i+1.5)*(j+1.3)));
           }
        }
     }
   Print("====",GetTickCount()-st," ms ====");

   for(int i=0;i<MA.SizeL();i++)
     {
      for(int j=0;j<MA.MaxR();j++)
        {
         Print( MA[i][j] );  
         //        ^  ^    Как это сделано???  :))  Жду Вашу версию!
        }
     }
  }

Sie werden den Code noch nicht kompilieren können: die Injektoren werden erst später verfügbar sein... - sonst wäre es nicht so interessant. :)

Wer kann das Kunststück also wiederholen?

 

Während Vladimir auf eine Antwort von uns wartet, habe ich eine Frage, die ein Kunststück wert ist ;)


Wie kann man einen ex5 dazu bringen, Funktionen aus 32er und 64er DLLs zu importieren?
Nehmen wir an, es soll ein ex5 für zwei (32/64) Terminals erstellt werden.


Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
  • www.mql5.com
Основы языка / Препроцессор / Импорт функций (#import) - Документация по MQL5
 
sergeev:

Während Vladimir auf eine Antwort von uns wartet, habe ich eine Frage, die ein Kunststück wert ist ;)


Wie kann man einen ex5 dazu bringen, Funktionen aus 32er und 64er DLLs zu importieren?
Zum Beispiel, um ein ex5 für zwei (32/64) Terminals zu machen.

Fragen Sie wieder nach Ausnahmen?
 
Urain:
Fragen Sie wieder nach Ausnahmen?

Nein, ich habe noch nie um eine Ausnahme gebeten. Darum geht es wahrscheinlich auch nicht. Es geht eher um #ifdef

Ich hatte gehofft, dass, wenn Vladimir in der Lage war, Operationen mit seinem Code zu überladen, seine Methode für die automatische Aktivierung der erforderlichen DLL o_O funktionieren könnte

Eine Art von #import innerhalb von #define

 
MetaDriver:

Los geht's. Ich zuerst. :)

Wer kann das Kunststück also wiederholen?

Es dauert lange, deine Leistung zu wiederholen :) In der Dokumentation gibt es allerdings ein ähnliches Beispiel.

//--- перебираем строки для сложения
   for(int i=0;i<rows;i++)
     {
      //--- запишем результаты сложений строк матриц в массив
      for(int k=0;k<cols;k++)
        {
         arr[k]=this[i][k]+m[i][k];
        }
      //--- поместим массив в строку матрицы
      res[i]=arr;
     }
 
Yurich:

Es dauert lange, deine Leistung zu wiederholen :) In der Dokumentation gibt es allerdings ein ähnliches Beispiel.

Also mach es nach dieser Analogie... keine große Sache!... :-))

Und ich werde es mir ansehen. ;)

 
sergeev:

Wie kann ich Funktionen aus 32 und 64 DLLs in eine ex5 importieren?
Nehmen wir an, es soll ein ex5 für zwei (32/64) Terminals erstellt werden.

Die Funktionen haben unterschiedliche Namen, und im Code sind je nach Bitrate des Terminals verschiedene Funktionen aufzurufen, auf die verwiesen werden soll.

Es scheint mir, dass das Terminal die DLL beim ersten Aufruf lädt. Keine Anrufe - kein Versuch zu laden und kein kritischer Fehlschlag.

Ich sehe keine anderen Möglichkeiten, denn die Terminal-Bitness wird von TerminalInfoInteger() zurückgegeben.

bool x64 = TerminalInfoInteger(TERMINAL_X64);

All dies kann direkt in der Bibliothek MyLib.ex5 durchgeführt werden.



void MyLibMultibitFunc()  // библиотечная универсальная обёртка для DLL-функции
{
  if(x64) { MyDll64Func(); }
  else { MyDll32Func(); }
}
 
MetaDriver:

Die Funktionen haben unterschiedliche Namen, und in den Code werden je nach Bitrate des Terminals bedingte Aufrufe verschiedener Funktionen eingefügt.

Es scheint mir, dass das Terminal die DLL beim ersten Aufruf lädt. Keine Anrufe - kein Versuch zu laden und kein kritischer Fehlschlag.

Ich sehe keine anderen Möglichkeiten, denn die Terminal-Bitness wird von TerminalInfoInteger() zurückgegeben.

All dies kann direkt in der Bibliothek MyLib.ex5 durchgeführt werden.

Ja, ich bin auch der Meinung, dass das Terminal nur beim ersten Aufruf ein DLL-Funktionsobjekt erzeugt.

Und was die Bits betrifft, so scheint es, dass es im Forum einige Erwähnungen über die unterschiedliche Darstellung von Zahlen gab. Wenn das Bitfeld einer Variablen ein Ergebnis liefert, wird es 32 sein, wenn nicht, wird es 64 sein. Sie kann durch Erfahrung bestimmt werden.

 
MetaDriver:

Die Funktionen haben unterschiedliche Namen, und in den Code werden je nach Bitrate des Terminals bedingte Aufrufe verschiedener Funktionen eingefügt.

Es scheint mir, dass das Terminal die DLL beim ersten Aufruf lädt. Keine Anrufe - kein Versuch, zu laden und kritische Fehlgeburt.

Nein, meine Herren, Sie verstehen das Problem nicht. Die Möglichkeiten mit TERMINAL_X64 oder _Is64 sind bekannt.

Aber leider macht das Terminal etwas anderes.

- Wenn Sie das Diagramm aufrufen, wird die Liste der verwendeten DLLs überprüft und die Liste der importierten Funktionen im Fenster "Abhängigkeiten" angezeigt
Bei den DLLs, die nicht mit der Bitrate übereinstimmen, wird die Warnung MQL5\Libraries\somedll64.dll' ist keine 32-Bit-Version

- Aber wenn Sie auf OK drücken und der Expert Advisor irgendwie startet, sind Sie wirklich in Schwierigkeiten.

Das Terminal erzeugt den Fehler 193 und entlädt EX5

Kann 'MQL5\Libraries\somedll64.dll' nicht öffnen (193)
EX5-Laden fehlgeschlagen

Und ich möchte Sie darauf aufmerksam machen, dass dieser Code nur die DLL-Deklaration enthält und keine Funktionen daraus importiert werden

#import "somedll64.dll"
#import
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
  • www.mql5.com
Основы языка / Препроцессор / Импорт функций (#import) - Документация по MQL5
 

Das ist die erste Frage.

Wie importiert man Funktionen aus 32-Bit-DLLs wie user32.dll usw. in eine 64-Bit-Anwendung? Oder gibt es für sie Kopien im System mit diesem Namen und es wird OOP-Speicherplatz geschaffen?