文章 "用 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 内存管理器。

问题是,我们都不知道 MT5(MT4) 的内存管理器是如何 工作的。即使我们知道实现该管理器的函数名称,您又该如何使用它,因为 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 中做任何事情。

"问题是我们都不知道 MT5(MT4) 的内存管理器是如何 工作的。即使我们知道实现该管理器的函数名称,您又该如何使用它,因为 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 位的支持。