//+------------------------------------------------------------------+ //| teste.mq4 | //| Copyright 2013, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #define NMPWAIT_USE_DEFAULT_WAIT 0 #define NMPWAIT_NOWAIT 1 #include <stderror.mqh> #include <stdlib.mqh> #import "kernel32.dll" int CallNamedPipeA(string PipeName, string outBuffer, int outBufferSz, int& inBuffer[], int inBufferSz, int& bytesRead[], int timeOut); #import extern string PipeName = "\\\\.\\pipe\\Pipe1"; //extern string PipeName = "Pipe1"; extern string broker = "broker2"; extern color lineColor = Red; string pipe; int err; string sendmessage(string message) { int inBuffer[256]; int bytesRead[1]; bool check = CallNamedPipeA( pipe, message, StringLen(message)+1, inBuffer, 4*ArraySize(inBuffer), bytesRead, 3000); if (bytesRead[0] != 0) { message = ""; for(int i=0; i<bytesRead[0]; i++) message = message + CharToStr( (inBuffer[i/4] >> ((i & 3)*8)) & 0xff); return (message); } else{ err=GetLastError(); Print("error(",err,"): ",ErrorDescription(err)); } return (""); } //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //pipe = "\\\\.\\pipe\\"+PipeName; pipe = PipeName; string returned = sendmessage("Add:" + broker +";"+lineColor); Print(returned); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- string returned = sendmessage("Remove:" + broker); Print(returned); //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { string returned = sendmessage(broker + ";" + Bid + ";"); Print(returned); return(0); } //+------------------------------------------------------------------+
With this code in VB.net:
Private Sub CriaPipe() Dim openMode, pipeMode As Integer openMode = PIPE_ACCESS_DUPLEX Or FILE_FLAG_WRITE_THROUGH pipeMode = PIPE_WAIT Or PIPE_TYPE_MESSAGE Or PIPE_READMODE_MESSAGE hPipe = CreateNamedPipe(pipeName, openMode, pipeMode, 10, 10000, 2000, 10000, IntPtr.Zero) End Sub 'fica na espera que o mt4 se conecte para enviar informações Private Sub WaitPipeClients() Dim byteCount, i, res, cbnCount As Integer For i = 0 To BUFFSIZE - 1 'Fill an array of numbers Buffer(i) = i Mod 256 Next i 'Wait for a connection, block until a client connects Me.Refresh() Do res = ConnectNamedPipe(hPipe, 0) 'Read the data sent by the client over the pipe cbnCount = 4 res = ReadFile(hPipe, byteCount, Len(byteCount), cbnCount, 0) If byteCount > BUFFSIZE Then 'Client requested for byteCount bytes byteCount = BUFFSIZE 'but only send up to 20000 bytes End If 'Write the number of bytes requested by the client res = WriteFile(hPipe, Buffer, byteCount, cbnCount, 0) res = FlushFileBuffers(hPipe) MsgBox(res.ToString) 'Disconnect the named pipe. res = DisconnectNamedPipe(hPipe) 'Loop until the client makes no more requests for data. Loop Until byteCount = 0 End Sub
And this in mql4:
string PipeName = "\\\\.\\pipe\\"+Pipe; //string PipeName = Pipe; int inBuffer[256]; int bytesRead[1]; string sComment=""; Comment("Connecting to pipe server..."); bool fSuccess = CallNamedPipeA(PipeName,extMessage,StringLen(extMessage)+1,inBuffer,4*ArraySize(inBuffer),bytesRead,0) != 0; int lastError = GetLastError(); if (fSuccess || lastError == ERROR_MORE_DATA) { string inString = ""; for(int i=0; i<bytesRead[0]; i++) inString = inString + CharToStr( (inBuffer[i/4] >> ((i & 3)*8)) & 0xff); sComment = "Reply from server: "+inString; if(!fSuccess) sComment = sComment+ "\nSome data was lost. Increase receiving buffer size."; Comment(sComment); } else { Print("Last Error: ",lastError); Comment("CallNamedPipe Failed!"); } return(0);
the connexion works, I receive messsages in my .net app but it still waiting for clients and as the connection is sync all the other function by my app not function. I need implement now, async in vb.net for works perfectly...
In code in first topic, I have the async method, but the connection not works.
Anybory want help-me?
thanks
With this code in VB.net:
And this in mql4:
the connexion works, I receive messsages in my .net app but it still waiting for clients and as the connection is sync all the other function by my app not function. I need implement now, async in vb.net for works perfectly...
In code in first topic, I have the async method, but the connection not works.
Anybory want help-me?
thanks
I think you know and have found the code to pass string from terminal to terminal or even only from chart to chart (e.g. to create a 7min chart) by a namedpipe.
What about if you try to establish with this code a namedpipe from chart to chart. Then you have a working sender and a receiver and you continue from here?
I don't use PipeServer and PipeClient, but PipeReceiver and PipeSender which better explains which one is writing to the pipe and which one is listening to the pipe.
BTW I could be that I am using a different include files as this function
CallNamedPipeA(..)
is not present. Mine are NamedPipeClient and NamedPipeServer.. I remember that it took several tries to make it work..
Gooly
I think you know and have found the code to pass string from terminal to terminal or even only from chart to chart (e.g. to create a 7min chart) by a namedpipe.
What about if you try to establish with this code a namedpipe from chart to chart. Then you have a working sender and a receiver and you continue from here?
I don't use PipeServer and PipeClient, but PipeReceiver and PipeSender which better explains which one is writing to the pipe and which one is listening to the pipe.
BTW I could be that I am using a different include files as this function
is not present. Mine are NamedPipeClient and NamedPipeServer.. I remember that it took several tries to make it work..
Gooly
Thanks gooly.
Really, I work three days and nothing. This code above have errors. I need receive a message from server to send quotes to server. But I dont receive anything and the code return 0.
Well, I founded any exemples as c++ and c# pipes connections. I study more and maybe, finish this job.
Thanks gooly.
Really, I work three days and nothing. This code above have errors. I need receive a message from server to send quotes to server. But I dont receive anything and the code return 0.
Well, I founded any exemples as c++ and c# pipes connections. I study more and maybe, finish this job.
The funny is that the pipe connect ever, the problem is in data. I receive an estranger symbols, like a box and only the last char is correct.
EDIT: Oh shit...big shit...4 days...Only delete the lines FileWriteInteger(ExtPipe,size_str) and ok, works perfect.
THANKS FOR ALL THE HELP FROM YOU...
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hi everybody.
I use this code in my .net app:
Call in load or button:
Listen("Pipe1")
Private _pipeName As String
With an client in .net too, this code function perfect.
But I want to connect the mql4 as client in my .net app.
Who knows how can I make this? I try many exemples, include others format like pipe = "\\\\.\\pipe\\"+PipeName; many types of codes but anything connect my app. I try an exemple in in source code here, this code not generate errror, but I dont receive anything in my app.
Thanks all.