Mise à jour du MQL4 600 et des tuyaux nommés - page 2

 
SRC édité. J'ai toujours des problèmes pour appeler le fichier du serveur après la mise à jour vers 'W'. Des suggestions ?
 
sksyen:
SRC Edited. J'ai toujours des problèmes pour appeler le fichier du serveur après la mise à jour vers 'W'. Des suggestions ?


J'ai le même problème...

Je pense que mon problème se situe au niveau de la ligne writefile... Je n'envoie qu'une seule lettre. Si je veux envoyer le mot UPDATE seul le U est envoyé...

J'ai envoyé mon code à M. angevoyageur. C'est un modérateur si je ne me trompe pas. S'il m'aide, je vous envoie...

 
bisewski:


J'ai le même problème...

Je pense que mon problème se situe au niveau de la ligne writefile... Je n'envoie qu'une seule lettre. Si je veux envoyer le mot UPDATE seul le U est envoyé...

J'ai envoyé mon code à M. angevoyageur. C'est un modérateur si je ne me trompe pas. S'il m'aide, je vous envoie...


Je ne sais pas si cela peut vous aider à résoudre votre problème, mais rappelez-vous que dans la nouvelle version de MT4, les chaînes de caractères sont des caractères Unicode 16 bits, et non les caractères ASCII/ANSII 8 bits habituels.

Les caractères ASCII en Wide Unicode sont séparés par des octets ZERO, et comme de nombreuses fonctions qui travaillent avec ASCII/ANSI terminent une chaîne par un octet ZERO (ASCIIZ), elles ne traiteront généralement qu'UN seul caractère. Un comportement que vous venez de décrire pour votre cas "writefile".

Assurez-vous donc que vous utilisez les fonctions appropriées qui sont capables de traiter et de manipuler Wide Unicode et non ASCII/ANSI.

 
Il y a 2 exemples de tuyaux nommés dans notre paquet d'installation. Voir MQL4\Scripts\Exemples\Pipes
 

Merci Monsieur FMIC, je pense que vous avez raison.

Je suis en train de tester et je vais poster les résultats.

Du côté de mon application, en vb.net, j'ai ce code :

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

Cette ligne appelle le namedpipe dans mt4 et mt4 envoie un message pour lui.

J'essaie de changer pour CallNamedPipeW mais rien ne se passe.

Donc je reviens en mode ansi et je lis le résultat de cbRead. Si j'ai le texte dans mt4 pour envoyer "123456" le cbRead est = 7. Je mets n'importe quel texte, si la longueur = 100 je reçois 101. Mais seulement le premier caractère est lu comme dans UPDATE où je reçois U et cbRead = 7.

Pour obtenir la valeur dans cbRead je l'utilise

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

le textInArray.length est toujours = 257. Si ma chaîne est UPDATE est 257 et si ma chaîne est UP est 257.

EDIT :
Je sais pourquoi is = 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)
 
Si j'utilise CallNamedPipeW, je reçois l'erreur numéro 2 ERROR_FILE_NOT_FOUND
 
bisewski:
Si j'utilise CallNamedPipeW je reçois l'erreur numéro 2 ERROR_FILE_NOT_FOUND
Donc... pas encore résolu. Je vais vérifier si je peux voir quelque chose.
 
Tout succès les amis. Je suis également bloqué par le problème de communication de NamedPips sur le nouveau MT4 build 600. J'ai testé le changement de 'A' en 'W' mais cela ne fonctionne pas.
 
rohitkat:
Tout succès les amis. Je suis également bloqué par le problème de communication de NamedPips sur le nouveau MT4 build 600. J'ai testé le changement de 'A' en 'W' mais cela ne fonctionne pas.
Il me semble que si vous modifiez votre appel DLL en utilisant la fonction 'W' au lieu de 'A', vous devez également modifier le code de votre serveur pipe. Une meilleure approche peut être de convertir vos chaînes Unicode en ANSI avec StringToCharArray() (le lien fourni est pour mql5, mais vous pouvez trouver de l'aide dans la référence MQL4 en appuyant sur F1 dans MetaEditor). Voir ici et ici.
 
FMIC:


Je ne sais pas si cela peut vous aider à résoudre vos problèmes, mais rappelez-vous que dans la nouvelle version de MT4, les chaînes de caractères sont des caractères Unicode 16 bits, et non les caractères ASCII/ANSII 8 bits habituels.

Les caractères ASCII en Wide Unicode sont séparés par des octets ZERO, et comme de nombreuses fonctions qui travaillent avec ASCII/ANSII terminent une chaîne par un octet ZERO (ASCIIZ), elles ne traitent généralement qu'UN seul caractère. Un comportement que vous venez de décrire pour votre cas "writefile".

Assurez-vous donc d'utiliser les fonctions appropriées qui sont capables de traiter et de manipuler Wide Unicode et non ASCII/ANSI.

Ce n'est pas nécessairement vrai, cela dépend de l'encodage, quel Unicode est utilisé. Un caractère Unicode peut compter de 1 à 4 octets.