Acho que meu problema está na linha do arquivo escrito... Eu só envio uma carta. Se eu quiser enviar a palavra UPDATE apenas os U são enviados...
envio meu código para o Sr. angevoyageur. Ele é um moderador se eu estiver correto. Se ele me ajudar eu envio a você...
Não sei se isto tem algum valor para resolver seus problemas ou não, mas lembre-se que na nova construção do MT4, as cordas são caracteres Unicode de 16 bits, não os habituais caracteres ASCII/ANSII de 8 bits.
Os caracteres ASCII em Wide Unicode são separados por bytes ZERO, e como muitas funções que funcionam com ASCII/ANSI terminam uma string com um byte ZERO (ASCIIZ), geralmente eles processam apenas UM caractere. Um comportamento que você acabou de descrever para o seu caso "writefile".
Portanto, certifique-se de estar usando as funções apropriadas que são capazes de manusear e manipular Wide Unicode e não ASCII/ANSI.
Esta linha chama o tubo nomeado em mt4 e o mt4 envia uma mensagem para ele.
Eu tento mudar para CallNamedPipeW, mas qualquer coisa acontece.
Então eu volto com ansi mode e leio o resultado cbRead. Se eu tiver o texto em mt4 para enviar "123456" o cbRead é = 7. Coloco qualquer texto, se comprimento = 100 eu recebo 101. Mas somente a primeira letra é lida como em UPDATE onde recebo U e cbRead = 7.
Para obter o valor em cbLeio-o uso
For i = 0 To cbRead - 1
textIn = textIn & Chr(textInArray(i))
Next i
o textoInArray.length é sempre = 257. Se minha string é UPDATE é 257 e se minha string é UPDATE é 257.
EDIT: Eu sei porque é = 257:
Dim res As Integer = 0
Dim cbRead As Integer
Dim textInLength As Integer
Dim textOut() As Byte
Dim textIn As String
Dim textInArray() As Byte
Message_To_MT4 = Comando 'La no script mql ele vai analisar o comando e nos responder. Abaixo, ele envia o comando e lê a resposta.
textOut = System.Text.Encoding.Default.GetBytes(Message_To_MT4)
textInLength = 256
ReDim textInArray(textInLength)
Do 'Wait for a connection, block until a client connects
'Dim exists As Boolean = WaitNamedPipe(szPipeName, NMPWAIT_WAIT_FOREVER)
Try
res = CallNamedPipeA(szPipeName, textOut(0), Message_To_MT4.Length + 1, textInArray(0), textInLength, cbRead, PIPE_NOWAIT)
Catch ex As Exception
MsgBox(Err.LastDllError.ToString)
End Try
If Err.LastDllError = 231 Then
Thread.Sleep(1000)
Envia_APP_TO_MT4(Comando)
Exit Sub
End If
If res = 0 Then
Debug.Print(Err.LastDllError)
'significa que deu erro
Server_PIPE.Text = "MT4 Server PIPE"
Server_PIPE.Icon = New Icon("D:\ProgressError.ico")
Else
'Conexão estabelecida
'string from MT4 = UPDATE
textIn = ""
MsgBox(cbRead.toString) '=7
MsgBox(textInArray.Length) '=257
For i = 0 To cbRead - 1
textIn = textIn & Chr(textInArray(i))
Next i
MsgBox(textIn)
Qualquer amigo de sucesso. Eu também fiquei preso à questão da comunicação da NamedPips no novo MT4 build 600. Eu testei a mudança de 'A' para 'W', mas não funcionou.
rohitkat: Qualquer amigo de sucesso. Eu também fiquei preso à questão da comunicação da NamedPips no novo MT4 build 600. Eu testei a mudança de 'A' para 'W', mas não funcionou.
Parece-me que se você mudar sua chamada DLL usando a função 'W' ao invés de 'A', você também tem que mudar o código do seu servidor de tubos. Uma melhor abordagem pode ser converter suas cordas Unicode para ANSI com StringToCharArray() (o link fornecido é para mql5, mas você pode encontrar ajuda na referência MQL4 pressionando F1 no MetaEditor). Veja aqui e aqui.
Não sei se isto tem algum valor para resolver seus problemas ou não, mas lembre-se que na nova construção do MT4, as cordas são caracteres Unicode de 16 bits, não os habituais caracteres ASCII/ANSII de 8 bits.
Os caracteres ASCII em Wide Unicode são separados por bytes ZERO, e como muitas funções que funcionam com ASCII/ANSI terminam uma string com um byte ZERO (ASCIIZ), geralmente eles processarão apenas UM caractere. Um comportamento que você acabou de descrever para o seu caso "writefile".
Portanto, certifique-se de estar usando as funções apropriadas que são capazes de manusear e manipular Wide Unicode e não ASCII/ANSI.
Isto não é necessariamente verdade, depende da codificação, a qual Unicode é utilizada. Um caractere Unicode pode ser de 1 a 4 byte(s).
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
SRC Edited. Ainda tendo problemas com a chamada ao arquivo do servidor após a atualização para 'W'. Alguma sugestão?
Eu tenho o mesmo problema...
Acho que meu problema está na linha do arquivo escrito... Eu só envio uma carta. Se eu quiser enviar a palavra UPDATE apenas os U são enviados...
envio meu código para o Sr. angevoyageur. Ele é um moderador, se eu estiver correto. Se ele me ajudar eu envio a você...
Eu tenho o mesmo problema...
Acho que meu problema está na linha do arquivo escrito... Eu só envio uma carta. Se eu quiser enviar a palavra UPDATE apenas os U são enviados...
envio meu código para o Sr. angevoyageur. Ele é um moderador se eu estiver correto. Se ele me ajudar eu envio a você...
Não sei se isto tem algum valor para resolver seus problemas ou não, mas lembre-se que na nova construção do MT4, as cordas são caracteres Unicode de 16 bits, não os habituais caracteres ASCII/ANSII de 8 bits.
Os caracteres ASCII em Wide Unicode são separados por bytes ZERO, e como muitas funções que funcionam com ASCII/ANSI terminam uma string com um byte ZERO (ASCIIZ), geralmente eles processam apenas UM caractere. Um comportamento que você acabou de descrever para o seu caso "writefile".
Portanto, certifique-se de estar usando as funções apropriadas que são capazes de manusear e manipular Wide Unicode e não ASCII/ANSI.
Obrigado Senhor FMIC, acho que o senhor está correto.
Estou testando e vou postar os resultados.
Eu tenho este código no vb.net:
Esta linha chama o tubo nomeado em mt4 e o mt4 envia uma mensagem para ele.
Eu tento mudar para CallNamedPipeW, mas qualquer coisa acontece.
Então eu volto com ansi mode e leio o resultado cbRead. Se eu tiver o texto em mt4 para enviar "123456" o cbRead é = 7. Coloco qualquer texto, se comprimento = 100 eu recebo 101. Mas somente a primeira letra é lida como em UPDATE onde recebo U e cbRead = 7.
Para obter o valor em cbLeio-o uso
o textoInArray.length é sempre = 257. Se minha string é UPDATE é 257 e se minha string é UPDATE é 257.
EDIT:
Eu sei porque é = 257:
Dim res As Integer = 0 Dim cbRead As Integer Dim textInLength As Integer Dim textOut() As Byte Dim textIn As String Dim textInArray() As Byte Message_To_MT4 = Comando 'La no script mql ele vai analisar o comando e nos responder. Abaixo, ele envia o comando e lê a resposta. textOut = System.Text.Encoding.Default.GetBytes(Message_To_MT4) textInLength = 256 ReDim textInArray(textInLength) Do 'Wait for a connection, block until a client connects 'Dim exists As Boolean = WaitNamedPipe(szPipeName, NMPWAIT_WAIT_FOREVER) Try res = CallNamedPipeA(szPipeName, textOut(0), Message_To_MT4.Length + 1, textInArray(0), textInLength, cbRead, PIPE_NOWAIT) Catch ex As Exception MsgBox(Err.LastDllError.ToString) End Try If Err.LastDllError = 231 Then Thread.Sleep(1000) Envia_APP_TO_MT4(Comando) Exit Sub End If If res = 0 Then Debug.Print(Err.LastDllError) 'significa que deu erro Server_PIPE.Text = "MT4 Server PIPE" Server_PIPE.Icon = New Icon("D:\ProgressError.ico") Else 'Conexão estabelecida 'string from MT4 = UPDATE textIn = "" MsgBox(cbRead.toString) '=7 MsgBox(textInArray.Length) '=257 For i = 0 To cbRead - 1 textIn = textIn & Chr(textInArray(i)) Next i MsgBox(textIn)Se eu usar CallNamedPipeW recebo o número de erro 2 ERROR_FILE_NOT_FOUND
Qualquer amigo de sucesso. Eu também fiquei preso à questão da comunicação da NamedPips no novo MT4 build 600. Eu testei a mudança de 'A' para 'W', mas não funcionou.
Não sei se isto tem algum valor para resolver seus problemas ou não, mas lembre-se que na nova construção do MT4, as cordas são caracteres Unicode de 16 bits, não os habituais caracteres ASCII/ANSII de 8 bits.
Os caracteres ASCII em Wide Unicode são separados por bytes ZERO, e como muitas funções que funcionam com ASCII/ANSI terminam uma string com um byte ZERO (ASCIIZ), geralmente eles processarão apenas UM caractere. Um comportamento que você acabou de descrever para o seu caso "writefile".
Portanto, certifique-se de estar usando as funções apropriadas que são capazes de manusear e manipular Wide Unicode e não ASCII/ANSI.