Кто-то спрашивал, нужно ли использовать Named Pipes из MT4 для связи с другой программой, так что вот интерфейс и пример кода. Это решение без DLL, использующее только MQL4. Это предполагает, что вы уже знакомы с именованными каналами. Если нет, вы можете прочитать о них на
http://msdn.microsoft.com/en-us/libr...80(VS.85).aspx

Я действительно должен превратить это в библиотеку, но сейчас у меня нет времени. Если кто-то хочет это сделать, не стесняйтесь.

Сначала интерфейс:
Строка вставленного кода PipeNamePrefix = \\\\. \\ pipe \\; int BufferSize = 256; #define PIPE_ACCESS_INBOUND 1 #define PIPE_ACCESS_OUTBOUND 2 #define PIPE_ACCESS_DUPLEX 3 #define PIPE_TYPE_BYTE 0 #define PIPE_TYPE_MESSAGE 4 #define PIPE_READMODE_BYTE 0 #define PIPE_READMODE_MESSAGE 2 #define PIPE_WAIT 0 #define PIPE_NOWAIT 1 #define INVALID_HANDLE_VALUE 0xffffffff #define GenericRead 0x80000000 #define GenericWrite 0x40000000 #define OPEN_EXISTING 3 внешняя строка PipeName = MetaTrader; int PipeHandle = INVALID_HANDLE_VALUE; int Buffer # 91; 64 # 93 ;;/4 байтаint * 64 = 256 #import kernel32.dll int CreateNamedPipeA (строка pipeName, int openMode, int pipeMode, int maxInstances, int outBufferSize, int inBufferSize, int defaultTimeOut, int security); int WaitNamedPipeA (строка lpNamedPipeName, int nTimeOut); bool PeekNamedPipe (int pipeHandle, int buffer # 91; # 93 ;, int bufferSize, int bytesRead # 91; # 93 ;, int totalBytesAvail # 91; # 93 ;, int bytesLeftThisMessage # 91; # 93;); int CreateFileA (имя строки, int требуемый доступ, int SharedMode, защита int, создание int, флаги int, int templateFile); int WriteFile (int fileHandle, int buffer # 91; # 93 ;, int bytes, int numOfBytes # 91; # 93 ;, int перекрывается); int ReadFile (int fileHandle, int buffer # 91; # 93 ;, int bytes, int numOfBytes # 91; # 93 ;, int перекрывается); int CloseHandle (int fileHandle); int GetError (); #import Чтобы открыть канал как клиент, сделайте следующее:

Вставленный код FullPipeName = PipeNamePrefix PipeName; if (PipeHandle == INVALID_HANDLE_VALUE) {if (WaitNamedPipeA (FullPipeName, 1) == 0) {//Печать (канал недоступен); вернуть; } PipeHandle = CreateFileA (FullPipeName, GenericRead | GenericWrite, 0, 0, OPEN_EXISTING, 0, 0); Печать (Symbol (),: PipeHandle =, PipeHandle); if (PipeHandle == INVALID_HANDLE_VALUE) {Печать (Ошибка открытия трубы); вернуть; }} Читать из трубы немного сложно. Вы не можете читать непосредственно в строки, поэтому я читаю в массив int, а затем преобразую массив в строку.
ReadFile вставленного кода (PipeHandle, Buffer, BufferSize, bytesRead, 0); message = StringFromBuffer (bytesRead # 91; 0 # 93;); string StringFromBuffer (int length) {string message =; for (int i = 0; i lt; длина; i ) {int c = буфер # 91; i4 # 93 ;; int off = i% 4; int shift = 0; if (off == 1) shift = 8; иначе if (off == 2) shift = 16; иначе if (off == 3) shift = 24; c = (c gt; gt; shift) 0xff; сообщение = сообщение CharToStr (с); } return (сообщение); } И написать в трубу:
Вставленный код CopyToBuffer (orderMessage); result = WriteFile (PipeHandle, Buffer, BufferSize, numOfBytes, 0); void CopyToBuffer (string message) {for (int i = 0; i lt; 64; i ) Buffer # 91; i # 93; = 0; for (i = 0; i lt; StringLen (сообщение); i ) {int off = i% 4; int shift = 0; if (off == 1) shift = 8; иначе if (off == 2) shift = 16; иначе if (off == 3) shift = 24; Буфер # 91; я4 # 93; | = StringGetChar (message, i) lt; lt; сдвиг; }}