MQL4 600 및 명명된 파이프 업데이트 - 페이지 2

 
SRC가 수정되었습니다. 'W'로 업데이트한 후 서버 파일을 호출하는 데 여전히 문제가 있습니다. 어떤 제안?
 
sksyen :
SRC가 수정되었습니다. 'W'로 업데이트한 후 서버 파일을 호출하는 데 여전히 문제가 있습니다. 어떤 제안?


나도 같은 문제가있어...

나는 내 문제가 writefile 줄에 있다고 생각합니다...나는 한 글자만 보냅니다. UPDATE라는 단어를 보내려면 U만 전송됩니다...

내 코드를 Mr. gevoyageur 에게 보냅니다 . 내가 맞다면 그는 중재자입니다. 그가 나를 도우면 당신에게 보낼 것입니다 ...

 
bisewski :


나도 같은 문제가있어...

나는 내 문제가 writefile 줄에 있다고 생각합니다...나는 한 글자만 보냅니다. UPDATE라는 단어를 보내려면 U만 전송됩니다...

내 코드를 Mr. gevoyageur 에게 보냅니다 . 내가 맞다면 그는 중재자입니다. 그가 나를 도우면 당신에게 보낼 것입니다 ...


이것이 문제를 해결하는 데 가치가 있는지 여부는 모르겠지만 새 MT4 빌드에서 문자열은 일반적인 8비트 ASCII/ANSII 문자가 아니라 16비트 와이드 유니코드 문자라는 것을 기억하십시오.

와이드 유니코드의 ASCII 문자는 ZERO 바이트로 구분되며 ASCII/ANSI와 함께 작동하는 많은 함수가 문자열을 ZERO 바이트(ASCIIZ)로 끝내기 때문에 일반적으로 하나의 문자만 처리합니다. "writefile" 경우에 대해 방금 설명한 동작입니다.

따라서 ASCII/ANSI가 아닌 와이드 유니코드를 처리하고 조작할 수 있는 적절한 기능을 사용하고 있는지 확인하십시오.

 
설치 패키지에는 명명된 파이프 에 대한 두 가지 예가 있습니다. MQL4\Scripts\Examples\Pipes 참조
 

FMIC 경, 감사합니다. 당신이 옳다고 생각합니다.

테스트 중이며 결과를 게시하겠습니다.

내 앱 쪽, vb.net에 다음 코드가 있습니다.

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

이 라인은 mt4의 namedpipe를 호출하고 mt4는 그를 위해 메시지를 보냅니다.

CallNamedPipeW로 변경하려고 하지만 아무 일도 일어나지 않습니다.

그래서 나는 si 모드로 돌아가서 cbRead 결과를 읽습니다. mt4에 "123456"을 보낼 텍스트가 있는 경우 cbRead는 = 7입니다. 길이 = 100이면 101을 받습니다. 그러나 U를 수신하고 cbRead = 7을 수신하는 UPDATE에서처럼 첫 번째 문자만 읽습니다.

cbRead에서 값을 얻으려면 그것을 사용합니다.

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

textInArray.length는 이제까지 = 257입니다. 내 문자열이 UPDATE이면 257이고 내 문자열이 UP이면 257입니다.

편집하다:
나는 왜 = 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)
 
CallNamedPipeW를 사용하면 오류 번호 2 ERROR_FILE_NOT_FOUND 가 나타납니다.
 
bisewski :
CallNamedPipeW를 사용하면 오류 번호 2 ERROR_FILE_NOT_FOUND 가 나타납니다.
그래서...아직 해결되지 않았습니다. 내가 뭔가를 볼 수 있는지 확인 하겠습니다.
 
어떤 성공 친구. 또한 새로운 MT4 빌드 600에서 NamedPips 통신 문제가 발생했습니다. 'A'를 'W'로 변경했는지 테스트했지만 작동하지 않습니다.
 
rohitkat :
어떤 성공 친구. 또한 새로운 MT4 빌드 600에서 NamedPips 통신 문제가 발생했습니다. 'A'를 'W'로 변경했는지 테스트했지만 작동하지 않습니다.
'A' 대신 'W' 함수를 사용하여 DLL 호출을 변경하면 파이프 서버 코드도 변경해야 하는 것 같습니다. 더 나은 접근 방식은 StringToCharArray() 를 사용하여 유니코드 문자열을 ANSI로 변환하는 것입니다(제공된 링크는 mql5용이지만 MetaEditor에서 F1을 눌러 MQL4 참조에서 도움말을 찾을 수 있음). 여기여기 를 참조하십시오.
 
FMIC :


이것이 문제를 해결하는 데 가치가 있는지 여부는 모르겠지만 새 MT4 빌드에서 문자열은 일반적인 8비트 ASCII/ANSII 문자가 아니라 16비트 와이드 유니코드 문자 라는 것을 기억하십시오.

와이드 유니코드의 ASCII 문자는 ZERO 바이트로 구분되며 ASCII/ANSI와 함께 작동하는 많은 함수가 문자열을 ZERO 바이트(ASCIIZ)로 끝내기 때문에 일반적으로 하나의 문자만 처리합니다. "writefile" 경우에 대해 방금 설명한 동작입니다.

따라서 ASCII/ANSI가 아닌 와이드 유니코드를 처리하고 조작할 수 있는 적절한 기능을 사용하고 있는지 확인하십시오.

이것은 반드시 사실은 아니며, 유니코드가 사용되는 인코딩에 따라 다릅니다. 유니코드 문자 는 1~4바이트일 수 있습니다.