Este código funcionou sem falhas para mim até testá-lo no MT4 build 600, onde não verifica mais as contas do meu servidor.
Obrigado por sua sugestão angevoyageur, mas eu tentei trocar todo o ansi 'A' para W mas ainda sem dados.
Seu problema vai ser com o InternetReadFile(). Veja EasyXml.mqh em https://www.mql5.com/en/code/1998 para um exemplo de como usar as funções WinInet no novo MQL4 - o código funciona tanto no MQL4 quanto no MQL5.
Em essência, você passa um array uchar[] para InternetReadFile(), e então converte o array para uma string usando CharArrayToString(). O que você pode fazer agora em efeito na MQL4 é alocar buffers de memória gerenciada de comprimento arbitrário, passá-los para uma DLL, e então converter os dados de Ansi ou Unicode, conforme aplicável.
Em essência, você passa um array[] uchar[] para InternetReadFile(), e então converte o array para um string usando CharArrayToString(). O que você pode fazer agora em efeito na MQL4 é alocar buffers de memória gerenciada de comprimento arbitrário, passá-los para uma DLL, e então converter os dados de Ansi ou Unicode, conforme aplicável.
Ampliando o tópico e respondendo ligeiramente... na nova MQL4 é possível chamar as versões A ou W de muitas funções. Por exemplo, o seguinte script obtém o diretório temporário do Windows usando tanto as chamadas GetTempPathA como GetTempPathW:
#import "kernel32.dll" int GetTempPathA(int,uchar & arr[]); int GetTempPathW(int,short & arr[]); #import void OnStart() { uchar AnsiStringBuffer[256]; GetTempPathA(255, AnsiStringBuffer); string strTempPathFromA = CharArrayToString(AnsiStringBuffer); short UnicodeStringBuffer[256]; GetTempPathW(255, UnicodeStringBuffer); string strTempPathFromW = ShortArrayToString(UnicodeStringBuffer); Print("Temp path via GetTempPathA(): ", strTempPathFromA); Print("Temp path via GetTempPathW(): ", strTempPathFromW); }
Portanto, é possível continuar usando muitas chamadas DLL somente Ansi do novo MQL4: não necessariamente uma necessidade de atualizar tanto o código MQL4 quanto a DLL.
Portanto, é possível continuar usando muitas chamadas DLL somente da Ansi da nova MQL4: não necessariamente uma necessidade de atualizar tanto o código MQL4 quanto a DLL.
... Outro exemplo: passando valores de string para uma chamada Ansi DLL a partir da nova MQL4. (Na vida real, você obviamente chamaria MessageBoxW em vez de usar esta alternativa para chamar MessageBoxA, mas o ponto geral é útil)
#import "user32.dll" // Declare the Ansi function as taking uchar[] input parameters instead of strings int MessageBoxA(int,uchar & arr1[],uchar & arr2[],int); #import void OnStart() { string strMessage = "Hello"; string strTitle = "Hi!"; // Convert the strings to uchar[] arrays uchar ucMessage[], ucTitle[]; StringToCharArray(strMessage, ucMessage); StringToCharArray(strTitle, ucTitle); MessageBoxA(0, ucMessage, ucTitle, 64); }
Já há algumas horas que brinco com isto, ainda sem sorte. Então, sim, procurando contratar alguém para fazer isso por mim ;)
Já há algumas horas que brinco com isto, ainda sem sorte. Então, sim, procurando contratar alguém para fazer isso por mim ;)
Veja https://www.mql5.com/en/forum/149360 - Eu estava prestes a postar isto como resposta aqui, mas depois encontrei um problema...
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Este código funcionou sem falhas para mim até testá-lo no MT4 build 600, onde não verifica mais as contas do meu servidor.