sksyen: SRC Bearbeitet. Ich habe immer noch Probleme mit dem Aufrufen der Serverdatei nach der Aktualisierung auf 'W'. Irgendwelche Vorschläge?
Ich habe das gleiche Problem...
Ich denke, dass mein Problem in der Zeile writefile liegt...ich sende nur einen Buchstaben. Wenn ich das Wort UPDATE senden möchte, wird nur das U gesendet...
Ich schicke meinen Code an den Herrn angevoyageur. Er ist ein Moderator, wenn ich richtig liege. Wenn er mir hilft, sende ich an Sie...
Ich denke, dass mein Problem in der Zeile writefile liegt...ich sende nur einen Buchstaben. Wenn ich das Wort UPDATE senden möchte, wird nur das U gesendet...
Ich schicke meinen Code an den Herrn angevoyageur. Er ist ein Moderator, wenn ich richtig liege. Wenn er mir hilft, sende ich an Sie...
Ich weiß nicht, ob dies einen Wert hat, um Ihre Probleme zu lösen oder nicht, aber denken Sie daran, dass in der neuen MT4-Build, Strings sind 16bit Wide Unicode-Zeichen, nicht die üblichen 8-Bit-ASCII/ANSII-Zeichen.
ASCII-Zeichen in Wide Unicode sind durch NULL-Bytes getrennt, und da viele Funktionen, die mit ASCII/ANSI arbeiten, einen String mit einem NULL-Byte (ASCIIZ) abschließen, werden sie normalerweise nur EIN Zeichen verarbeiten. Ein Verhalten, das Sie gerade für Ihren "writefile"-Fall beschrieben haben.
Stellen Sie also sicher, dass Sie die entsprechenden Funktionen verwenden, die Wide Unicode und nicht ASCII/ANSI verarbeiten können.
Diese Zeile ruft die namedpipe in mt4 auf und mt4 sendet eine Nachricht für ihn.
Ich versuche, auf CallNamedPipeW zu wechseln, aber es passiert nichts.
Also gehe ich zurück in den Ansi-Modus und lese das cbRead-Ergebnis. Wenn ich in mt4 den Text "123456" sende ,ist das cbRead = 7. Ich gebe einen beliebigen Text ein, wenn length = 100 erhalte ich 101. Aber nur das erste Zeichen wird gelesen, wie in UPDATE, wo ich U und cbRead = 7erhalte .
Um den Wert in cbRead zu erhalten, verwende ich ihn
For i = 0 To cbRead - 1
textIn = textIn & Chr(textInArray(i))
Next i
die textInArray.length ist immer = 257. Wenn mein String UPDATE ist 257 und wenn mein String UP ist 257.
EDIT: Ich weiß, warum ist = 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)
Jeder Erfolg Freunde. Mich auch stecken mit NamedPips Kommunikation Problem auf neue MT4 build 600. Ich habe für die Änderung von 'A' zu 'W' getestet, aber nicht funktioniert.
rohitkat: Jeder Erfolg Freunde. Mich auch stecken mit NamedPips Kommunikation Problem auf neue MT4 build 600. Ich habe für die Änderung von 'A' zu 'W' getestet, aber nicht funktioniert.
Es scheint mir, dass, wenn Sie Ihre DLL-Aufruf mit 'W' Funktion anstelle von 'A' zu ändern, müssen Sie auch Ihre Pipe-Server-Code zu ändern. Ein besserer Ansatz kann sein, Ihre Unicode-Strings mit StringToCharArray() in ANSI zu konvertieren (der angegebene Link ist für mql5, aber Sie können die Hilfe in der MQL4-Referenz finden, indem Sie F1 im MetaEditor drücken). Siehe hier und hier.
Ich weiß nicht, ob dies zur Lösung Ihrer Probleme beiträgt oder nicht, aber denken Sie daran, dass Strings im neuen MT4-Build 16-Bit Wide Unicode-Zeichen sind und nicht die üblichen 8-Bit-ASCII/ANSII-Zeichen.
ASCII-Zeichen in Wide Unicode werden durch NULL-Bytes getrennt, und da viele Funktionen, die mit ASCII/ANSI arbeiten, eine Zeichenkette mit einem NULL-Byte (ASCIIZ) abschließen, verarbeiten sie normalerweise nur EIN Zeichen. Ein Verhalten, das Sie gerade für Ihren "writefile"-Fall beschrieben haben.
Stellen Sie also sicher, dass Sie die entsprechenden Funktionen verwenden, die Wide Unicode und nicht ASCII/ANSI verarbeiten können.
Dies ist nicht unbedingt richtig, es hängt von der Kodierung ab, welcher Unicode verwendet wird. Ein Unicode-Zeichen kann zwischen 1 und 4 Byte(s) lang sein.
SRC Bearbeitet. Ich habe immer noch Probleme mit dem Aufrufen der Serverdatei nach der Aktualisierung auf 'W'. Irgendwelche Vorschläge?
Ich habe das gleiche Problem...
Ich denke, dass mein Problem in der Zeile writefile liegt...ich sende nur einen Buchstaben. Wenn ich das Wort UPDATE senden möchte, wird nur das U gesendet...
Ich schicke meinen Code an den Herrn angevoyageur. Er ist ein Moderator, wenn ich richtig liege. Wenn er mir hilft, sende ich an Sie...
Ich habe das gleiche Problem...
Ich denke, dass mein Problem in der Zeile writefile liegt...ich sende nur einen Buchstaben. Wenn ich das Wort UPDATE senden möchte, wird nur das U gesendet...
Ich schicke meinen Code an den Herrn angevoyageur. Er ist ein Moderator, wenn ich richtig liege. Wenn er mir hilft, sende ich an Sie...
Ich weiß nicht, ob dies einen Wert hat, um Ihre Probleme zu lösen oder nicht, aber denken Sie daran, dass in der neuen MT4-Build, Strings sind 16bit Wide Unicode-Zeichen, nicht die üblichen 8-Bit-ASCII/ANSII-Zeichen.
ASCII-Zeichen in Wide Unicode sind durch NULL-Bytes getrennt, und da viele Funktionen, die mit ASCII/ANSI arbeiten, einen String mit einem NULL-Byte (ASCIIZ) abschließen, werden sie normalerweise nur EIN Zeichen verarbeiten. Ein Verhalten, das Sie gerade für Ihren "writefile"-Fall beschrieben haben.
Stellen Sie also sicher, dass Sie die entsprechenden Funktionen verwenden, die Wide Unicode und nicht ASCII/ANSI verarbeiten können.
Danke Sir FMIC, ich denke, Sie haben Recht.
Ich teste und ich werde die Ergebnisse posten.
Ich meine app-Seite, in vb.net habe ich diesen Code:
Diese Zeile ruft die namedpipe in mt4 auf und mt4 sendet eine Nachricht für ihn.
Ich versuche, auf CallNamedPipeW zu wechseln, aber es passiert nichts.
Also gehe ich zurück in den Ansi-Modus und lese das cbRead-Ergebnis. Wenn ich in mt4 den Text "123456" sende ,ist das cbRead = 7. Ich gebe einen beliebigen Text ein, wenn length = 100 erhalte ich 101. Aber nur das erste Zeichen wird gelesen, wie in UPDATE, wo ich U und cbRead = 7erhalte .
Um den Wert in cbRead zu erhalten, verwende ich ihn
die textInArray.length ist immer = 257. Wenn mein String UPDATE ist 257 und wenn mein String UP ist 257.
EDIT:
Ich weiß, warum ist = 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)Wenn ich CallNamedPipeW verwende, erhalte ich die Fehlernummer 2 ERROR_FILE_NOT_FOUND
Jeder Erfolg Freunde. Mich auch stecken mit NamedPips Kommunikation Problem auf neue MT4 build 600. Ich habe für die Änderung von 'A' zu 'W' getestet, aber nicht funktioniert.
Ich weiß nicht, ob dies zur Lösung Ihrer Probleme beiträgt oder nicht, aber denken Sie daran, dass Strings im neuen MT4-Build 16-Bit Wide Unicode-Zeichen sind und nicht die üblichen 8-Bit-ASCII/ANSII-Zeichen.
ASCII-Zeichen in Wide Unicode werden durch NULL-Bytes getrennt, und da viele Funktionen, die mit ASCII/ANSI arbeiten, eine Zeichenkette mit einem NULL-Byte (ASCIIZ) abschließen, verarbeiten sie normalerweise nur EIN Zeichen. Ein Verhalten, das Sie gerade für Ihren "writefile"-Fall beschrieben haben.
Stellen Sie also sicher, dass Sie die entsprechenden Funktionen verwenden, die Wide Unicode und nicht ASCII/ANSI verarbeiten können.