Dans MQL5, il y a toujours de la place pour un exploit ! ;)

 

Je suggère de poster et d'analyser toutes sortes d'"impossibilités" de mql5, comme celle-ci : Compilation conditionnelle.

Il est possible de montrer d'abord la possibilité(sans révéler la mise en œuvre) afin de torturer les personnes curieuses et de stimuler la propre créativité du lecteur.

Mais au final, il est nécessaire (obligatoire !) de révéler le secret et de fournir un exemple de mise en œuvre.

Bien sûr, cette forme "biphasée" est truffée de canulars, mais je me fierai aux déclarations honnêtes de faiseurs de miracles, qui sont prêts à "faire marche arrière". :)

--

So........ NOUS Y VOILÀ !

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

C'est parti. Moi d'abord. :)

Bien que les endroits les plus "magiques" ralentissent beaucoup - mais... Peut-être que l'un des magiciens de mql5 trouvera un moyen d'accélérer le processus ?

// Vous pouvez constater par vous-même leur lenteur, le test est consacré à la mesure de leur vitesse.

Ce code fonctionne selon la syntaxe habituelle d'utilisation des tableaux à deux dimensions.

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] );  
         //        ^  ^    Как это сделано???  :))  Жду Вашу версию!
        }
     }
  }

Vous ne pourrez pas encore compiler le code : les injecteurs seront disponibles plus tard... - sinon ce ne sera pas aussi intéressant. :)

Alors, qui peut répéter l'exploit ?

 

Pendant que Vladimir attend une réponse de notre part, j'ai une question digne d'un exploit ;)


Comment faire pour qu'un ex5 importe des fonctions de DLLs 32 et 64 ?
Disons qu'il faut faire un ex5 pour deux bornes (32/64).


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

Pendant que Vladimir attend une réponse de notre part, j'ai une question digne d'un exploit ;)


Comment faire pour qu'un ex5 importe des fonctions de DLLs 32 et 64 ?
Par exemple, pour faire un ex5 pour deux bornes (32/64).

Vous demandez encore des exceptions ?
 
Urain:
Vous demandez encore des exceptions ?

Non, je n'ai jamais demandé une exception avant. Ce n'est probablement pas à propos de ça. C'est plus à propos de #ifdef

J'espérais que si Vladimir était capable de surcharger les opérations en utilisant son code, sa méthode pourrait fonctionner pour activer automatiquement la DLL requise o_O

Une sorte de #import à l'intérieur de #define

 
MetaDriver:

C'est parti. Moi d'abord. :)

Alors, qui peut répéter l'exploit ?

Il faut beaucoup de temps pour répéter votre exploit :) Bien qu'il existe un exemple similaire dans la documentation.

//--- перебираем строки для сложения
   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:

Il faut beaucoup de temps pour répéter votre exploit :) Bien qu'il existe un exemple similaire dans la documentation.

Alors faites-le par cette analogie... pas de problème !... :-))

Et je vais jeter un coup d'oeil. ;)

 
sergeev:

Comment puis-je importer des fonctions de DLL 32 et 64 dans un ex5 ?
Disons qu'il faut faire un ex5 pour deux bornes (32/64).

Les fonctions ont des noms différents. Et dans le code, mettez des appels conditionnels, en fonction du débit binaire du terminal, à différentes fonctions auxquelles se référer.

Il me semble que le terminal charge la DLL au premier appel. Aucun appel - aucune tentative de chargement et aucune fausse couche critique.

Je ne vois pas d'autres moyens. L'indice de bits du terminal est renvoyé par la fonction TerminalInfoInteger().

bool x64 = TerminalInfoInteger(TERMINAL_X64);

Tout cela peut être fait directement dans la bibliothèque MyLib.ex5.



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

Les fonctions ont des noms différents. Et dans le code, mettez des appels conditionnels, en fonction du débit binaire du terminal, à des fonctions différentes.

Il me semble que le terminal charge la DLL au premier appel. Aucun appel - aucune tentative de chargement et aucune fausse couche critique.

Je ne vois pas d'autres moyens. L'indice de bits du terminal est renvoyé par la fonction TerminalInfoInteger().

Tout cela peut être fait directement dans la bibliothèque MyLib.ex5.

Oui, même avis, que le terminal crée l'objet dll-fonction seulement au premier appel.

Et à propos du bitness, il semble qu'il y ait eu quelques mentions sur le forum à propos de la représentation différente des nombres, si le champ de bits de la variable donne un résultat mais il sera 32, si l'autre, il sera 64. Elle peut être déterminée par l'expérience.

 
MetaDriver:

Les fonctions ont des noms différents. Et dans le code, mettez des appels conditionnels, en fonction du débit binaire du terminal, à des fonctions différentes.

Il me semble que le terminal charge la DLL au premier appel. Pas d'appels - pas de tentative de chargement et de fausse couche critique.

Non, messieurs, vous ne comprenez pas le problème. Les possibilités avec TERMINAL_X64 ou _Is64 sont connues.

Mais malheureusement, le terminal agit différemment.

- Lorsque vous vous précipitez sur le graphique, il vérifie la liste des DLL utilisées et affiche la liste des fonctions importées dans la fenêtre Dépendances
Sur les DLL qui ne correspondent pas à la bitness, il écrit un avertissement "MQL5\Libraries\somedll64.dll" n'est pas une version 32 bits.

- Mais lorsque vous appuyez sur OK et que le conseiller expert démarre en quelque sorte, vous êtes vraiment dans le pétrin.

Le terminal génère l'erreur 193 et décharge l'EX5.

Impossible d'ouvrir 'MQL5\Libraries\somedll64.dll' (193)
Le chargement de l'EX5 a échoué

Et je veux attirer votre attention sur le fait que ce code ne contient que la déclaration de la DLL et qu'aucune fonction n'est importée de celle-ci

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

Et donc il y a la question numéro un.

Comment importer des fonctions de dlls 32 bits comme user32.dll etc. dans une application 64 ? Ou bien existe-t-il des copies pour eux dans le système avec ce nom et un espace OOP est créé ?