Discussione su "Come scrivere una DLL per MQL5 e scambiare dati in 10 minuti". - pagina 10

 

Questo è il problema, lo script si spegne e basta, come posso vedere il codice di errore dopo? O la prossima volta che viene eseguito, può essere letto immediatamente?

In linea di principio, il problema è stato risolto compilando la dll per 64x. Anche se dopo questo ho avuto altri errori, ma non è importante. Avevo solo bisogno di capire come costruire e collegare le librerie per c/s++ a mql5 in generale. Il mio esempio funziona bene ora.

 
Ci sarà un aggiornamento dell'articolo? Ci sono stati dei cambiamenti nel funzionamento del dll?
 

Se avete Studio 2017 e state guardando queste istruzioni per il vostro vecchio studio e non sapete cosa fare o come farlo, vi consiglio di leggere prima questo articolo: https://docs.microsoft.com/ru-ru/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=vs-2017

Poi, quando avrete creato la vostra dll, seguendo l'esempio di questo articolo e l'avrete testata su un'applicazione client, leggete questa istruzione, a partire dal punto 2, "Nel programma MQL5 dovrebbe essere descritto e chiamato così:". In altre parole, dichiarate la vostra dll in mt5 come è descritta lì.

Ho risolto il mio problema in questo modo.

 

Vorrei una lista di correlazioni di tipo tra C++ e MQL sotto forma di macro.

#define  MQL_STRING wchar_t
 
@Renat Fatkhullin, ho bisogno di un esempio su come ridimensionare array e stringhe nella DLL. Dovrebbe essere fatto attraverso realloc() o i dati passati non possono essere liberati, ma solo cambiare il puntatore a un nuovo array di dati?
 

Ecco il mio codice in Visual Studio 2012 C++. Il file main. con estensione 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;}

Poi ho creato un file con estensione main def (main.def), che ha un elencodi funzioni esportate, il codice sembra questo :

LIBRARY "dllmt42"
EXPORTS
add

Poi l'ho importato nel compilatore

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

Nessun problema nella compilazione, ma quando si lascia l'EA sul grafico, mi confondo

Chiamata di funzione di importazione non risolta, trova '_add' in 'dllmt42.dll'. Total Comander vede la funzione così come il compilatore stesso quando trascina il file

Chi può aiutare, come risolvere il problema con l'errore, dopo tutto c'è un file con estensione .def che memorizza ed è responsabile della corretta esportazione delle funzioni?


 
Seric29:

Ecco il mio codice in Visual Studio 2012 c++. File main. con estensione cpp (main.cpp)

Poi ho creato un file con estensione main def (main.def), che ha un elencodi funzioni esportate, il codice sembra questo :

Poi l'ho importato nel compilatore

Nessun problema dopo la compilazione, ma quando si lascia l'EA sul grafico, mi confondo

Chiamata di funzione di importazione non risolta, trova '_add' in 'dllmt42.dll'. Total Comander vede la funzione così come il compilatore stesso quando trascina il file

Chi può aiutare, come risolvere il problema con l'errore, dopo tutto c'è un file con estensione .def che memorizza ed è responsabile della corretta esportazione delle funzioni?


extern "C" dovrebbe essere aggiunto sia alle dichiarazioni che alle implementazioni delle funzioni esportate, poiché questo è C++. Altrimenti, le firme in entrata sono "più" e MT (così come tutti gli altri) non le vedranno.

 
Maxim Kuznetsov:

extern "C" dovrebbe essere aggiunto sia alle dichiarazioni che alle implementazioni delle funzioni esportate, poiché il C++ è qui. Altrimenti, le firme di input sono "plus" e MT (come tutti gli altri) non le vedrà.

Bene, l'ho aggiunto così

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

Ma ancora la stessa cosa -chiamata di funzione di importazione non risolta, trova '_add' in 'dllmt42.dll'... Cioè ho bisogno di C puro senza ++?

 
Il file .def non è affatto necessario. Dovete duplicare le funzioni nella sezione #import in MQL
 
Roffild:
Il file .def non è affatto necessario. Dovete duplicare le funzioni nella sezione #import in MQL

Beh, sì, e ha fatto senza di esso ho visto e tale, non vado, beh, mi mostrano ciò che è duplicato già punto il modo?