Update MQL4 600 & Benannte Rohre - Seite 2

 
SRC Bearbeitet. Ich habe immer noch Probleme mit dem Aufrufen der Serverdatei nach der Aktualisierung auf "W". Irgendwelche Vorschläge?
 
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...

 
bisewski:


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.

 
Es gibt 2 Beispiele für Named Pipes in unserem Installationspaket. Siehe MQL4\Scripts\Examples\Pipes
 

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:

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

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)
 
Wenn ich CallNamedPipeW verwende, erhalte ich die Fehlernummer 2 ERROR_FILE_NOT_FOUND
 
bisewski:
Wenn ich CallNamedPipeW verwende, erhalte ich die Fehlernummer 2 ERROR_FILE_NOT_FOUND
Also...noch nicht gelöst. Ich werde überprüfen, ob ich etwas sehen kann.
 
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.
 
FMIC:


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.