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

 
Urain:
我想我们必须做某种有保障的测试。但我还不知道该怎么做。

从逻辑上讲,关闭句柄会导致内存区域被释放。

句柄关闭后,写入的数据会一直保留,直到被其他软件覆盖,就是这样。

 
sergeev:
如果使用文件来存储中间数据,当然也可以,但最重要的是在某些参考点将数据重置到磁盘上,因为一旦发生意外,信息就会不可挽回地丢失。
如果 "出了事",实际信息无论如何都会丢失。至于中间结果,可以定期转存到铁路上的文件中。
 
sergeev:

从逻辑上讲,关闭句柄将释放该内存区域。

但这并不意味着关闭句柄就能将该区域清零。 句柄关闭后,写入的数据仍然存在,直到被其他软件覆盖。

文件已关闭,句柄已销毁,我们打开一个 同名文件并读取必要的信息,尽管按照我们的想法,分布式区域应该丢失,而且在未创建文件的情况下打开一个已销毁的文件应该会导致错误。我不知道这是错误还是功能。

#include <MemMapLib.mqh>
//+------------------------------------------------------------------+
//| 脚本程序启动功能|
//+------------------------------------------------------------------+
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(包括非 Windows API)中找到一个不允许使用memcpy/strcpy 的 API 函数。

也就是说,在某些情况下,返回指针的大小是未知的,或者返回的字符串不是以 NULL 结尾且大小未知。


请帮我找出这种方法的应用限制...

 

MT5 642 Win7 64 不工作,据我所知,在以下情况后

hmem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,size+HEAD_MEM,path); // 创建内存对象

我得到错误信息 1400、

但 Vista 32 可以正常运行。

 

我检查过了,也是同样的错误。但是 =6.

 
sergeev:

我检查过了,也是同样的错误。但是 =6.



这一定是某种诡计。在直接启动模式下,错误信息为 6,但在调试模式下,错误信息为 1400。

 
如何传输 int 或 double 数组?我做不到:(
 
baramantan:
如何传输 int 或 double 数组?我做不到:(
把它们当作 sizeof(<Type>)*<Number_Elements> 的长变量处理,这样就可以了:)