资料库: 无需 DLL 的文件映射 - 页 3 12345678910...12 新评论 --- 2012.01.16 19:25 #21 Urain: 我想我们必须做某种有保障的测试。但我还不知道该怎么做。从逻辑上讲,关闭句柄会导致内存区域被释放。句柄关闭后,写入的数据会一直保留,直到被其他软件覆盖,就是这样。 Andrey Dik 2012.01.16 19:26 #22 sergeev: 如果使用文件来存储中间数据,当然也可以,但最重要的是在某些参考点将数据重置到磁盘上,因为一旦发生意外,信息就会不可挽回地丢失。 如果 "出了事",实际信息无论如何都会丢失。至于中间结果,可以定期转存到铁路上的文件中。 Mykola Demko 2012.01.16 19:34 #23 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)); } //+------------------------------------------------------------------+ --- 2012.01.16 19:51 #24 Urain:虽然分布式区域应该会丢失,而且在未创建文件的情况下打开已销毁的文件应该会导致错误。我认为这是一个错误。诀窍在于内存中有一个文件名。系统会检测到它。 --- 2012.01.17 10:53 #25 朋友们,我有一个请求。我需要从任何 API(包括非 Windows API)中找到一个不允许使用memcpy/strcpy 的 API 函数。也就是说,在某些情况下,返回指针的大小是未知的,或者返回的字符串不是以 NULL 结尾且大小未知。请帮我找出这种方法的应用限制... Boris 2012.05.01 05:39 #26 MT5 642 Win7 64 不工作,据我所知,在以下情况后hmem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,size+HEAD_MEM,path); // 创建内存对象 我得到错误信息 1400、但 Vista 32 可以正常运行。 --- 2012.05.01 09:42 #27 我检查过了,也是同样的错误。但是 =6. Boris 2012.05.01 11:28 #28 sergeev: 我检查过了,也是同样的错误。但是 =6.这一定是某种诡计。在直接启动模式下,错误信息为 6,但在调试模式下,错误信息为 1400。 Roman Ivanov 2013.01.02 16:17 #29 如何传输 int 或 double 数组?我做不到:( --- 2013.01.02 21:20 #30 baramantan: 如何传输 int 或 double 数组?我做不到:( 把它们当作 sizeof(<Type>)*<Number_Elements> 的长变量处理,这样就可以了:) 12345678910...12 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我想我们必须做某种有保障的测试。但我还不知道该怎么做。
从逻辑上讲,关闭句柄会导致内存区域被释放。
句柄关闭后,写入的数据会一直保留,直到被其他软件覆盖,就是这样。
如果使用文件来存储中间数据,当然也可以,但最重要的是在某些参考点将数据重置到磁盘上,因为一旦发生意外,信息就会不可挽回地丢失。
从逻辑上讲,关闭句柄将释放该内存区域。
但这并不意味着关闭句柄就能将该区域清零。 句柄关闭后,写入的数据仍然存在,直到被其他软件覆盖。
文件已关闭,句柄已销毁,我们打开一个 同名文件并读取必要的信息,尽管按照我们的想法,分布式区域应该丢失,而且在未创建文件的情况下打开一个已销毁的文件应该会导致错误。我不知道这是错误还是功能。
虽然分布式区域应该会丢失,而且在未创建文件的情况下打开已销毁的文件应该会导致错误。
我认为这是一个错误。
诀窍在于内存中有一个文件名。系统会检测到它。
朋友们,我有一个请求。
我需要从任何 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.
我检查过了,也是同样的错误。但是 =6.
这一定是某种诡计。在直接启动模式下,错误信息为 6,但在调试模式下,错误信息为 1400。
如何传输 int 或 double 数组?我做不到:(