MQL4 600 ve Adlandırılmış Boruları Güncelleyin - sayfa 2

 
SRC Düzenlendi. 'W' sürümüne güncelledikten sonra sunucu dosyasını çağırmayla ilgili sorunlar devam ediyor. Baska öneri?
 
sksyen :
SRC Düzenlendi. 'W' sürümüne güncelledikten sonra sunucu dosyasını çağırmayla ilgili sorunlar devam ediyor. Baska öneri?


bende de aynı sorun var...

Benim sorunum writefile satırında... Sadece bir mektup gönderiyorum. GÜNCELLEME kelimesini göndermek istersem sadece U gönderilir ...

Kodumu Bay angevoyageur'a gönderiyorum . Haklıysam o bir moderatör. Eğer bana yardım ederse, sana gönderirim...

 
bisewski :


bende de aynı sorun var...

Benim sorunum writefile satırında... Sadece bir mektup gönderiyorum. GÜNCELLEME kelimesini göndermek istersem sadece U gönderilir ...

Kodumu Bay angevoyageur'a gönderiyorum . Haklıysam o bir moderatör. Eğer bana yardım ederse, sana gönderirim...


Bunun sorunlarınızı çözmek için bir değeri olup olmadığını bilmiyorum, ancak yeni MT4 yapısında dizelerin normal 8 bitlik ASCII/ANSII Karakterleri değil, 16 bit Geniş Unicode karakterler olduğunu unutmayın.

Geniş Unicode'daki ASCII karakterleri SIFIR baytlarla ayrılır ve ASCII/ANSI ile çalışan birçok işlev bir dizeyi SIFIR baytla (ASCIIZ) sonlandırdığından, genellikle yalnızca BİR karakteri işlerler. "writefile" durumunuz için az önce tanımladığınız bir davranış.

Bu nedenle, ASCII/ANSI'yi değil, Geniş Unicode'u işleyebilen ve değiştirebilen uygun işlevleri kullandığınızdan emin olun.

 
Kurulum paketimizde adlandırılmış borular için 2 örnek bulunmaktadır. Bkz. MQL4\Scripts\Örnekler\Borular
 

Teşekkürler Bay FMIC, haklı olduğunuzu düşünüyorum.

Test ediyorum ve sonuçları yazacağım.

Uygulama tarafım, vb.net'te şu koda sahibim:

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

Bu hat mt4'teki isimli boruyu çağırır ve mt4 onun için bir mesaj gönderir.

CallNamedPipeW olarak değiştirmeye çalışıyorum ama herhangi bir şey oluyor.

Bu yüzden ansi moduyla geri döndüm ve cbRead sonucunu okudum. Eğer mt4'te "123456" gönderecek metin varsa cbRead = 7'dir. Herhangi bir metin koyarım, uzunluk = 100 ise 101 alırım. Ancak UPDATE'deki gibi sadece ilk karakter okunur ve burada U ve cbRead = 7 olur.

Değeri cbRead'de almak için kullanıyorum

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

textInArray.length hiç = 257'dir. Dizim UPDATE ise 257 ve dizim UP ise 257'dir.

DÜZENLE:
Neden = 257 olduğunu biliyorum:

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 kullanırsam 2 ERROR_FILE_NOT_FOUND hata numarasını alıyorum
 
bisewski :
CallNamedPipeW kullanırsam 2 hata numarasını alıyorum ERROR_FILE_NOT_FOUND
Yani... henüz çözülmedi. Bir şey görebilir miyim diye kontrol edeceğim.
 
Herhangi bir başarı arkadaşlar. Ayrıca yeni MT4 build 600'de NamedPips iletişim sorununa takıldım. 'A'nın 'W' olarak değiştirilmesini test ettim ama çalışmıyor.
 
rohitkat :
Herhangi bir başarı arkadaşlar. Ayrıca yeni MT4 build 600'de NamedPips iletişim sorununa takıldım. 'A'nın 'W' olarak değiştirilmesini test ettim ama çalışmıyor.
Bana öyle geliyor ki, DLL çağrınızı 'A' yerine 'W' işlevini kullanarak değiştirirseniz, boru sunucu kodunuzu da değiştirmeniz gerekir. Unicode dizelerinizi StringToCharArray() ile ANSI'ye dönüştürmek daha iyi bir yaklaşım olabilir (sağlanan bağlantı mql5 içindir, ancak MetaEditor'da F1'e basarak MQL4 referansında yardım bulabilirsiniz). Buraya ve buraya bakın.
 
FMIC :


Bunun sorunlarınızı çözmek için bir değeri olup olmadığını bilmiyorum, ancak yeni MT4 yapısında dizelerin normal 8 bitlik ASCII/ANSII Karakterleri değil, 16 bit Geniş Unicode karakterler olduğunu unutmayın.

Geniş Unicode'daki ASCII karakterleri SIFIR baytlarla ayrılır ve ASCII/ANSI ile çalışan birçok işlev bir dizeyi SIFIR baytla (ASCIIZ) sonlandırdığından, genellikle yalnızca BİR karakteri işlerler. "writefile" durumunuz için az önce tanımladığınız bir davranış.

Bu nedenle, ASCII/ANSI'yi değil, Geniş Unicode'u işleyebilen ve değiştirebilen uygun işlevleri kullandığınızdan emin olun.

Bu mutlaka doğru değildir, hangi Unicode'un kullanıldığı kodlamaya bağlıdır. Bir Unicode karakteri 1 ila 4 bayt arasında olabilir.