что то поломано в 910 билде терминала.

 
Советник падает с ошибкой "Access violation at 0x000007FEFD377FD9 read to 0x0000000100000008" при вызове WinAPI. В то же время, проблема на 880 билде не воспроизводится. Подробности в сервис деске. Но там что то реакции никакой не могу дождаться. :(
 
micle:
Советник падает с ошибкой "Access violation at 0x000007FEFD377FD9 read to 0x0000000100000008" при вызове WinAPI. В то же время, проблема на 880 билде не воспроизводится. Подробности в сервис деске. Но там что то реакции никакой не могу дождаться. :(
Выкладывайте здесь код обьявления функции WinApi, код вызова функции, версию Windows и ее разрядность.
 

у меня Win7 х64. Терминал соответственно тоже х64


объявление

#define PIPE_ACCESS_DUPLEX             3
#define PIPE_TYPE_MESSAGE              4
#define PIPE_READMODE_MESSAGE          2
#define PIPE_NOWAIT                    1
#define PIPE_UNLIMITED_INSTANCES       255

#import "kernel32.dll"
   int CreateNamedPipeW(string pipeName, int openMode, int pipeMode,int maxInstances,int outBufferSize,int inBufferSize,int defaultTimeOut,int security);
   int CloseHandle(int fileHandle);
   int PeekNamedPipe(int PipeHandle, int PassAsZero, int PassAsZero2, int PassAsZero3, int &BytesAvailable, int PassAsZero4);
   int ReadFile(int FileHandle, string &buffer, int BufferLength, int &BytesRead, int PassAsZero);
#import

вызов

int CreatePipeInstance()
{
   int openMode = PIPE_ACCESS_DUPLEX;
   int pipeMode = PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_NOWAIT;
   return (CreateNamedPipeW(pipeName, openMode, pipeMode, PIPE_UNLIMITED_INSTANCES, 1000, 1000, 0, 0));
}

Фишка в том, что когда её вызываю без использования ООП всё работает.


Последовательность действий

Эксперимент 1:

-открываем 2 графика

-на 1 кидаем Sender

-на 2 кидаем Test


Эксперимент 2:

-открываем 2 графика

-на 1 кидаем Sender

-на 2 кидаем Host


Полученный результат

Эксперимент 1:

Sender отправляет, а Test - принимает сообщения


Эксперимент 2:

Host - падает с ошибкой "Access violation at 0x000007FEFD377FD9 read to 0x0000000100000008"

во время вызова функции CreateNamedPipeW.
Файлы:
PipesAPI.zip  30 kb
 

Вот правильное объявление функций для 64-разрядного терминала:

#define PVOID ulong
#define HANDLE PVOID

#import "kernel32.dll"
   HANDLE CreateNamedPipeW( string pipeName, uint openMode, uint pipeMode, uint maxInstances, uint outBufferSize, uint inBufferSize, uint defaultTimeOut, PVOID security );
   int CloseHandle( HANDLE hObject );
   int PeekNamedPipe( HANDLE hNamedPipe, PVOID lpBuffer, uint nBufferSize, PVOID lpBytesRead, uint& lpTotalBytesAvail, PVOID lpBytesLeftThisMessage );
   int ReadFile( HANDLE hFile, uchar& lpBuffer[], uint nNumberOfBytesToRead, uint& lpNumberOfBytesRead, PVOID lpOverlapped );
#import
 
micle:
Советник падает с ошибкой "Access violation at 0x000007FEFD377FD9 read to 0x0000000100000008" при вызове WinAPI. В то же время, проблема на 880 билде не воспроизводится. Подробности в сервис деске. Но там что то реакции никакой не могу дождаться. :(
Зачем Вы создаёте столько именованных каналов? Насколько я понимаю нужно создать один канал.
 
barabashkakvn:
Зачем Вы создаёте столько именованных каналов? Насколько я понимаю нужно создать один канал.
Согласен с Вами. Выбраный мной способ работы не самый правильный. Но в случае с MQL, правильный способ использования не представляется возможным. Поэтому я использую пайпы в режиме MESSAGEMODE и передаю за раз только лиш 1 сообщение.
 
Zloy_Koldun:

Вот правильное объявление функций для 64-разрядного терминала:

Спасибо, будем попробовать. Отпишу получилось ли...
 
Помогло. Спасибо!
 

Удивительно. На моей памяти, уже не первый раз в трудный момент здесь появляется "злой колдун", дает точный ответ и без лишних слов тихо растворяется в ночи.

Вот он, эффективный советчик. И рейтинг всего-то...!

Сдается мне что не злой он вовсе, а "добрый фрактал"... ))

Причина обращения: