Pregunta sobre la DLL ...... - página 6

 
 
¿La pregunta sigue siendo pertinente para el autor? Estoy escribiendo un dll para mí, puedo darte un pequeño ejemplo.
 
¡¡¡Sí, lo es!!! ¡He solucionado la dll gracias a ti! Gracias. Pero hay cosas que no sé cómo ponerlas en el dll.
 

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).

#import "myLib.dll"

void fn(string var);

#import

DLL:

void __stdcall fn(char *pointer) {}


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:

#import "myLib.dll"

void fn(int var);

void fn(double var);

#import

DLL:

void __stdcall fn(int var) {}


3. Para poder cambiar las variables int y double declaradas en MQL, se deben pasar arrays:

#import "myLib.dll"

void fn(int var[]);

void fn(double var[]);

#import

DLL:

void __stdcall fn(int *var) {}

void __stdcall fn(double *var) {}


4. Cuando se pasa un array de cadena, se pasa la estructura MqlStr a la DLL:

МКЛ прототип:

#import "myLib.dll"

void fn(string var[]);

#import

DLL:
struct MqlStr
{
   int len;
   char *string;
};

void __stdcall fn(MqlStr *var) {}


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.

 
#import "myLib.dll"

void fn(string var);

#import

DLL:

void __stdcall fn(char *pointer) {}

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 ???

 
VOLDEMAR:

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 es necesario que recibas texto de él. Al menos no este año.
 

1. Transferencia de una cadena al IDC:

DLL:
#include <string.h>
void __stdcall Temp(char *mqlStr)
{
   size_t mqlStringSize = strlen(mqlStr);
   char stroka[] = "DLL string";          // Эту строку передадим в MQL.
   if(strlen(stroka) > mqlStringSize)
      stroka[mqlStringSize] = '\0';       // Добавляем нуль-терминатор (обозначает конец строки).
   strcpy(mqlStr, stroka);
   return;
}

MQL:
#include "WaveCounter.dll"
void Temp(string str);
#include
int start()
{ 
   string str = "wwwwwsff";    // Задаем длину строки; Если длина будет меньше необходимого, то строка будет урезана.
   Temp(str); 
   Alert(str); 
   return;
} 
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++;
 
220Volt:

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++;
Eso es lo que estoy haciendo. Estoy utilizando C++, viendo vídeos y leyendo libros. Ahora gran parte de MKL 5 se está aclarando .......
 

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.

Razón de la queja: