アップデート MQL4 600 & ネイムドパイプ - ページ 2

 
SRCを編集しました。 W'にアップデートした後、サーバーファイルを呼び出す際にまだ問題があります。 何か提案はありますか?
 
sksyen:
SRCを編集しました。 W'に更新した後、サーバーファイルを呼び出すことにまだ問題がある。 何か提案はありますか?


私も同じ問題を抱えています...

私の問題は、writefileという行にあるようです。もし私がUPDATEという単語を送りたかったら、Uだけが送られるんだ。

私は私のコードをangevoyageur 氏に送りました 彼はモデレーターです。 もし彼が私を助けてくれるなら、私はあなたに送ります...

 
bisewski:


私も同じ問題を抱えています...

私の問題は、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を処理・操作できる適切な関数を使用していることを確認してください。

 
インストールパッケージには、名前付きパイプの 例が2つあります。関連項目: MQL4ScriptsEmplesPipes
 

サー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になります。しかし、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 が表示されます。
ということで...まだ解決していません。何かあれば確認 します。
 
成功した友人私も新しいMT4ビルド600でNamedPips通信の問題で立ち往生しています。A'を'W'に変更するテストをしましたが、うまくいきません。
 
rohitkat:
成功した友人私も新しいMT4ビルド600でNamedPips通信の問題で立ち往生しています。A'を'W'に変更するテストをしましたが、うまくいきません。
A'の代わりに'W'関数を使用するDLL呼び出しを変更する場合、パイプサーバーのコードも変更しなければならないようです。より良い方法は、StringToCharArray() でUnicode文字列をANSIに変換することです(提供されたリンクはmql5用ですが、MetaEditorでF1キーを押すとMQL4のリファレンスでヘルプを見つけることができます)。ここと ここを 参照してください。
 
FMIC:


しかし、新しいMT4ビルドでは、文字列は 通常の8ビットASCII/ANSII文字ではなく、16ビットWide Unicode文字 であることを思い出してください。

Wide UnicodeのASCII文字はZEROバイトで区切られており、ASCII/ANSIで動作する多くの関数はZEROバイト(ASCIIZ)で文字列を終了するので、通常は1文字しか処理されないのです。この挙動は、あなたが「writefile」のケースで説明したとおりです。

ですから、ASCII/ANSIではなく、Wide Unicodeを扱い、操作できる適切な関数を使用していることを確認してください。

これは必ずしも正しいとは言えません。どのUnicodeを使用するかは、エンコーディングに依存します。Unicodeの文字は、1バイトから4バイトまであります。