资料库: 无需 DLL 的文件映射 - 页 10

 
o_o:

至少你不会在重启电脑后试图读取内存中的文件...


所以我的理解是,我不能用这种方式在两个终端之间通过内存传输数据?

正确的方法是什么?我需要使用MemMapLib.mqh 实现从一个终端向另一个终端传输文本字符串

 
Иван:

所以我的理解是,我不能用这种方式在两个终端之间通过内存传输数据?

可以

您需要使用MemMapLib.mqh 实现从一个终端向另一个终端传输一行文本

创建文件、写入文件,然后读取文件。

大致顺序如下

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

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

我写入内存中打开的文件然后读取的最大数据量 是多少?

在 4096 之后,Expert Advisor 就会开始崩溃。

 
给我代码和打印输出
[删除]  
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:

不是关闭记录,而是关闭并删除文件

这就是为什么

你试图打开的东西并不存在。

好吧,有道理。我是在类比处理普通文件时的做法,关闭正是关闭和释放,而不是删除文件。