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ビルドでは、文字列は通常の8ビットASCII/ANSII文字ではなく、16ビットWide Unicode文字であることを忘れないでください。
Wide UnicodeのASCII文字はZEROバイトで区切られており、ASCII/ANSIを扱う多くの関数はZEROバイト(ASCIIZ)で文字列を終了するため、通常は1文字しか処理されないのです。この挙動は、あなたが「writefile」のケースで説明したとおりです。
ですから、ASCII/ANSIではなく、Wide Unicodeを処理・操作できる適切な関数を使用していることを確認してください。
サーFMIC、ありがとうございます。
今テストしているので、その結果を投稿します。
私は私のアプリ側では、vb.netで私はこのコードを持っている。
この行は、mt4のnamedpipeを呼び出し、mt4が彼に代わってメッセージを送信しています。
私はCallNamedPipeWに変更しようとしましたが、何も起こりません。
そこで、ansiモードに戻し、cbReadの 結果を読みました。mt4に "123456 "というテキストを 送ると、 cbReadは7になります。しかし、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 が表示されます。
成功した友人私も新しいMT4ビルド600でNamedPips通信の問題で立ち往生しています。A'を'W'に変更するテストをしましたが、うまくいきません。
しかし、新しいMT4ビルドでは、文字列は 通常の8ビットASCII/ANSII文字ではなく、16ビットWide Unicode文字 であることを思い出してください。
Wide UnicodeのASCII文字はZEROバイトで区切られており、ASCII/ANSIで動作する多くの関数はZEROバイト(ASCIIZ)で文字列を終了するので、通常は1文字しか処理されないのです。この挙動は、あなたが「writefile」のケースで説明したとおりです。
ですから、ASCII/ANSIではなく、Wide Unicodeを扱い、操作できる適切な関数を使用していることを確認してください。