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

 
o_o:

Хорошо хоть не пробуете прочитать файл в памяти после перезапуска компьютера...


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

А какой путь будет корректным? Нужно реализовать передачу строки текста из одного терминала в другой с помощью MemMapLib.mqh.

 
Иван:

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

удастся

Нужно реализовать передачу строки текста из одного терминала в другой с помощью MemMapLib.mqh.

создаете файл, записываете, потом читаете

примерно в таком порядке

https://www.mql5.com/ru/code/10571

 
        CMemMapFile hmem;
        long err=hmem.Open("Local\\test",111,modeCreate);

Какой максимальный объём данных я смогу записать в открытый файл в памяти и затем считать?

У меня после 4096 начинает валиться эксперт на этом месте.

 
Код и распринтовку приведите
[Удален]  
HANDLE64 CMemMapFile::Open(LPTSTR path, DWORD size, int mode=modeOpen) 
{ 
m_size=size; m_path=path; m_mode=mode; m_pos=0; // начальное положение 
if (m_path=="") return(-1); 
m_hmem=Open(m_path, size, mode, err); 
if (m_hmem==NULL) return(err); // если ошибка создания 
return(0); 
} 

Привет, в приведенном выше коде "return(0)" нужно исправить на "return(m_hmem)", иначе не будет возвращаться хэндл файла, отображенного в памяти.

 

Попытался записать записать в файл строку длиной 200 символов, получил ошибку выхода за размерность массива в строке 214 библиотеки. Получается что при определении размера принимающего массива не учитывается размер заголовка.

 
Алексей Барбашин:

Получается <..>

не получается.

Код и распринтовку приведите

 
o_o:

не получается.

Код и распринтовку приведите


   string control_text = "Наша мама громко плачет, потому-что все свинячат. Тише мамочка, не плач! У других такой же срач...";
   string NAME_MAPPING = "Local\\" + Symbol() + "_" + (string)ChartID();
        
   uchar Data_sender[];
   int size_data = StringToCharArray(control_text, Data_sender);

   //--- Создаем объект работы с памятью
   CMemMapFile* MappingFile = new CMemMapFile();
   //--- Создаем файл для записи
   long err = MappingFile.Open(NAME_MAPPING, size_data+4, modeCreate);
        
   //--- Записываем данные в файл
   err = MappingFile.Write(Data_sender, size_data);
        
   //--- Закрываем запись
   MappingFile.Close();
   //--- Удаляем указатель
   delete MappingFile;
   
   uchar Data_receiver[];
   ArrayResize(Data_receiver, size_data);
   
   //--- Создаем объект работы с памятью
   CMemMapFile* MF = new CMemMapFile();
   //--- Открываем файл на чтение
   err = MF.Open(NAME_MAPPING, size_data+4, modeOpen);
   //--- Сдвигаем указатель чтения на начало файла
   MF.Seek(0,SEEK_SET);
   //--- Читаем данные из файла
   err=MF.Read(Data_receiver, size_data);
   //--- Закрываем файл      
   MF.Close();
   //--- Удаляем указатель
   delete MF;

   Print(CharArrayToString(Data_receiver));

С размерами разобрался. Но попытался прочитать файл другим объектом и получил на выходе тишину. Где ошибка?

 
Алексей Барбашин:

С размерами разобрался. Но попытался прочитать файл другим объектом и получил на выходе тишину. Где ошибка?

//--- Закрываем запись

это называется не закрываем запись, а закрываем и удаляем файл .

поэтому

//--- Открываем файл на чтение
вы пытаетесь открывать то, чего уже нет.
 
o_o:

это называется не закрываем запись, а закрываем и удаляем файл .

поэтому

вы пытаетесь открывать то, чего уже нет.

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