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

 
GarF1eld:
Usarwchar_t em vez de char

O problema reside no próprio mql.

 
_DLLAPI void __stdcall demo(char *stream, char *buf){ buf=stream;}

Que tipo de código é este? Copiar um ponteiro é apenas copiar 4 bytes de memória contendo o endereço.

Neste caso, o memcpy pode ajudá-lo, se tratar da atribuição do buffer necessário na linha de recepção com antecedência (no programa MQL5).

 
stringo:

Que tipo de código é este? Copiar um ponteiro é apenas copiar 4 bytes de memória contendo o endereço.

Neste caso, o memcpy pode ajudá-lo, se se ocupar da atribuição do buffer necessário na linha de recepção (no programa MQL5).

O que tem o ponteiro a ver com isto? Este código funciona perfeitamente em mql4. Não depois da migração para mql5.

Todos aqui estão a dar conselhos, mas gostaria que se mostrasse um exemplo realmente bom de como passar a string da função mql5 para dll.

 
antonix
:

...

Pergunta

Qual é o problema? Como passar humanamente uma string da MQL para dll?

1) Obrigado pela sua mensagem. O erro foi corrigido. Aguarde por favor por uma actualização.

2) Foi-lhe correctamente informado sobre wchar _t - as cordas em MQL5 são Unicode.

3) O que quer dizer com "Ao verificar em depuração visual"?

4) Esta é a forma correcta de o utilizar:

//--- нужно обеспечить буфер строки для заполнения его в DLL
StringInit(b,256);
//--- вызываем DLL функцию
demo("test",b);
//--- печатаем результат
Print(b);

//--- в DLL
_DLLAPI void __stdcall demo(wchar_t *stream, wchar_t *buf)
  {
   //--- проверим указатель
   if(stream==NULL || buf==NULL) return;
   //--- максимум 256 символов
   wcsncpy(buf,stream,256);
  }
 

Obrigado por ajudar programadores lutadores como eu. :) O vosso exemplo trouxe alguma clareza à minha situação.

Decidi escrever a função para converter um fio de wchar_t em bom e velho char. Esta função pode ser útil para aqueles cujos projectos têm muitos códigos que utilizam o tipo de char. E como a MQL5 passa apenas wchar_t, é mais fácil de converter na entrada do que reescrever metade do código dll.

char* w2char(wchar_t* str){
      unsigned int lenght = wcslen(str)+1;
      char* ansi = new char[lenght];
      wcstombs(ansi, str, lenght);
      return ansi;
}
 
antonix:

Obrigado por ajudar programadores lutadores como eu. :) O vosso exemplo trouxe alguma clareza à minha situação.

Decidi escrever (ou oitavo, quem pode precisar) função para converter cordel de wchar_t em bom e velho char. Esta função pode ser útil para aqueles cujos projectos têm muitos códigos que utilizam o tipo de char. E como a MQL5 passa apenas wchar_t, é mais fácil de converter na entrada do que reescrever metade do código dll.

Funções DLL que aceitam cordas como char *, claro, levam um ponteiro para o primeiro elemento da matriz do tipo char. Isto significa que ao descrever a importação de tais funções no programa MQL5, devemos usar a matriz de caracteres como parâmetro de string.

Para estes casos, fornecemos a função StringToCharArray que converte correctamente as cordas no alfabeto nacional. A função dos wcstombs nem sempre o faz correctamente.

 

O artigo é interessante e útil.

1) O facto de o código fonte estar incluído é fixe. Heh, mas onde está a DLL compilada? Obviamente, não é um problema para um Megaproger criá-la.

Mas e se eu não for um Mega e não um Proger?! :)

2) O artigo utiliza um compilador de EM. Não sou amigo:) Eu tenho BC+++. Pode afixar o código fonte afinado para ele?

(IMHO, provavelmente, é sempre melhor afixar fontes para EM e BC, são duas empresas líderes, mas os seus estilos de escrita são diferentes).

 

Tentamos não publicar códigos potencialmente perigosos (DLLs) de modo a não deixar os utilizadores nervosos. Além disso, este é apenas um exemplo de teste.

Infelizmente, não tenho o compilador Borland C++ em mãos. Tente adaptá-lo você mesmo, é menos de uma página de código.

 

yu-sha:

Os programadores não estão a colocar a sua mira demasiado alta?

E porquê reinventar a roda quando tudo já foi feito há muito tempo (C, Delphi, ...)?

Estou absolutamente de acordo. Para mim, por exemplo, uma interface COM bem pensada ou, no âmbito da estratégia de desenvolvimento existente para o FXRobot Developer Studio;-), pelo menos a possibilidade de passar um ponteiro para a função MQL5 Call Back em DLL seria suficiente. Posso estar errado, mas até agora tenho a impressão de que as funções só podem ser exportadas para uso interno. Penso que precisamos de descer à terra e perceber que a MT como ambiente de desenvolvimento nunca se aproximará da Borland Delphi(Embarcadero RAD Studio), Visual Studio e muitos outros. Não é devido ao talento dos criadores, mas sim aos enormes recursos necessários para o desenvolvimento de uma IDE moderna. Não falo do tremendo apoio das plataformas acima mencionadas por vendedores terceiros e outras coisas. Antes de mais, gostaria de ver os esforços dos programadores para criar uma interface de utilizador perfeita, funcionalidade padrão e a capacidade de usar MQL para implementar uma ponte entre os programas do utilizador e o servidor, onde os programas em MQL actuarão como o condutor. Não me interpretem mal, não quero tirar o jogo favorito dos programadores novatos, mas parece-me que os programadores profissionais e comerciantes que querem obter uma solução pronta perfeita, em vez de um construtor de bricolage, devem receber um pouco mais de atenção.
 

Não se deve fazer o que parece certo, mas o que é benéfico. Porque rentável é o que está certo. E neste caso (MT5+MQL5+serviços) - um enorme lucro (será reembolsado dezenas ou centenas de vezes) para as MetaQuotes e um enorme lucro para os comerciantes. Mas não de imediato.

É sempre bom olhar para a frente e para a frente durante pelo menos 5 anos. A MetaQuotes fez exactamente isso.