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

 

C'est ça le problème, le script se lance, comment puis-je voir le code d'erreur après ça ? Ou la prochaine fois qu'il est exécuté, il peut être lu immédiatement ?

En principe, le problème a été résolu en compilant la dll pour 64x. Bien que, après cela, j'ai eu plus d'erreurs, mais ce n'est pas important. J'avais juste besoin de comprendre comment construire et lier des bibliothèques pour c/s++ à mql5 en général. Mon exemple fonctionne bien maintenant.

 
Y aura-t-il une mise à jour de l'article ? Des changements ont-ils été apportés au fonctionnement de la dll ?
 

Si vous avez Studio 2017 et que vous regardez ces instructions pour votre ancien studio et que vous ne savez pas ce qu'il faut faire ou comment le faire, je vous recommande de lire d'abord cet article : https://docs.microsoft.com/ru-ru/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=vs-2017.

Ensuite, lorsque vous avez créé votre dll, en suivant l'exemple de cet article et que vous l'avez testé sur une application client, lisez cette instruction, à partir du point 2, "Dans le programme MQL5, il doit être décrit et appelé comme ceci :". En d'autres termes, déclarez votre dll dans mt5 comme elle y est décrite.

J'ai résolu mon problème de cette façon.

 

J'aimerais avoir une liste des corrélations de types entre C++ et MQL sous forme de macros.

#define  MQL_STRING wchar_t
 
@Renat Fatkhullin, j'ai besoin d'un exemple sur la façon de redimensionner un tableau et des chaînes de caractères dans une DLL. Faut-il passer par realloc() ou les données passées ne peuvent-elles pas être libérées, mais simplement changer le pointeur vers un nouveau tableau de données ?
 

Voici mon code en Visual Studio 2012 C++. Le fichier main. avec l'extension cpp (main.cpp)

#define  MT4_EXPFUNC __declspec(dllexport) создал макрос чтобы не писать запись __declspec(dllexport)int __stdcall add(int a=0, int b=0)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)и так пробовал тоже
MT4_EXPFUNC int __cdecl add(int a=0, int b=0)//stdcall данная примитивная функция ничего не делает а просто возвращает значение 18
{return (18);пробовал так return 18;}

Ensuite j'ai créé un fichier avec l'extension def (main.def), qui a une listede fonctions exportées, le code ressemble à ceci :

LIBRARY "dllmt42"
EXPORTS
add

Puis je l'ai importé dans le compilateur

#import "dllmt42.dll"
int _add(int a=0, int b=0);
#import

Aucun problème après la compilation, mais lorsque vous laissez l'EA sur le graphique, je suis confus.

Unresolved import function call, find '_add' in 'dllmt42.dll'. Total Comander voit la fonction ainsi que le compilateur lui-même lorsqu'il fait glisser le fichier.

Qui peut aider à résoudre le problème de l'erreur, après tout il y a un fichier avec l'extension .def qui stocke et est responsable de l'exportation correcte des fonctions ?


 
Seric29:

Voici mon code en Visual Studio 2012 c++. Fichier main. avec extension cpp (main.cpp)

Ensuite j'ai créé un fichier avec l'extension def (main.def), qui a une listede fonctions exportées, le code ressemble à ceci :

Puis je l'ai importé dans le compilateur

Aucun problème après la compilation, mais lorsque vous laissez l'EA sur le graphique, je suis confus.

Unresolved import function call, find '_add' in 'dllmt42.dll'. Total Comander voit la fonction ainsi que le compilateur lui-même lorsqu'il fait glisser le fichier.

Qui peut aider, comment résoudre le problème avec l'erreur, après tout il ya un fichier avec l'extension .def qui stocke et est responsable de l'exportation correcte des fonctions ?


extern "C" doit être ajouté à la fois aux déclarations et aux implémentations des fonctions exportées, puisqu'il s'agit de C++. Sinon, les signatures d'entrée sont "plus" et MT (ainsi que tout le monde) ne les verra pas.

 
Maxim Kuznetsov:

extern "C" devrait être ajouté à la fois aux déclarations et aux implémentations des fonctions exportées, puisque le C++ est là. Sinon, les signatures d'entrée sont "plus" et MT (comme tout le monde) ne les verra pas.

Eh bien, je l'ai ajouté ainsi

#define  MT4_EXPFUNC extern "C" __declspec(dllexport)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)
MT4_EXPFUNC int __cdecl add(int a=0, int b=0)//stdcall
{
    return (18);
}

Mais toujours la même chose -appel de fonction d' importation non résolu, trouver '_add' dans 'dllmt42.dll'... C'est-à-dire que j'ai besoin de C pur sans ++ ?

 
Le fichier .def n'est pas du tout nécessaire. Vous devez dupliquer les fonctions dans la section #import dans MQL
 
Roffild:
Le fichier .def n'est pas du tout nécessaire. Vous devez dupliquer les fonctions dans la section #import dans MQL

Eh bien, oui, et fait sans elle, j'ai vu et tel, je ne vais pas, bien, montrez-moi ce qu'il est dupliqué déjà point de la manière ?