Обновление MQL4 600 и именных труб - страница 2

 
SRC Отредактировано. Все еще есть проблемы с вызовом файла сервера после обновления до 'W'. Есть предложения?
 
sksyen:
SRC Отредактировано. Все еще есть проблемы с вызовом файла сервера после обновления до 'W'. Есть предложения?


У меня та же проблема...

Я думаю, что моя проблема в строке writefile... Я отправляю только одну букву. Если я хочу отправить слово UPDATE, то отправляется только буква U...

Я отправил свой код господину angevoyageur. Он модератор, если я правильно понял. Если он мне поможет, я отправлю вам...

 
bisewski:


У меня та же проблема...

Я думаю, что моя проблема в строке writefile... Я отправляю только одну букву. Если я хочу отправить слово UPDATE, то отправляется только буква U...

Я отправил свой код господину angevoyageur. Он модератор, если я правильно понял. Если он мне поможет, я отправлю вам...


Я не знаю, имеет ли это значение для решения ваших проблем или нет, но помните, что в новой сборке MT4 строки являются 16-битными символами Wide Unicode, а не обычными 8-битными ASCII/ANSII Characters.

Символы ASCII в Wide Unicode разделяются байтами ZERO, и поскольку многие функции, работающие с ASCII/ANSI, заканчивают строку байтом ZERO (ASCIIZ), они обычно обрабатывают только ОДИН символ. Поведение, которое вы только что описали для вашего случая "writefile".

Поэтому убедитесь, что вы используете соответствующие функции, способные обрабатывать и манипулировать Wide Unicode, а не ASCII/ANSI.

 
В нашем установочном пакете есть 2 примера для именованных труб. См. MQL4\Scripts\Examples\Pipes
 

Спасибо, сэр FMIC, я думаю, что вы правы.

Я тестирую и опубликую результаты.

На стороне приложения, в vb.net у меня есть такой код:

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

Эта строка вызывает namedpipe в mt4 и mt4 посылает сообщение для него.

Я пытаюсь изменить на CallNamedPipeW, но ничего не происходит.

Тогда я вернулся в режим ansi и прочитал результат cbRead. Если у меня есть текст в mt4 для отправки "123456", cbRead = 7. Я помещаю любой текст, если длина = 100, я получаю 101. Но считывается только первый шаректер, как в UPDATE, где я получаю U и cbRead = 7.

Чтобы получить значение в cbRead, я использую это.

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

textInArray.length всегда = 257. Если моя строка UPDATE равна 257 и если моя строка UP равна 257.

EDIT:
Я знаю, почему is = 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.
Так что... пока не решено. Я проверю, смогу ли я что-нибудь увидеть.
 
Есть успехи, друзья. Я тоже застрял с проблемой связи NamedPips на новом MT4 build 600. Я тестировал замену 'A' на 'W', но не работает.
 
rohitkat:
Есть успехи, друзья. Я тоже застрял с проблемой связи NamedPips на новом MT4 build 600. Я тестировал замену 'A' на 'W', но не работает.
Мне кажется, что если вы измените вызов DLL, используя функцию 'W' вместо 'A', вам также придется изменить код вашего сервера. Лучшим подходом может быть преобразование ваших строк Unicode в ANSI с помощью StringToCharArray() (ссылка дана для mql5, но вы можете найти справку в справке MQL4, нажав F1 в MetaEditor). См. здесь и здесь.
 
FMIC:


Я не знаю, имеет ли это значение для решения ваших проблем или нет, но помните, что в новой сборке MT4 строки являются 16-битными символами Wide Unicode, а не обычными 8-битными символами ASCII/ANSII.

Символы ASCII в Wide Unicode разделяются байтами ZERO, и поскольку многие функции, работающие с ASCII/ANSI, завершают строку байтом ZERO (ASCIIZ), они обычно обрабатывают только ОДИН символ. Поведение, которое вы только что описали для случая "writefile".

Поэтому убедитесь, что вы используете соответствующие функции, способные обрабатывать и манипулировать Wide Unicode, а не ASCII/ANSI.

Это не обязательно так, это зависит от кодировки, в которой используется Unicode. Символ Unicode может содержать от 1 до 4 байт(ов).