Discusión sobre "Cómo escribir una DLL para MQL5 e intercambiar datos en 10 minutos". - página 10

 

Esa es la cuestión, el script simplemente se echa a perder, ¿cómo puedo ver el código de error después de eso? O la próxima vez que se ejecute, ¿puede leerse inmediatamente?

En principio, el problema se solucionó compilando la dll para 64x. Aunque, después de eso me salieron más errores, pero no es importante. Sólo necesitaba entender cómo construir y enlazar librerías para c/s++ a mql5 en general. Mi ejemplo funciona bien ahora.

 
¿Habrá una actualización del artículo? ¿Ha habido algún cambio en la operación de la DLL?
 

Si tienes Studio 2017 y estás viendo estas instrucciones para tu antiguo estudio y no sabes qué hacer o cómo hacerlo, te recomiendo que primero leas este artículo: https://docs.microsoft.com/ru-ru/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=vs-2017

Luego, cuando hayas creado tu dll, siguiendo el ejemplo de este artículo y lo hayas probado en una aplicación cliente, lee esta instrucción, a partir del punto 2, "En el programa MQL5 debe describirse y llamarse así:". En otras palabras, declare su dll en mt5 como se describe allí.

Yo he resuelto mi problema de esta manera.

 

Me gustaría tener una lista de correlaciones de tipos entre C++ y MQL en forma de macros.

#define  MQL_STRING wchar_t
 
@Renat Fatkhullin, necesito un ejemplo de cómo redimensionar array y cadenas en DLL. ¿Debe hacerse a través de realloc() o pueden los datos pasados no ser liberados, sino sólo cambiar el puntero a una nueva matriz de datos?
 

Aquí está mi código en Visual Studio 2012 C++. Archivo main. con extensión 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;}

Luego creé un archivo con extensión main def (main.def), que tiene una listade funciones exportadas, el código se ve así :

LIBRARY "dllmt42"
EXPORTS
add

Luego lo importé en el compilador

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

No hay problemas después de la compilación, pero cuando se deja el EA en el gráfico, me confunde

Llamada a función de importación no resuelta, encontrar '_add' en 'dllmt42.dll'. Total Comander ve la función así como el propio compilador al arrastrar el archivo

¿Quién puede ayudar, cómo resolver el problema con el error, después de todo hay un archivo con extensión .def que almacena y es responsable de la correcta exportación de las funciones?


 
Seric29:

Aquí está mi código en Visual Studio 2012 C++. El archivo main. con extensión cpp (main.cpp)

Luego creé un archivo con extensión main def (main.def), que tiene una listade funciones exportadas, el código se ve así :

Luego lo importé en el compilador

No hay problemas después de la compilación, pero cuando se deja el EA en el gráfico, me confunde

Llamada a función de importación no resuelta, encontrar '_add' en 'dllmt42.dll'. Total Comander ve la función así como el propio compilador al arrastrar el archivo

¿Quién puede ayudar, cómo resolver el problema con el error, después de todo hay un archivo con extensión .def que almacena y es responsable de la exportación correcta de las funciones?


Se debe añadir "C" externo tanto a las declaraciones como a las implementaciones de las funciones exportadas, ya que esto es C++. De lo contrario, las firmas de entrada son "más" y MT (al igual que todos los demás) no las verá.

 
Maxim Kuznetsov:

Se debe añadir "C" externo tanto a las declaraciones como a las implementaciones de las funciones exportadas, ya que C++ está aquí. De lo contrario, las firmas de entrada son "más" y MT (como todo el mundo) no las verá.

Bueno, lo he añadido así

#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);
}

Pero sigue ocurriendo lo mismo:llamada a función de importación no resuelta, encontrar '_add' en 'dllmt42.dll'... Es decir, ¿necesito C puro sin ++?

 
El archivo .def no es necesario en absoluto. Es necesario duplicar las funciones en la sección #import en MQL
 
Roffild:
El archivo .def no es necesario en absoluto. Es necesario duplicar las funciones en la sección #import en MQL

Bueno, sí, y lo hizo sin ella vi y tal, no voy, bueno, muéstrame lo que se duplica ya señalar el camino?

Razón de la queja: