文章 "用 Delphi 为 MQL5 编写 DLL 指南" - 页 2

 
marketeer:
你至少应该增加一段关于调试的内容。文章提到了 AV 可能发生的一种情况,但即使撇开大量其他潜在的错误源不谈,试图手动(通过眼睛或头脑)搜索错误位置也可能需要很长时间,而且不会成功。

感谢您的评论。我认为这一部分可以扩展到最常见的错误。不过,为了避免 "长时间且不成功 "地搜索错误,请按照文章中的方法去做。文中的示例是可行的。此外,还可以使用MetaEditor 中的调试器,它具有逐步调试和断点 功能,非常实用!

在这篇文章中,我不想教任何人如何编程。如果有人犯了初级错误就大声嚷嚷, ,也许他还不应该创建自己的DLL,而应该开始学习 Mat 部分。

 

你好, HideYourRichess。

你写得真快你写了这么多东西!你应该自己写关于 Delphi的文章

我会尽量按顺序简要回答:

1. Юниты SysUtils и Classes нужно было оставить в проекте.

SysUtils 在项目中! 与此无关!除了SysUtils 之外,异常处理程序是在System 中实现的,而System 默认是连接的,所以我认为没有必要担心。

2. 您不应该在DllEntryPoint (又名 DllMain)中使用各种程序。

DllEntryPoint 示例在互联网上随处可见。这是创建 DLL 事件的标准方法,例如,您可以将内存的 分配和从堆中释放 绑定到这些事件中。如果你对这种内存处理方法有真正的错误,我愿意考虑。

我不会争论其他所有不能在DllEntryPoint 中完成的事情,因为我并不经常使用它。

3. 您写了很多关于内存管理器的内容。我只想强调一下您的结论

因此,您可以让 DLL 和应用程序使用一个内存管理器,它就是 MT4 内存管理器。

问题是,我们都不知道 MT5MT4的内存管理器是如何 工作的。即使我们知道实现该管理器的函数名称,您又该如何使用它,因为 MT5 的API 是封闭的!因此,只需一个 MT5 管理器和 DLL 的想法简直就是乌托邦。

为了不让读者感到困惑,我建议使用在 API函数中实现的经典内存处理技术 。文章在处理字符串部分对此进行了描述。

我希望文章的作者不要在这里引用Delphi 的书籍和文章,而只就文章中描述的真正行不通的地方提出主张。最好能举例说明。


 
avoitenko :

感谢您的评论。我认为这一部分可以扩展到最常见的错误。不过,为了避免 "漫长而不成功 "地搜索错误,请按照文章中写的去做。文中的示例是可行的。此外,还可以使用MetaEditor 中的调试器,它具有逐步调试和断点功能,非常实用!

在这篇文章中,我不想教任何人如何编程。如果有人犯了初级错误就大声嚷嚷, ,也许他还不应该创建自己的DLL,而应该开始学习 Mat 部分。

唉,你大错特错了。不仅那些正在学习编程的人会犯错误(包括初级错误和不太初级的错误),熟练的程序员也会犯错误。

这与数学无关,而是与调试工具有关。让我们记住著名的 "80 乘 20 "统计:80% 的时间用于调试,只有 20% 的时间用于编写代码。据我所知,这篇文章的目的是教你如何编写一个可行的 DLL,也就是说,不仅是给出的具体示例,还包括假设的其他代码。当然,我们不可能考虑到所有潜在的错误,但我们需要原则上如何捕捉错误的信息。否则,读者除了重现示例之外什么也做不了。

MetaEditor 也与此无关,因为我们讨论的是调试 DLL,即其内部结构。

你是作者--你知道得更多。我只是表达了我对演示文稿中某些不完整之处的看法。

 
"你写得真快!你写了这么多!你应该自己写关于 Delphi的文章 "

这是一篇关于 mt4 的 dlls 的旧文章的摘录,尚未完成。我只是把摘录复制到这里。不难,也不长。

"SysUtils 在项目中! 与此无关!除了SysUtils 之外的异常处理程序是在System 中实现的,而System 默认是连接的,所以我认为没有必要担心。"

包含哪些单元由所有者决定。但我认为有必要说明原因。在本例中,Borland 推荐使用 SysUtils 和 Classes。这是有原因的。

互联网上随处可见 "DllEntryPoint"的示例。这是创建 DLL 事件的标准方法,例如,"

Borland 并不是故意将 DllMain 隐藏起来,以防被不怀好意的人发现。在 Delphi 中创建 DLL 的标准方法是隐藏 DllMain。想想为什么会这样?再看看微软自己是怎么建议的

"你可以绑定内存 分配并从堆中释放。如果你在使用这种方法处理内存时遇到真正的错误,我愿意考虑它"

这取决于你。但我的建议是,根本不应该在 DllMain 中做任何事情。

"问题是我们都不知道 MT5MT4的内存管理器是如何 工作的。即使我们知道实现该管理器的函数名称,您又该如何使用它,因为 MT5 的API 已经关闭!因此,只需一个 MT5 管理器和 DLL 的想法简直就是乌托邦"

;-)对某些人来说,这是 "封闭 "和 "乌托邦",而对另一些人来说,则是 "一切正常"。

 

需要指出的是,除了 Delphi 之外,还有另一种选择。

如果你还不是 Delphi 用户,你应该考虑使用 Lazarus/FPC,它是开放源码的,拥有与 Delphi 几乎相同的功能(甚至更多一些),在很大程度上与 Delphi 源代码兼容,我甚至可以打赌上述所有示例都可以在 Lazarus 中编译,而无需做任何修改。

如果你更喜欢开源软件而不是专有软件(无论如何你都应该这么做),那么 Lazarus 就是你要找的,而不是 Delphi 的商业试用版。

 

文章中有这样一个过程:

//----------------------------------------------------------+
procedure DLLEntryPoint(dwReason: DWord); // 事件处理程序
//----------------------------------------------------------+
begin
    case dwReason of

      DLL_PROCESS_ATTACH: // DLL 已连接到进程;
          // 内存分配
          Buffer:=AllocMem(BUFFER_SIZE);

      DLL_PROCESS_DETACH: // DLL 与进程断开连接;
          // 释放内存
          FreeMem(Buffer);

    end;
end;

编译器问我未声明的变量BUFFER_SIZE 是什么。

能否请您告诉我,它到底应该是什么,应该在哪里声明,以及是关于哪个缓冲区的?

 
lucka88:

编译器问我未声明的变量BUFFER_SIZE 是什么。

能否请您告诉我应该在哪里声明,以及我们所说的缓冲区是什么?

项目 文件dll_mql5.dpr 中有如下声明

const BUFFER_SIZE = 255;

通过一行代码

Buffer:=AllocMem(BUFFER_SIZE);

用于存储字符串的内存在堆中分配。

缓冲区指针本身用于 GetStringBuffer 函数,该函数演示了如何处理字符串。

 

DLL 帮助

我们能否在 MT5 上使用MT4 DLL 文件,如果可以......在哪里将其安装到 MT5 中,以及我需要了解的其他信息。

另外,我们应该将 DLL 文件存放在哪个文件夹中?

我已经没有 DLL 的代码了,所以我真的不能再重写它了。

如果有任何建议和帮助,我将不胜感激。

 

在 MT5 中连接智能交易系统时,我遇到了 "dll 不是 64 位版本 "的错误。

有办法使用 32 位 dll 吗?

如果没有,谁能告诉我如何在 Delphi XE 中编译 64 位 dll?

 
meneo:

如何在 Delphi XE 中编译 64it dll?

Delphi XE2 和 Lazarus 中出现了对 64 位的支持。