Actualización del MQL4 600 y de los tubos con nombre - página 2

 
SRC Editado. Sigo teniendo problemas con la llamada al archivo del servidor después de actualizar a 'W'. ¿Alguna sugerencia?
 
sksyen:
SRC Editado. Todavía tiene problemas con la llamada al archivo del servidor después de actualizar a 'W'. ¿Alguna sugerencia?


Tengo el mismo problema...

Creo que mi problema está en la línea writefile... sólo envío una letra. Si quiero enviar la palabra UPDATE sólo se envía la U...

Le envié mi código al Sr. angevoyageur. El es un moderador si estoy en lo correcto. Si él me ayuda le envío a usted...

 
bisewski:


Tengo el mismo problema...

Creo que mi problema está en la línea writefile... sólo envío una letra. Si quiero enviar la palabra UPDATE sólo se envía la U...

Le envié mi código al Sr. angevoyageur. El es un moderador si estoy en lo correcto. Si él me ayuda le envío a usted...


No sé si esto tiene algún valor para resolver tus problemas o no, pero recuerda que en la nueva build de MT4, las cadenas son caracteres Unicode de 16 bits de ancho, no los habituales caracteres ASCII/ANSII de 8 bits.

Los caracteres ASCII en Wide Unicode están separados por CERO bytes, y como muchas funciones que trabajan con ASCII/ANSI terminan una cadena con un byte CERO (ASCIIZ), normalmente sólo procesarán UN carácter. Un comportamiento que acabas de describir para tu caso "writefile".

Así que asegúrate de que estás utilizando las funciones apropiadas que son capaces de manejar y manipular Wide Unicode y no ASCII/ANSI.

 
Hay 2 ejemplos de tuberías con nombre en nuestro paquete de instalación. Ver MQL4\Scripts\NEjemplos\Nde tuberías
 

Gracias señor FMIC, creo que tiene razón.

Estoy probando y voy a publicar los resultados.

Yo mi lado de la aplicación, en vb.net tengo este código:

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

Esta línea llama al namedpipe en mt4 y mt4 envía un mensaje para él.

Intento cambiar a CallNamedPipeW pero no pasa nada.

Así que vuelvo con el modo ansi y leo el resultado de cbRead. Si tengo el texto en mt4 para enviar "123456" el cbReades = 7. Pongo cualquier texto, si la longitud = 100 recibo 101. Pero sólo se lee el primer carácter como en UPDATE donde recibo U y cbRead= 7.

Para obtener el valor en cbRead lo uso

For i = 0 To cbRead - 1
                    textIn = textIn & Chr(textInArray(i))
                Next i

el textInArray.length es siempre = 257. Si mi cadena es UPDATE es 257 y si mi cadena es UP es 257.

EDITAR:
Ya se porque es = 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)
 
Si utilizo CallNamedPipeW recibo el error número 2 ERROR_FILE_NOT_FOUND
 
bisewski:
Si uso CallNamedPipeW recibo el error número 2 ERROR_FILE_NOT_FOUND
Así que... aún no está resuelto. Voy a comprobar si puedo ver algo.
 
Cualquier éxito amigos. Yo también atascado con NamedPips problema de comunicación en la nueva MT4 construir 600. He probado para el cambio de 'A' a 'W' pero no funciona.
 
rohitkat:
Cualquier éxito amigos. Yo también atascado con NamedPips problema de comunicación en la nueva MT4 construir 600. He probado para el cambio de 'A' a 'W' pero no funciona.
Me parece que si usted cambia su llamada DLL utilizando la función 'W' en lugar de 'A', también tiene que cambiar su código de servidor de tuberías. Un mejor enfoque puede ser convertir tus cadenas Unicode a ANSI con StringToCharArray() (el enlace proporcionado es para mql5, pero puedes encontrar ayuda en la referencia de MQL4 pulsando F1 en el MetaEditor). Ver aquí y aquí.
 
FMIC:


No sé si esto tiene algún valor para resolver sus problemas o no, pero recuerde que en la nueva construcción de MT4, las cadenas son caracteres Wide Unicode de 16 bits, no los habituales caracteres ASCII/ANSII de 8 bits.

Los caracteres ASCII en Wide Unicode están separados por CERO bytes, y como muchas funciones que trabajan con ASCII/ANSI terminan una cadena con un byte CERO (ASCIIZ), normalmente sólo procesarán UN carácter. Un comportamiento que acabas de describir para tu caso "writefile".

Así que asegúrese de que está utilizando las funciones apropiadas que son capaces de manejar y manipular Wide Unicode y no ASCII/ANSI.

Esto no es necesariamente cierto, depende de la codificación que se utilice Unicode. Un carácter Unicode puede tener de 1 a 4 bytes.