Domanda su DLL ...... - pagina 6

 
 
La domanda è ancora rilevante per l'autore? Sto scrivendo un dll per me stesso, posso darvi un piccolo esempio.
 
Sì, lo è!!! Ho risolto la dll grazie a voi! Grazie! Ma ci sono cose che non riesco a capire come metterle nel dll!
 

Le funzioni sono chiamate secondo certe regole - convenzione di chiamata. MT4 è garantito per lavorare con funzioni che aderiscono a __stdcall (un caso speciale di una variante di regola). Per essere sicuri che la funzione esportata utilizzi le regole di cui sopra, dovrebbe avere questo aspetto: void __stdcall AnyFn();

2. Conosco due modi per fare l'esportazione di funzioni di libreria - con __declspec(dllexport) e con il file def (è più facile, altrimenti bisogna lottare con la decodifica delle funzioni in aggiunta). In VS per includere il file def nel progetto, prima aggiungilo ai file del progetto, poi aggiungi il nome del file a: proprietà del progetto/compositore/input/modulo file di definizione.

P.S: Il progetto di esempio con il file def si trova in: directory terminal\ experts\samples\DLLSample.



 

PASSARE PARAMETRI A UNA FUNZIONE DLL

1. Quando si passa una variabile stringa, un array di char (carattere ANSI, prende 1 byte) viene passato alla DLL.

#import "myLib.dll"

void fn(string var);

#import

DLL:

void __stdcall fn(char *pointer) {}


2. Passando int o double alla libreria, la variabile sarà copiata, quindi quando si cambia la variabile nella dll, non c'è nessun cambiamento nella dll:

#import "myLib.dll"

void fn(int var);

void fn(double var);

#import

DLL:

void __stdcall fn(int var) {}


3. Per poter cambiare le variabili int e double dichiarate in MQL, bisogna passare degli array:

#import "myLib.dll"

void fn(int var[]);

void fn(double var[]);

#import

DLL:

void __stdcall fn(int *var) {}

void __stdcall fn(double *var) {}


4. Quando si passa un array da stringa, struct MqlStr viene passata alla DLL:

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

#import "myLib.dll"

void fn(string var[]);

#import

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

void __stdcall fn(MqlStr *var) {}


P.S.

Ogni volta che un array o una stringa (stringa) viene passata alla DLL, è in realtà un puntatore a una sezione di memoria (puntatore) che viene passata alla libreria come segue

void __stdcall fn(int *pointer) {} // come questo. In questo modo si può lavorare come un array, per esempio, puntatore[4] = 4.

void __stdcall fn(int &reference) {} // o così. Ma avremo accesso a un solo elemento. È rilevante quando si passa un array di un elemento nella libreria.

 
#import "myLib.dll"

void fn(string var);

#import

DLL:

void __stdcall fn(char *pointer) {}

Non sono riuscito a trovare una spiegazione adeguata per l'* davanti al puntatore, a cosa serve? Non è possibile farne a meno ?????

E una domanda sul modo in cui ottenere testo da una DLL?

 
VOLDEMAR:

Non sono riuscito a trovare una spiegazione adeguata per l'* davanti al puntatore, a cosa serve? Non è possibile farne a meno ?????

E una domanda sul modo in cui ottenere testo da una DLL?

Non c'è bisogno di ottenere un testo da esso. Almeno non quest'anno.
 

1. Trasferimento di una stringa all'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. Il segno * indica che si tratta di un puntatore. In breve, ogni variabile non ha solo un valore, ma anche un indirizzo dove si trova nella memoria. I puntatori possono lavorare con questo indirizzo. Questo è un problema che deve essere ben compreso, penso che dovresti controllare i libri sul C++;
 
220Volt:

1. Trasferimento di una stringa all'IDC:

2. Il segno * indica che si tratta di un puntatore. In breve, ogni variabile non ha solo un valore, ma anche un indirizzo dove si trova nella memoria. I puntatori possono lavorare con questo indirizzo. È un problema che deve essere ben compreso, quindi potresti voler controllare alcuni libri sul C++;
Questo è quello che sto facendo. Sto usando C++, guardando video, leggendo libri. Ora molto di MKL 5 sta diventando chiaro .......
 

Dovete solo fare attenzione ai dati globali nella libreria. I programmi MCL girano indipendentemente l'uno dall'altro (ma condividono variabili globali perché sono nello stesso thread), quindi è possibile che diversi script scrivano e leggano nella stessa posizione di memoria (il che non è buono). Questo richiede una sincronizzazione, per esempio usando sezioni critiche. Sottolineo che questo è vero per i dati globali (dichiarati fuori dalle funzioni). Quando le funzioni vengono chiamate, viene creato il loro proprio, indipendente insieme di variabili.