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

 
Urain:
Наверно нужно как то гарантированно проверить. Вот только пока не знаю как.

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

но это ведь не означает, что закрытие хендла должно очищать эту область на ноль.  Хендл закрыли, записанные данные остались до момента их перезаписи другим софтом.  как то так.

 
sergeev:
если вы используете файлы для хранения промежуточных данных, то конечно можно.  Главное сбрасывать данные на диск в каких то реперных точках, а то если что случится, то инфа ведь потеряется безвозвратно.
Если "что то случится", то актуальная инфа потеряется в любом случае. А промежуточные результаты, да, можно периодически сбрасывать в файл на жд.
 
sergeev:

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

но это ведь не означает, что закрытие хендла должно очищать эту область на ноль.  Хендл закрыли, записанные данные остались до момента их перезаписи другим софтом.  как то так.

Файл закрыт хендл уничтожен, открываем файл с тем же именем и читаем нужную инфу, хотя по идее распределённая область должна терятся и открытие уничтоженного файла без создания должно вызывать ошибку. Вот не знаю баг это или фича.

#include <MemMapLib.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   CMemMapFile *hmem=new CMemMapFile();
   int err=hmem.Open("Local\\test",111,modeCreate);// создаём файл

   uchar data[];
   int sizedata=StringToCharArray("Hello from MQL5!",data);
   err=hmem.Write(data,sizedata);  // пишим
   ArrayInitialize(data,0);

   CMemMapFile hm;
   err=hm.Open("Local\\test",111); // открываем файл, без содания
   uchar nextdata[];
   hm.Seek(0,SEEK_SET);
   err=hm.Read(nextdata,sizedata); // читаем
   Print(CharArrayToString(nextdata));

   ArrayInitialize(data,0);
   err=hmem.Open("Local\\test",111); // открываем файл, без содания
   hmem.Seek(0,SEEK_SET);
   err=hmem.Read(data,sizedata);     // читаем
   Print("до ",CharArrayToString(data));

   hmem.Close(); delete hmem; // закрываем файл
   hm.Close();                // закрываем файл

   ArrayInitialize(data,0);
   err=hm.Open("Local\\test",111);Print("err=",err);
   hm.Seek(0,SEEK_SET);
   err=hm.Read(data,sizedata);
   Print("после ",CharArrayToString(data));
  }
//+------------------------------------------------------------------+



 
Urain:

хотя по идее распределённая область должна терятся и открытие уничтоженного файла без создания должно вызывать ошибку.

думаю фича.

фича в том, что имя файла в памяти такое есть. И его система обнаруживает.

 

Народ, есть просьба.

Нужно найти такую API функцию - из любого API, в том числе и не виндового - при которой не получится использовать memcpy/strcpy 

то есть найти такой случай, когда по каким то причинам не будет известен размер возвращаемого указателя, или возвращаемая строка будет не NULL-terminated и без известного рамера.


Помогите пожалуйста отыскать границы применения этого метода...

 

MT5 642  Win7 64  не работает, насколько я понял то после 

hmem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,size+HEAD_MEM,path); // создаем объект памяти

получается ошибка 1400,

а Vista 32 работает.

 

 

проверил, у меня тоже ошибка. Но =6.



 
sergeev:

проверил, у меня тоже ошибка. Но =6.



 

Это наверно фишка какая то. При при прямом запуске дает err=6, а в режиме отладки  err=1400.

 

 
А как передовать int или double массивы? А то у меня не палучается :(
 
baramantan:
А как передовать int или double массивы? А то у меня не палучается :(
относитесь к ним как к длинным переменный размером  sizeof(<Тип>)*<Число_Элементов>  и все пАлучится :)
Причина обращения: