Atualização MQL4 600 & Tubos Nomeados - página 2

 
SRC Edited. Ainda tendo problemas com a chamada ao arquivo do servidor após a atualização para 'W'. Alguma sugestão?
 
sksyen:
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ê...

 
bisewski:


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.

 
Há 2 exemplos de tubos nomeados em nosso pacote de instalação. Ver MQL4\\exemplos\Pipes
 

Obrigado Senhor FMIC, acho que o senhor está correto.

Estou testando e vou postar os resultados.

Eu tenho este código no vb.net:

res = CallNamedPipeA(szPipeName, textOut(0), Message_To_MT4.Length + 1, textInArray(0), textInLength, cbRead, PIPE_NOWAIT)

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)
 
Se eu usar CallNamedPipeW recebo o número de erro 2 ERROR_FILE_NOT_FOUND
 
bisewski:
Se eu usar CallNamedPipeW recebo o número de erro 2 ERROR_FILE_NOT_FOUND
Portanto...ainda não resolvido. Vou verificar se consigo ver alguma coisa.
 
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.
 
FMIC:


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).
Razão: