Discussion sur "Comment écrire une DLL pour MQL5 et échanger des données en 10 minutes". - page 6

 
GarF1eld:
Utiliserwchar_t au lieu de char

Le problème réside dans le mql lui-même.

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

Quel genre de code est-ce ? Copier un pointeur revient à copier 4 octets de mémoire contenant l'adresse.

Dans ce cas, memcpy peut vous aider, si vous vous occupez au préalable de l'allocation du tampon nécessaire dans la ligne de réception (dans le programme MQL5).

 
stringo:

Quel genre de code est-ce ? Copier un pointeur revient à copier 4 octets de mémoire contenant l'adresse.

Dans ce cas, memcpy peut vous aider, si vous prenez soin d'allouer le tampon nécessaire dans la ligne de réception (dans le programme MQL5).

Qu'est-ce que le pointeur a à voir avec ça ? Ce code fonctionne parfaitement dans mql4. Pas après la migration vers mql5.

Tout le monde ici donne des conseils, mais j'aimerais que l'on montre un très bon exemple de la façon de passer la chaîne de mql5 à la fonction dll.

 
antonix
:

...

Question

Quel est le problème ? Comment passer humainement une chaîne de caractères de MQL à une dll ?

1) Merci pour votre message. L'erreur a été corrigée. Veuillez attendre une mise à jour.

2) On vous a correctement parlé de wchar _t - les chaînes de caractères dans MQL5 sont Unicode.

3) Que voulez-vous dire par "lors de la vérification en débogage visuel" ?

4) C'est la façon correcte de l'utiliser :

//--- нужно обеспечить буфер строки для заполнения его в 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);
  }
 

Merci d'aider les programmeurs en difficulté comme moi. :) Votre exemple a apporté un peu de clarté à ma situation.

J'ai décidé d'écrire (ou huitième, qui peut en avoir besoin) fonction pour convertir la chaîne de wchar_t à bon vieux char. Cette fonction peut être utile à ceux dont les projets comportent beaucoup de code utilisant le type char. Et comme MQL5 ne transmet que des wchar_t, il est plus facile de convertir à l'entrée que de réécrire la moitié du code de la dll.

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

Merci d'aider les programmeurs en difficulté comme moi. :) Votre exemple a apporté un peu de clarté à ma situation.

J'ai décidé d'écrire (ou huitième, qui peut en avoir besoin) fonction pour convertir la chaîne de wchar_t à bon vieux char. Cette fonction peut être utile à ceux dont les projets comportent beaucoup de code utilisant le type char. Et comme MQL5 ne transmet que des wchar_t, il est plus facile de convertir à l'entrée que de réécrire la moitié du code de la dll.

Les fonctions DLL qui acceptent les chaînes de caractères en tant que char *, bien sûr, prennent un pointeur vers le premier élément du tableau de type char. Cela signifie que lorsque nous décrivons l'importation de telles fonctions dans un programme MQL5, nous devons utiliser le tableau de chars comme paramètre de chaîne.

Pour ces cas, nous avons fourni la fonction StringToCharArray qui convertit correctement les chaînes de caractères dans l'alphabet national. La fonction wcstombs ne le fait pas toujours correctement.

 

L'article est intéressant et utile.

1) Le fait que le code source soit inclus est cool. Heh, mais où est la DLL compilée ? Évidemment, ce n'est pas un problème pour un Megaproger de la créer.

Mais que faire si je ne suis pas un Mega et pas un Proger ? ! :)

2) L'article utilise le compilateur MS. Je ne suis pas ami avec elle :) J'ai BC++. Puis-je poster le code source qui lui a été accordé ?

(Selon moi, il est probablement toujours préférable d'afficher les sources pour MS et BC, ce sont deux entreprises de premier plan, mais leurs styles d'écriture sont différents).

 

Nous essayons de ne pas publier de code potentiellement dangereux (DLL) afin de ne pas rendre les utilisateurs nerveux. De plus, ce n'est qu'un exemple de test.

Malheureusement, je n'ai pas le compilateur Borland C++ sous la main. Essayez de l'adapter vous-même, il s'agit de moins d'une page de code.

 

yu-sha:

Les développeurs ne visent-ils pas trop haut ?

Et pourquoi réinventer la roue quand tout a déjà été fait il y a longtemps (C, Delphi, ...) ?

Je suis tout à fait d'accord. Pour moi, par exemple, une interface COM bien pensée ou, dans le cadre de la stratégie de développement existante vers FXRobot Developer Studio;-), au moins la possibilité de passer un pointeur vers la fonction Call Back de MQL5 dans la DLL serait bien suffisante. Je peux me tromper, mais jusqu'à présent, j'ai l'impression que les fonctions ne peuvent être exportées que pour un usage interne. Je pense que nous devons redescendre sur terre et réaliser que MT, en tant qu'environnement de développement, ne se rapprochera jamais de Borland Delphi(Embarcadero RAD Studio), Visual Studio et bien d'autres. Ce n'est pas dû au talent des développeurs mais aux énormes ressources nécessaires au développement d'un IDE moderne. Je ne parle pas de l'énorme soutien apporté aux plates-formes susmentionnées par des fournisseurs tiers et d'autres choses encore. Avant tout, j'aimerais voir les efforts des développeurs pour créer une interface utilisateur parfaite, une fonctionnalité standard et la possibilité d'utiliser MQL pour mettre en place un pont entre les programmes utilisateurs et le serveur, où les programmes en MQL feront office de pilote. Ne vous méprenez pas, je ne veux pas priver les programmeurs novices de leur jeu favori, mais il me semble que les programmeurs professionnels et les traders qui souhaitent obtenir une solution prête à l'emploi parfaite, plutôt qu'un constructeur bricolé, devraient bénéficier d'un peu plus d'attention.
 

Il ne faut pas faire ce qui semble juste, mais ce qui est bénéfique. Parce que le profit est ce qui est juste. Et dans ce cas (MT5+MQL5+services) - un bénéfice énorme (qui sera remboursé des dizaines ou des centaines de fois) pour MetaQuotes et un bénéfice énorme pour les traders. Mais pas tout de suite.

C'est toujours une bonne idée de voir large et de se projeter dans l'avenir pour au moins 5 ans. C'est ce qu'a fait MetaQuotes.

Raison: