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)
SRC编辑。 在更新到'W'之后,仍然有调用服务器文件的问题。 有什么建议吗?
我也有同样的问题...
我觉得我的问题出在writefile这一行......我只发送一个字母。如果我想发送UPDATE这个词,只有U被发送......
我把我的代码发给了angevoyageur 先生。 如果我没记错的话,他是一位版主。 如果他帮助我,我就发给你...
我也有同样的问题...
我觉得我的问题出在writefile这一行......我只发送一个字母。如果我想发送UPDATE这个词,只有U被发送......
我把我的代码发给了angevoyageur 先生。 如果我没记错的话,他是一位版主。 如果他帮助我,我就发给你...
我不知道这对解决你的问题是否有价值,但请记住,在新的MT4构建中,字符串是16位宽Unicode字符,而不是通常的8位ASCII/ANSII字符。
在Wide Unicode中的ASCII字符是由ZERO字节分开的,由于许多处理ASCII/ANSI的函数以ZERO字节(ASCIIZ)结束字符串,它们通常只处理一个字符。这就是你刚才描述的 "写文件 "的行为。
所以要确保你使用的是能够处理和操作Wide Unicode而不是ASCII/ANSI的适当的函数。
谢谢FMIC先生,我认为你是正确的。
我正在测试,我将公布结果。
在我的应用程序方面,在vb.net中我有这样的代码。
这一行在mt4中调用namedpipe,mt4为他发送了一个消息。
我试图改成CallNamedPipeW,但是任何事情都会发生。
所以我回到Ansi模式,读取cbRead的结果。如果我在mt4里有文本要发送 "123456" ,cbRead是=7,我放任何文本,如果长度=100,我收到101。但只有第一个字符被读取,就像UPDATE中我收到U和 cbRead=7。
为了获得cbRead中的值,我使用了这个代码
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
任何成功的朋友。我也被NamedPips的通讯问题困住了,在新的MT4版本600上。我已经测试过将'A'改为'W',但没有用。
我不知道这对解决您的问题是否有价值,但请记住,在新的MT4构建中,字符串是16位的Wide Unicode字符,而不是通常的8位ASCII/ANSII字符。
Wide Unicode中的ASCII字符由ZERO字节分隔,由于许多使用ASCII/ANSI的函数以ZERO字节(ASCIIZ)结束字符串,它们通常只处理一个字符。这就是你刚才描述的 "写文件 "的行为。
所以,请确保你使用的是能够处理和操作Wide Unicode而不是ASCII/ANSI的适当函数。