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.
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)
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.
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.
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
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...
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.
Grazie signore FMIC, penso che lei abbia ragione.
Sto testando e posterò i risultati.
Io mio lato app, in vb.net ho questo codice:
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
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
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.
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.