Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Las funciones se llaman de acuerdo a ciertas reglas - convención de llamadas. Se garantiza que MT4 trabaja con funciones que se adhieren a __stdcall (un caso especial de una variante de regla). Para asegurarse de que la función exportada utiliza las reglas mencionadas, debe tener el siguiente aspecto: void __stdcall AnyFn();
2. Conozco dos formas de hacer la exportación de la función de la biblioteca - con __declspec(dllexport) y con el archivo def (es más fácil, de lo contrario usted tiene que luchar con la decodificación de la función, además). En VS para incluir el archivo def en el proyecto, primero agregue a los archivos del proyecto, luego agregue el nombre del archivo a: project properties/composer/input/module definition file.
P.D: El proyecto de ejemplo con el archivo def se encuentra en: directorio terminal experts\samples\DLLSample.
PASAR PARÁMETROS A UNA FUNCIÓN DLL
1. Cuando se pasa una variable de cadena, se pasa a la DLL un array de char (carácter ANSI, toma 1 byte).
2. Pasar int o double a la librería hará que se copie la variable, por lo tanto cuando se cambie la variable en la dll, no habrá ningún cambio en la dll:
3. Para poder cambiar las variables int y double declaradas en MQL, se deben pasar arrays:
4. Cuando se pasa un array de cadena, se pasa la estructura MqlStr a la DLL:
P.D.
Cada vez que se pasa un array o una cadena (string) a la DLL, se trata en realidad de un puntero a una sección de memoria (puntero) que se pasa a la biblioteca de la siguiente manera
void __stdcall fn(int *pointer) {} // así. De esta manera se puede trabajar como un array, por ejemplo, pointer[4] = 4.
void __stdcall fn(int &reference) {} // o así. Pero sólo tendremos acceso a un elemento. Es relevante cuando se pasa un array de un elemento a la biblioteca.
No he podido encontrar una explicación adecuada para el * delante del puntero, ¿para qué sirve? ¿No es posible prescindir de él? ?????
Y una pregunta sobre la forma de obtener el texto de una dll ???
No he podido encontrar una explicación adecuada para el * delante del puntero, ¿para qué sirve? ¿No es posible prescindir de él? ?????
Y una pregunta sobre la forma de obtener el texto de una dll ???
1. Transferencia de una cadena al IDC:
2. El signo * indica que es un puntero. En resumen, cualquier variable no sólo tiene un valor, sino también una dirección donde se encuentra en la memoria. Los punteros pueden trabajar con esta dirección. Este es un tema que hay que entender bien, creo que deberías consultar los libros de C++;1. Transferencia de una cadena al IDC:
2. El signo * indica que es un puntero. En resumen, cualquier variable no sólo tiene un valor, sino también una dirección donde se encuentra en la memoria. Los punteros pueden trabajar con esta dirección. Es un tema que hay que entender bien, así que puede que quieras consultar algunos libros de C++;Sólo hay que tener cuidado con los datos globales de la biblioteca. Los programas de la MCL se ejecutan independientemente unos de otros (pero comparten variables globales porque están en el mismo hilo), por lo que es posible que varios scripts escriban y lean en la misma ubicación de memoria (lo que no es bueno). Esto requiere una sincronización, por ejemplo, mediante el uso de secciones críticas. Subrayo que esto es cierto para los datos globales (declarados fuera de las funciones). Cuando se llama a las funciones, se crea su propio e independiente conjunto de variables.