Aggiornamento MQL4 600 & Named Pipes - pagina 2

 
SRC modificato. Ho ancora problemi con il richiamo del file del server dopo l'aggiornamento a 'W'. Qualche suggerimento?
 
sksyen:
SRC modificato. Ho ancora problemi con il richiamo del file del server dopo l'aggiornamento a 'W'. Qualche suggerimento?


Ho lo stesso problema...

Penso che il mio problema sia nella linea writefile... invio solo una lettera. Se voglio inviare la parola UPDATE solo la U viene inviata...

Ho inviato il mio codice al signor angevoyageur. È un moderatore, se ho capito bene. Se mi aiuta, lo mando a voi...

 
bisewski:


Ho lo stesso problema...

Penso che il mio problema sia nella linea writefile... invio solo una lettera. Se voglio inviare la parola UPDATE solo la U viene inviata...

Ho inviato il mio codice al signor angevoyageur. È un moderatore, se ho capito bene. Se mi aiuta, lo mando a te...


Non so se questo ha qualche valore per risolvere i tuoi problemi o no, ma ricorda che nella nuova build di MT4, le stringhe sono caratteri Unicode larghi 16bit, non i soliti caratteri ASCII/ANSII a 8 bit.

I caratteri ASCII in Wide Unicode sono separati da byte ZERO, e poiché molte funzioni che lavorano con ASCII/ANSI terminano una stringa con un byte ZERO (ASCIIZ), di solito elaborano solo UN carattere. Un comportamento che hai appena descritto per il tuo caso "writefile".

Quindi assicurati di usare le funzioni appropriate che sono in grado di gestire e manipolare Wide Unicode e non ASCII/ANSI.

 
Ci sono 2 esempi di named pipes nel nostro pacchetto di installazione. Vedere MQL4\Scripts\Examples\Pipes
 

Grazie signore FMIC, penso che lei abbia ragione.

Sto testando e posterò i risultati.

Io mio lato app, in vb.net ho questo codice:

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

Questa linea chiama il namedpipe in mt4 e mt4 invia un messaggio per lui.

Provo a cambiare in CallNamedPipeW ma non succede niente.

Quindi torno con il modo ansi e leggo il risultato di cbRead. Se ho il testo in mt4 da inviare "123456" il cbRead è = 7. Metto qualsiasi testo, se lunghezza = 100 ricevo 101. Ma solo il primo carattere viene letto come in UPDATE dove ricevo U e cbRead = 7.

Per ottenere il valore in cbRead lo uso

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

il textInArray.length è sempre = 257. Se la mia stringa è UPDATE è 257 e se la mia stringa è UP è 257.

EDIT:
So perché è = 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 uso CallNamedPipeW ricevo l'errore numero 2 ERROR_FILE_NOT_FOUND
 
bisewski:
Se uso CallNamedPipeW ricevo l'errore numero 2 ERROR_FILE_NOT_FOUND
Quindi... non ancora risolto. Controllerò se posso vedere qualcosa.
 
Qualsiasi successo amici. Anche io sono bloccato con il problema di comunicazione NamedPips sul nuovo MT4 build 600. Ho provato a cambiare 'A' con 'W' ma non funziona.
 
rohitkat:
Qualsiasi successo amici. Anche io sono bloccato con il problema di comunicazione NamedPips sul nuovo MT4 build 600. Ho provato a cambiare 'A' con 'W' ma non funziona.
Mi sembra che se cambi la tua chiamata DLL usando la funzione 'W' invece di 'A', devi anche cambiare il codice del tuo server pipe. Un approccio migliore può essere quello di convertire le vostre stringhe Unicode in ANSI con StringToCharArray() (il link fornito è per mql5, ma potete trovare aiuto nel riferimento MQL4 premendo F1 in MetaEditor). Vedere qui e qui.
 
FMIC:


Non so se questo ha qualche valore per risolvere i tuoi problemi o no, ma ricorda che nella nuova build di MT4, le stringhe sono caratteri Wide Unicode a 16 bit, non i soliti caratteri ASCII/ANSII a 8 bit.

I caratteri ASCII in Wide Unicode sono separati da byte ZERO, e poiché molte funzioni che lavorano con ASCII/ANSI terminano una stringa con un byte ZERO (ASCIIZ), di solito processano solo UN carattere. Un comportamento che hai appena descritto per il tuo caso "writefile".

Quindi assicuratevi di usare le funzioni appropriate che sono in grado di gestire e manipolare Wide Unicode e non ASCII/ANSI.

Questo non è necessariamente vero, dipende dalla codifica, quale Unicode è usato. Un carattere Unicode può essere da 1 a 4 byte.