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

 
o_O:

lib 不会绑定到分区,因为理论上代码可以在不同进程中执行。

要控制它,可以使用您的变量或https://www.mql5.com/zh/code/1835

我的理解是否正确,即如果命名了一个互斥器,我就可以从任何进程中获取它的句柄,而不仅仅是从 metatrader 中获取?
 
Al_key:
我的理解是否正确,如果 mutex 被命名,我就可以从任何进程中获取它的句柄,而不仅仅是 metatrader?
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686931%28v=vs.85%29.aspx 我自己找到了答案。的确,它们可以在进程间共享。
 

向作者提问。

我在 mt4 中使用类。如果我关闭并打开终端,一切都会停止工作。如果在关机前删除智能交易系统,然后在打开终端后再将其连接上,这样做并不方便。有什么办法可以规避这个问题吗?

第二个问题。我无法读取用 Delphi 编写的程序所创建的文件映射。有什么细微差别。

简而言之,这些是在许多终端上运行的交易面板。

 
Dmitry Luck'janenko:


如果关闭并打开终端,一切都会停止工作。如果在关机前删除 EA,然后在打开终端后再附加它们,就不是很方便。有没有办法解决这个问题?

有必要记录并查看文件在去初始化过程中发生了什么。

我无法读取文件映射

读取 "指的是 winapi 的什么函数?

 
o_O:

在这种去初始化过程中,有必要记录并查看文件发生了什么。

读取 "指的是 winapi 中的哪个函数?

问题是,该函数

HANDLE64 CMemMapFile::Open(LPTSTR path, DWORD size, int mode=modeOpen)

总是返回 0。


这就是我不知道文件是否打开的原因。

上图是 Expert Advisor 打开尚未创建的文件映射的日志。没有任何错误。

也许函数

CMemMapFile::Open

但由于返回的句柄始终为 0,因此无法进行检查以避免在每个 tick 时不断打开文件。

关于第二个问题。

我在 Delphi 中创建了一个应用程序,用于创建文件映射。在连接时,出现了错误。即没有正确传递数字。我开始使用 {$Align Off} 对齐。

我还遇到了其他错误,比如读取 "msvcrt.dll "中 0x04E91000 的访问违规。

现在数据正常对齐了 19 个字节 - "00:35:50.260 Panel v 1.00 GBPUSD.m,M5:OnInitsizeof(PipeData)= 19"。


但在读取时,所有数据都为零。

 
Dmitry Luck'janenko:

问题是函数

总是返回 0。

这就是为什么我无法真正理解文件是否已打开。

没错,CMemMapFile::Open 返回错误代码,或者在没有错误时返回 0。

(不像CMemMapApi:,它会返回一个打开的句柄,并将错误写入传递的参数)。

而句柄位于 m_hmem。



在 delphi 中,您创建了一个创建文件映射的应用程序。在连接时,会出现错误。即传递的数字不正确。

您是否考虑了文件开头的保留 DWORD 字节?
 
o_O:


您是否考虑了文件开头的预留 DWORD 字节?
我试试看,我没算过。
 
Dmitry Luck'janenko:
我试试看,我没数过。

看看源文件是如何写入或创建的。

关于 m_size 参数

 
o_O:

正确时,CMemMapFile::Open 将返回错误代码 或 0。

(不像CMemMapApi:,它会返回一个打开句柄,并将错误写入传递的参数)。

而句柄位于 m_hmem。


你是否考虑了文件开头的保留 DWORD 字节?
2016.03.04 19:00:00.897 BuyNow Client v 1.03 USDCHF.m,M5: BuyNow Client v 1.03.mq4, handle=8589934592


在打开不存在的文件映射时为 m_hmem。如何确定这是错误还是句柄?

 
Dmitry Luck'janenko:

是 m_hmem,当打开一个不存在的文件映射时。如何确定是错误还是句柄?

我编写的 CMemMapFile::Open 返回错误代码,或者在没有错误时返回 0。