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

 
GarF1eld:
Utilizarwchar_t en lugar de char

El problema radica en el propio mql.

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

¿Qué tipo de código es este? Copiar un puntero es simplemente copiar 4 bytes de memoria que contienen la dirección.

En este caso, memcpy puede ayudarte, si te encargas de la asignación del buffer necesario en la línea de recepción de antemano (en el programa MQL5).

 
stringo:

¿Qué tipo de código es este? Copiar un puntero es simplemente copiar 4 bytes de memoria que contienen la dirección.

En este caso, memcpy puede ayudarte, si te encargas de la asignación del buffer necesario en la línea de recepción (en el programa MQL5).

¿Qué tiene que ver el puntero con esto? Este código funciona perfectamente en mql4. No después de la migración a mql5.

Todo el mundo aquí está dando consejos, pero me gustaría que uno mostrara un ejemplo realmente bueno de cómo pasar la cadena de mql5 a la función dll.

 
antonix
:

...

Pregunta

¿Cuál es el problema? ¿Cómo pasar humanamente una cadena de MQL a dll?

1) Gracias por su mensaje. El error ha sido corregido. Por favor, espere una actualización.

2) Te han dicho correctamente lo de wchar _t - las cadenas en MQL5 son Unicode.

3) ¿A qué te refieres con "Al comprobar en la depuración visual"?

4) Esta es la forma correcta de utilizarlo:

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

Gracias por ayudar a los programadores con dificultades como yo. :) Su ejemplo ha aportado algo de claridad a mi situación.

He decidido escribir (o el octavo, que puede necesitarlo) función para convertir la cadena de wchar_t a la buena vieja char. Esta función puede ser útil para aquellos cuyos proyectos tienen mucho código que utiliza el tipo char. Y como MQL5 pasa sólo wchar_t, es más fácil convertir en la entrada que reescribir la mitad del código dll.

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

Gracias por ayudar a los programadores con dificultades como yo. :) Su ejemplo ha aportado algo de claridad a mi situación.

He decidido escribir la función para convertir una cadena de wchar_t a un viejo char. Esta función puede ser útil para aquellos cuyos proyectos tienen mucho código que utiliza el tipo char. Y como MQL5 pasa sólo wchar_t, es más fácil convertir en la entrada que reescribir la mitad del código dll.

Las funciones DLL que aceptan cadenas como char *, por supuesto, toman un puntero al primer elemento del array de tipo char. Esto significa que cuando se describe la importación de tales funciones en el programa MQL5, debemos utilizar la matriz char como parámetro de cadena.

Para estos casos, hemos proporcionado la función StringToCharArray que convierte correctamente las cadenas en el alfabeto nacional. La función wcstombs no siempre lo hace correctamente.

 

El artículo es interesante y útil.

1) El hecho de que se incluya el código fuente es genial. Je, pero ¿dónde está la DLL compilada? Obviamente, no es un problema para que un Megaproger la cree.

Pero, ¿y si no soy un Mega y no soy un Proger? :)

2) El artículo utiliza el compilador de MS. No soy amigo de ella:) Tengo BC++. ¿Puedo publicar el código fuente ajustado a él?

(En mi opinión, probablemente, siempre es mejor poner las fuentes de MS y BC, son dos empresas líderes, pero sus estilos de escritura son diferentes).

 

Intentamos no publicar código potencialmente peligroso (DLL) para no poner nerviosos a los usuarios. Además, esto es sólo un ejemplo de prueba.

Lamentablemente, no tengo a mano el compilador Borland C++. Intenta adaptarlo tú mismo, es menos de una página de código.

 

yu-sha:

¿No están los promotores poniendo las miras demasiado altas?

¿Y por qué reinventar la rueda cuando todo se ha hecho ya hace mucho tiempo (C, Delphi, ...)?

Estoy totalmente de acuerdo. Para mí, por ejemplo, una interfaz COM bien pensada o, en el marco de la estrategia de desarrollo existente hacia FXRobot Developer Studio;-), al menos la posibilidad de pasar un puntero a la función MQL5 Call Back en DLL sería bastante. Puede que me equivoque, pero tengo la impresión de que hasta ahora las funciones sólo se pueden exportar para uso interno. Creo que tenemos que poner los pies en la tierra y darnos cuenta de que MT como entorno de desarrollo nunca se acercará a Borland Delphi(Embarcadero RAD Studio), Visual Studio y muchos otros. No se debe al talento de los desarrolladores, sino a los enormes recursos necesarios para el desarrollo de un IDE moderno. No hablo del tremendo apoyo de las plataformas mencionadas por parte de terceros vendedores y otras cosas. En primer lugar, me gustaría ver los esfuerzos de los desarrolladores para crear una interfaz de usuario perfecta, una funcionalidad estándar y la capacidad de utilizar MQL para implementar un puente entre los programas de usuario y el servidor, donde los programas en MQL actuarán como el conductor. No me malinterpretes, no quiero quitarle el juego favorito a los programadores novatos, pero me parece que se debería prestar un poco más de atención a los programadores profesionales y a los comerciantes que quieren obtener una solución perfecta ya hecha, en lugar de un constructor de bricolaje.
 

No hay que hacer lo que parece correcto, sino lo que es beneficioso. Porque la rentabilidad es lo correcto. Y en este caso (MT5+MQL5+servicios) - un enorme beneficio (será devuelto decenas o cientos de veces) para MetaQuotes y un enorme beneficio para los traders. Pero no de inmediato.

Siempre es una buena idea mirar a lo ancho y a lo largo de al menos 5 años. MetaQuotes ha hecho precisamente eso.

Razón de la queja: