更新MQL4 600和命名管道 - 页 2

 
SRC已编辑。 更新到'W'后,在调用服务器文件方面仍有问题。 有什么建议吗?
 
sksyen:
SRC编辑。 在更新到'W'之后,仍然有调用服务器文件的问题。 有什么建议吗?


我也有同样的问题...

我觉得我的问题出在writefile这一行......我只发送一个字母。如果我想发送UPDATE这个词,只有U被发送......

我把我的代码发给了angevoyageur 先生 如果我没记错的话,他是一位版主。 如果他帮助我,我就发给你...

 
bisewski:


我也有同样的问题...

我觉得我的问题出在writefile这一行......我只发送一个字母。如果我想发送UPDATE这个词,只有U被发送......

我把我的代码发给了angevoyageur 先生 如果我没记错的话,他是一位版主。 如果他帮助我,我就发给你...


我不知道这对解决你的问题是否有价值,但请记住,在新的MT4构建中,字符串是16位宽Unicode字符,而不是通常的8位ASCII/ANSII字符。

在Wide Unicode中的ASCII字符是由ZERO字节分开的,由于许多处理ASCII/ANSI的函数以ZERO字节(ASCIIZ)结束字符串,它们通常只处理一个字符。这就是你刚才描述的 "写文件 "的行为。

所以要确保你使用的是能够处理和操作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)

这一行在mt4中调用namedpipe,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:
我知道为什么是= 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版本600上。我已经测试过将'A'改为'W',但没有用。
 
rohitkat:
任何成功的朋友。我也被NamedPips的通讯问题困住了,在新的MT4版本600上。我已经测试过将'A'改为'W',但没有用。
在我看来,如果你改变你的DLL调用,使用'W'函数而不是'A',你也必须改变你的管道服务器代码。一个更好的方法是用StringToCharArray() 将你的Unicode字符串转换为ANSI字符串(所提供的链接是针对mql5的,但你可以在MetaEditor中按F1键在MQL4参考中找到帮助)。见这里这里
 
FMIC:


我不知道这对解决您的问题是否有价值,但请记住,在新的MT4构建中,字符串是16位的Wide Unicode字符,而不是通常的8位ASCII/ANSII字符。

Wide Unicode中的ASCII字符由ZERO字节分隔,由于许多使用ASCII/ANSI的函数以ZERO字节(ASCIIZ)结束字符串,它们通常只处理一个字符。这就是你刚才描述的 "写文件 "的行为。

所以,请确保你使用的是能够处理和操作Wide Unicode而不是ASCII/ANSI的适当函数。

这不一定是真的,这取决于编码,即使用哪种Unicode。一个Unicode字符 可以是1到4个字节。