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

 
baramantan:

我不是超级程序员。但我不明白通用性体现在哪里?uchar只适用于正值。最小值为 0,最大值为 255。

任何超出 uchar 值的数据都将等于 uchar 的最大值或最小值。

根据我所说的,我一开始就问 "如何传递 int 或 double"。我没明白你的意思,头儿。

好吧,让我们来参观一下。

char uchar 为例,这两个变量的大小都是1 字节。

这意味着,通过互相赋值,我们不会 丢失字节,因此也不会 丢失原始数据的值。

看看这些表达式

uchar u=200; char c=u; u=c; Print(u);
c=-100; u=c; c=u; Print(c);

long/ulongint/uint 也是如此。

也就是说,以字节为单位大小相同的整型变量可以互相传递,而不会丢失字节信息。

顺便说一下,这意味着虽然 Expert Advisor 接受 ulong 类型的 MAGIC 数字,但您始终可以在程序中以 long(即带符号格式)设置和读取它们。


现在看看<some_type> 和 uchar。
例如 int。这意味着内存中的这 4 字节可以很容易地表示为 uchar[4] 数组
如果有double 8 字节),则可以表示为 uchar[8] 数组
这也适用于字符串的字节 - 在 MQL 中,它是 ushort 数组。
以及相应的,如果您有任何类型的结构,您可以很容易地以 uchar 数组的形式提供任何数据。

正是这些关于字节的基本概念被用于 MQL5 版本--内存中的虚拟文件CFastFile。它将任何数据存储在内存的 uchar 数组中。

也就是说,如果您不需要与外部程序交换数据。或者您以数据流的形式从其他程序接收数据--例如,读取 Internet 页面,并且这些数据不需要全部保存在光盘上,那么最好使用CFastFile 而不是 Windows 映射。

最后,完全整合https://www.mql5.com/zh/articles/364。

 
BoraBo:

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

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

我得到错误信息 1400、

但 Vista 32 可以正常运行。


这是因为 32 和 64 系统的指针大小不同

这个库文件是为 32 位终端制作的。

但如果使用 64 位终端,则应在所有隐含指针的地方(如 PBYTE、LPVOID 等,以及所有 memcpy 类型)使用 8 字节长类型。

 

但如何连接

#include <MemMapLib.mqh>
#include <Trade\Trade.mqh> 

它给出了

'GetLastError' - ambiguous call to overloaded function with the same parameters SymbolInfo.mqh  718     10
'GetLastError' - ambiguous call to overloaded function with the same parameters	SymbolInfo.mqh	725	57

而且这两个插件互不影响。

 
olyakish:

但如何连接

它会发出

而这两个内含物互不影响。

尝试使用上下文解析
 
sergeev:
尝试使用上下文分辨率::

谢谢

我不得不修改标准库。

//+------------------------------------------------------------------+
bool CSymbolInfo::CheckMarketWatch(void)
  {
//--- 检查是否在 MarketWatch 中选择了符号
   if(!Select())
     {
      if(::GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL)
        {
         printf(__FUNCTION__+": Unknown symbol '%s'",m_name);
         return(false);
        }
      if(!Select(true))
        {
         printf(__FUNCTION__+": Error adding symbol %d",::GetLastError());
         return(false);
        }
     }
//--- 成功
   return(true);
  }
//+------------------------------------------------------------------+
我不认为这是件好事....。
 
olyakish:

谢谢。

我不得不修改标准库。

我不认为这是件好事

你不明白。

我告诉过你kernel32::GetLastError,看看我的代码是如何实现的。

如果你对这个选项不满意,那就声明从kernel32 导入GetLastError,比如使用 int 参数。

 
sergeev:

你不明白。

我告诉过你kernel32::GetLastError,看看我的代码是如何实现的。

如果这个选项不适合你,那就声明导入kernel32 GetLastError,例如使用 int 参数。

也许我没有说清楚。

但我们必须

  • 要么改变标准库
  • 或者改变你的库。

因为这里有一个您的代码示例,其中附带了标准库。

//+------------------------------------------------------------------+
//|MemMap
Copyright © 2006-2013, FINEXWARE Technologies GmbH | //| 版权所有。
//|www.FINEXWARE.com |
//| 编程与开发 - 阿列克谢-谢尔盖耶夫、鲍里斯-格尔沙诺夫
//+------------------------------------------------------------------+
#property copyright "版权 © 2006-2013, FINEXWARE Technologies GmbH"
#property link      "www.FINEXWARE.com"
#property version   "1.00"
#include <MemMapLib.mqh>
#include <Trade\Trade.mqh> 


//------------------------------------------------------------------ OnStart
void OnStart()
{
        CMemMapFile hmem;
        long err=hmem.Open("Local\\test",111,modeCreate);
        
        uchar data[];
        StringToCharArray("Hello from MQL5!",data);
        err=hmem.Write(data,ArraySize(data));
        
        ArrayInitialize(data,0);
        hmem.Seek(0,SEEK_SET);
        err=hmem.Read(data,ArraySize(data));
        Print(CharArrayToString(data));
        
        hmem.Close();
}

编译时出现了同样的错误。

 

olyakish, 再仔细读读我写给你的信。

如果你对上下文不满意,我告诉你的正是我的意思。

  • "或为您的图书馆改动什么"。
 
sergeev:

你不明白。

我告诉过你kernel32::GetLastError,看看我的代码是如何实现的。

如果这个选项不适合你,那就声明从kernel32 GetLastError 导入,例如使用 int 参数。

当在代码中调用kernel32::GetLastError ,编译器会 调用 不带上下文的GetLastError

程序员只需规定调用带上下文的标准 WinAPI 函数的 MQL 类似程序。这样在后续修改中就不会出现问题。

因此,如果你修改了标准圣经,它就会被更新,所以你必须再次编辑它。

 
Urain:

因此,你修改了标准圣经,它就会更新,但你必须再次编辑它。

标准版就是标准版,所以没什么可做的,没办法。有一个错误 -- 向开发人员报告。别无他法。