Discussão sobre "Como escrever uma DLL para MQL5 e trocar dados em 10 minutos". - página 10

 

Aí é que está, o guião apenas arranca, como é que eu posso ver o código de erro depois disso? Ou da próxima vez que for executado, pode ser lido imediatamente?

Em princípio, o problema foi resolvido através da compilação de dll para 64x. Embora, depois disso, tenha recebido mais erros, mas isso não é importante. Só precisava de compreender como construir e ligar bibliotecas de c/s++ a mql5 em geral. O meu exemplo funciona bem agora.

 
Haverá uma actualização do artigo? Houve alguma alteração na operação dll?
 

Se tem o Studio 2017 e está a ver estas instruções para o seu antigo estúdio e não sabe o que fazer ou como o fazer, recomendo-lhe que leia primeiro este artigo: https://docs.microsoft.com/ru-ru/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=vs-2017

Depois, quando tiver criado a sua dll, seguindo o exemplo deste artigo e a tiver testado numa aplicação cliente, leia esta instrução, a partir do ponto 2, "No programa MQL5 deve ser descrito e chamado assim:". Por outras palavras, declare o seu dll em mt5, tal como aí é descrito.

Resolvi o meu problema desta forma.

 

Gostaria de uma lista de correlações de tipo entre C++ e MQL sob a forma de macros.

#define  MQL_STRING wchar_t
 
@Renat Fatkhullin, preciso de um exemplo sobre como redimensionar a matriz e as cordas em DLL. Deve ser feito através de reatribuição() ou os dados passados não podem ser libertados, mas apenas mudar o ponteiro para uma nova matriz de dados?
 

Aqui está o meu código no Visual Studio 2012 C++. Ficheiro principal. com extensão 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;}

Depois criei um ficheiro com a extensão principal def (main.def), que tem uma listade funções exportadas, o código tem este aspecto:

LIBRARY "dllmt42"
EXPORTS
add

Depois importei-o para o compilador

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

Sem problemas após a compilação, mas quando se deixa a EA no gráfico, fico confuso

Chamada de função de importação não resolvida, encontrar '_add' em 'dllmt42.dll'. Total Comander vê a função assim como o próprio compilador ao arrastar o ficheiro

Quem pode ajudar, como resolver o problema com o erro, afinal existe um ficheiro com extensão .def que armazena e é responsável pela exportação correcta das funções?


 
Seric29:

Aqui está o meu código no C++ Visual Studio 2012. O ficheiro principal. com extensão cpp (main.cpp)

Depois criei um ficheiro com a extensão principal def (main.def), que tem uma listade funções exportadas, o código tem este aspecto:

Depois importei-o para o compilador

Sem problemas após a compilação, mas quando se deixa a EA no gráfico, fico confuso

Chamada de função de importação não resolvida, encontrar '_add' em 'dllmt42.dll'. Total Comander vê a função assim como o próprio compilador ao arrastar o ficheiro

Quem pode ajudar, como resolver o problema com o erro, afinal existe um ficheiro com extensão .def que armazena e é responsável pela exportação correcta das funções?


C" externo deve ser acrescentado tanto às declarações como às implementações das funções exportadas, uma vez que se trata de C++. Caso contrário, as assinaturas de entrada são "mais" e a MT (assim como todos os outros) não as verá.

 
Maxim Kuznetsov:

C" externo deve ser acrescentado tanto às declarações como às implementações das funções exportadas, uma vez que C++ está aqui. Caso contrário, as assinaturas de entrada são "mais" e a MT (como todos os outros) não as verá.

Bem, eu acrescentei-o assim

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

Mas ainda a mesma coisa -chamada de função de importação não resolvida, encontrar '_add' em 'dllmt42.dll'... Isto é, preciso de C puro sem ++?

 
O ficheiro .def não é de todo necessário. É necessário duplicar as funções na secção #importar no MQL
 
Roffild:
O ficheiro .def não é de todo necessário. É necessário duplicar as funções na secção #importar no MQL

Bem, sim, e fiz sem ele eu vi e tal, eu não vou, bem, mostre-me o que é duplicado já aponta o caminho?

Razão: