Библиотеки: File Mapping без DLL - страница 8

 
o_O:
я ж написал, что CMemMapFile::Open возвращает код ошибки или 0 когда ошибки нет

В начале беседы я выкладывал скрин первоначально там было то что возвращает функция CMemMapFile::Open

это был 0 как будто ошибки нет.


Потом я исправил чтобы посмотреть хэндл не равен ли он NULL

Print(__FILE__,", handle=",MapFile.m_hmem);

и в результате получил

2016.03.04 19:00:00.897    BuyNow Client v 1.03 USDCHF.m,M5: BuyNow Client v 1.03.mq4, handle=8589934592

Ошибки нет , есть хэндл что тебе еще надо скажете вы... но файловое отображение никто не создавал... И открыть не созданное не возможно.

Или может быть такое отображение кем-то другим создано и я об этом не знаю ???

Какая-то программа создает отображение с таким точно именем :-)

#define HADER "BuyNow v10"
CMemMapFile MapFile;
long handl;
int OnInit()
  {

//--- create timer
//---
      EventSetMillisecondTimer(Timer);
      handl=MapFile.Open(StringConcatenate("Local\\","_",HADER,"_",GetSymbol(),"_",((ServerAccauntNumber==0) ?  AccountNumber():ServerAccauntNumber)),BUF_SIZE+HEAD_MEM,modeOpen);
      Print(__FILE__,", handle=",MapFile.m_hmem);
//---
   return(INIT_SUCCEEDED);
  }
 

Dmitry Luck'janenko:


Или может быть такое отображение кем-то другим создано и я об этом не знаю ???

Какая-то программа создает отображение с таким точно именем :-)


ну вы же перед этим сами создали что то )

винда просто так с памятью работает.  Ничего не чистит сразу. Поэтому и данные старые могут висеть и открываться.

Но когда идет перезапись, то уже не откроет.  Вы вероятно не делали ничего между открытиями.
 

Превосходная библиотека, использовал вкупе с мьютексами для написания локального копировшика

В качестве Важной составляющей для приемника получал размер файла и от него строил цикл,

обнаружилось несколько косячков - из-за которых то ArrayOutOfRange, то нехватка 4х байтов

 

 Поправил

//------------------------------------------------------------------    Write
int CMemMapApi::Write(HANDLE64 hmem, const uchar &buf[], DWORD pos, int sz, DWORD &err) // запись в память указанное число байт
{
        if (hmem==NULL) return(-1);
        PBYTE64 view=ViewFile(hmem, err); if (view==0 || err!=0) return(-1); // если не открыт
        DWORD size=GetSize(hmem, err); if (pos+sz>size) { UnViewFile(view); return(-2); }; // если размер меньше, то выходим
        uchar src[]; 
        ArrayResize(src, size+HEAD_MEM); 
        memcpyX(src, view, size+HEAD_MEM); // взяли байтбуфер
        for(int i=0; i<sz; i++)
        { 
        src[pos+i+HEAD_MEM]=buf[i]; // записали в память
        }
        memcpyX(view, src, size+HEAD_MEM); // скопировали обратно
        UnViewFile(view); // закрыли просмотр
        return(0); // вернули ОК
}
//------------------------------------------------------------------    Read
int CMemMapApi::Read(HANDLE64 hmem, uchar &buf[], DWORD pos, int sz, DWORD &err) // чтение из памяти указанное число байт
{
        if (hmem==NULL) return(-1);
        PBYTE64 view=ViewFile(hmem, err); if (view==0 || err!=0) return(-1); // если не открыт
        DWORD size=GetSize(hmem, err); // получили размер
        uchar src[]; 
        ArrayResize(src, size+HEAD_MEM);
        memcpyX(src, view, size+HEAD_MEM); // взяли байтбуфер
        ArrayResize(buf, sz);
        int i=0; 
        for(i=0; i<sz && pos+i<size; i++) 
        {
        buf[i]=src[pos+i+HEAD_MEM]; // читаем байты
        //i++;
        }
        UnViewFile(view); // закрыли просмотр 
        return(i); // число скопированных байт
}
 

Если создавать MMF через MQL5  и писать туда,а потом читать.

То все хорошо.А если я создал  MMF другой программой,то при попытке записать или считать оттуда-вылетает критическая ошибка.

В чем проблема? 

 
Alex19791979:

Если создавать MMF через MQL5  и писать туда,а потом читать.

То все хорошо.А если я создал  MMF другой программой,то при попытке записать или считать оттуда-вылетает критическая ошибка.

В чем проблема? 


Клуб телепатов напряженно пытается угадать номер крит. ошибки.

 
Alexey Volchanskiy:

Клуб телепатов напряженно пытается угадать номер крит. ошибки.

у топикстартера блокировка от телепатического воздействия
 

Сообщение MT5 об критической ошибке без указания кода ошибки.Если был бы код,то указал бы.

 
Alex19791979:

То все хорошо.А если я создал  MMF другой программой,то при попытке записать или считать оттуда-вылетает критическая ошибка.

В чем проблема? 

- проверить нет ли ошибок при открытии файла
- проверить доступный выделенный объем для чтения/записи во всех функциях работы с массивами/строками(учесть 2 байта)
и т.д.

 

Проблема решена.

Нужно писать и считывать сторонним приложением файлы MMF начиная с 4 байта,а не с 0. 

А для MT5 4 байта не учитываются.Даже если 0-вое смещение.

Поэтому когда сторонняя программа у меня записывала с 0 байта,то при попытке прочитать MT5 вылетала ошибка.

 
Alex19791979:

Проблема решена.

Нужно писать и считывать сторонним приложением файлы MMF начиная с 4 байта,а не с 0. 

А для MT5 4 байта не учитываются.Даже если 0-вое смещение.

Поэтому когда сторонняя программа у меня записывала с 0 байта,то при попытке прочитать MT5 вылетала ошибка.

может вы не учли, что тут в классе первые байты отведены под заголовок, где хранится размер файла?
Причина обращения: