文章 "摆脱自制的 DLL"

 

新文章 摆脱自制的 DLL已发布:

如果 MQL5 语言的功能性不足以完成任务,MQL5 程序员不得不诉诸于其他工具。他们必须转向其他编程语言并创建中间 DLL。MQL5 可提供各种数据类型并将它们传递至 API,但遗憾的是,MQL5 无法解决从收到的指针提取数据的相关问题。在本文中,我们将循规蹈矩,说明交换和使用复杂数据类型的简单机制。

使用 memcpy 复制 4 字节的示例

作者:o_O

 
感谢您的文章,问题是:使用memcpy 函数时,在示例中我们用 int 写地址,如果系统是 x64,是否应该使用 long 变量?如何通过编程找出系统(x64、x86)?谢谢。
 

关于 long 的问题 - 如果使用 int 作为从字符数组中接收类似内容的 4 字节接收器,则可以,但完全没有必要。(也就是说,你使用 & 指针传递)。

如何查找 - 在此您可以 http://forum.ixbt.com/topic.cgi?id=26:37968

 
sergeev:

关于 long 的问题 - 如果使用 int 作为从字符数组中接收类似内容的 4 字节接收器,则可以,但完全没有必要。(也就是说,你使用 & 指针传递)。

如何查找 - 这里可以 http://forum.ixbt.com/topic.cgi?id=26:37968

能否说明一下这种结构的交换时间(例如,10 个 Int 格式的数字)?
 
shelandr:
能否说明一下该结构中的交换时间(例如,10 个 Int 格式的数字)?

澄清问题。

你是在问memcpy 的速度吗? 我认为这是一个创造性的问题,与风库的工作有关,而不是与 mql 有关。

 
关于使用外部 DLL 应用程序接口的文章非常有用,信息量也很大。非常感谢。
 

下午好。尽管这篇文章是很久以前写的,但使用库 dlls 进行数据交换的问题仍然具有现实意义。我自己最近也需要实现某种功能,当时我有一个选择:编写自己的 dll 还是尝试使用库 dll。我选择了后者,自然也面临着传输结构和取回数据的困难。读完这篇文章后,我并没有完全理解其中的一些要点,在我看来,这些要点非常复杂。在这篇文章中,当将结构体传输到外部环境时,建议使用数组作为分配的内存区域,库函数会将结果存入该区域,我们需要转换该区域以便进一步工作。我在这方面的经验很少,也许我的推理会显得很外行,但我还是要表达一下自己的观点,希望聪明人能指正我。让我们来看一篇旧文章 https://www.mql5.com/zh/articles/1543 中提到的一个简单例子。

这篇文章涉及通过库 dlls 搜索文件的问题。它还建议传递一个指向所需大小数组的指针,然后从数组中提取所需数据。

什么是结构体?就是同一个内存区域。现在,让我们尝试改变传递结构和提取数据的方法:

// 声明数据类型定义

#define  DWORD int
#define  TCHAR short // 设置该类型,因为我们将使用 unicode
#define  MAX_PATH (260)

// 声明 FILETIME 结构
struct FILETIME {
  DWORD dwLowDateTime;
  DWORD dwHighDateTime; 
};

// 声明搜索结果的数据结构
struct _WIN32_FIND_DATA {
  DWORD dwFileAttributes;
  FILETIME ftCreationTime;
  FILETIME ftLastAccessTime;
  FILETIME ftLastWriteTime;
  DWORD nFileSizeHigh;
  DWORD nFileSizeLow;
  DWORD dwReserved0;
  DWORD dwReserved1;
  TCHAR cFileName[MAX_PATH];
  TCHAR cAlternateFileName[14]; 
};

// 通过声明数据类型,我们可以复制 WinAPI 结构,而无需做任何更改
// 导入库函数
#import "kernel32.dll"
   int  FindFirstFileW(string path, _WIN32_FIND_DATA& answer);
#import 
//+------------------------------------------------------------------+
//| 专家初始化函数|
//+------------------------------------------------------------------+
int OnInit()
  {
// 用之前创建的结构类型创建一个变量 
   _WIN32_FIND_DATA data;
// 调用库函数,传递指向我们的结构的指针,实际上也是指向分配的内存的指针 
int handle = FindFirstFileW(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Experts\\*.mq5", data);
   if(handle!=-1)
      {
        // 通过访问我们结构中的字段查看搜索结果,无需额外转换 
Print("找到文件名:", ShortArrayToString(data.cFileName));   
         Print("临时找到的文件名:", ShortArrayToString(data.cAlternateFileName));
         Print("找到的文件大小:", data.nFileSizeLow); 
      }
//---
   return(INIT_SUCCEEDED);
  }
//+-
Групповые файловые операции
Групповые файловые операции
  • 2008.07.15
  • MetaQuotes Software Corp.
  • www.mql5.com
Иногда требуется проделать одинаковые операции для некоторой группы файлов. Если у вас есть список файлов, входящих в эту группу, то это не проблема. Но если этот список нужно получить самостоятельно, то возникает вопрос: "Каким образом?" В статье предлагается сделать это с помощью функций FindFirstFile() и FindNextFile(), входящих в библиотеку kernel32.dll.
 
Алексей Барбашин: 还有人建议传递一个指向所需大小数组的指针,然后从该数组中提取所需数据。他们还建议传递一个指向所需大小数组的指针,然后从该数组中提取所需数据。

结构体本质上是什么?就是相同的内存部分。现在,让我们尝试改变传递结构和提取数据的方法:

我通过编辑器正确粘贴了您的代码

 
Rashid Umarov:

通过编辑器正确粘贴了您的代码


非常感谢!我还不知道如何在这里正确地格式化代码。(((

 
Алексей Барбашин:

非常感谢!我还不知道如何在这里正确编码。(((


如何 插入代码

 
Vladimir Karputov:

如何 插入代码


谢谢!I'll look into it!)))