文章 "用 Delphi 为 MQL5 编写 DLL 指南" - 页 2 123 新评论 Andriy Voitenko 2010.05.26 15:30 #11 marketeer: 你至少应该增加一段关于调试的内容。文章提到了 AV 可能发生的一种情况,但即使撇开大量其他潜在的错误源不谈,试图手动(通过眼睛或头脑)搜索错误位置也可能需要很长时间,而且不会成功。 感谢您的评论。我认为这一部分可以扩展到最常见的错误。不过,为了避免 "长时间且不成功 "地搜索错误,请按照文章中的方法去做。文中的示例是可行的。此外,还可以使用MetaEditor 中的调试器,它具有逐步调试和断点 功能,非常实用! 在这篇文章中,我不想教任何人如何编程。如果有人犯了初级错误就大声嚷嚷, ,也许他还不应该创建自己的DLL,而应该开始学习 Mat 部分。 Andriy Voitenko 2010.05.26 16:27 #12 你好, 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 的书籍和文章,而只就文章中描述的真正行不通的地方提出主张。最好能举例说明。 Stanislav Korotky 2010.05.26 16:53 #13 avoitenko : 感谢您的评论。我认为这一部分可以扩展到最常见的错误。不过,为了避免 "漫长而不成功 "地搜索错误,请按照文章中写的去做。文中的示例是可行的。此外,还可以使用MetaEditor 中的调试器,它具有逐步调试和断点功能,非常实用!在这篇文章中,我不想教任何人如何编程。如果有人犯了初级错误就大声嚷嚷, ,也许他还不应该创建自己的DLL,而应该开始学习 Mat 部分。唉,你大错特错了。不仅那些正在学习编程的人会犯错误(包括初级错误和不太初级的错误),熟练的程序员也会犯错误。这与数学无关,而是与调试工具有关。让我们记住著名的 "80 乘 20 "统计:80% 的时间用于调试,只有 20% 的时间用于编写代码。据我所知,这篇文章的目的是教你如何编写一个可行的 DLL,也就是说,不仅是给出的具体示例,还包括假设的其他代码。当然,我们不可能考虑到所有潜在的错误,但我们需要原则上如何捕捉错误的信息。否则,读者除了重现示例之外什么也做不了。MetaEditor 也与此无关,因为我们讨论的是调试 DLL,即其内部结构。你是作者--你知道得更多。我只是表达了我对演示文稿中某些不完整之处的看法。 Hide 2010.05.26 16:56 #14 "你写得真快!你写了这么多!你应该自己写关于 Delphi的文章 "。这是一篇关于 mt4 的 dlls 的旧文章的摘录,尚未完成。我只是把摘录复制到这里。不难,也不长。"SysUtils 在项目中! 类 与此无关!除了SysUtils 之外的异常处理程序是在System 中实现的,而System 默认是连接的,所以我认为没有必要担心。"包含哪些单元由所有者决定。但我认为有必要说明原因。在本例中,Borland 推荐使用 SysUtils 和 Classes。这是有原因的。互联网上随处可见 "DllEntryPoint"的示例。这是创建 DLL 事件的标准方法,例如,"Borland 并不是故意将 DllMain 隐藏起来,以防被不怀好意的人发现。在 Delphi 中创建 DLL 的标准方法是隐藏 DllMain。想想为什么会这样?再看看微软自己是怎么建议的"你可以绑定内存 分配并从堆中释放。如果你在使用这种方法处理内存时遇到真正的错误,我愿意考虑它"。这取决于你。但我的建议是,根本不应该在 DllMain 中做任何事情。"问题是我们都不知道 MT5(MT4) 的内存管理器是如何 工作的。即使我们知道实现该管理器的函数名称,您又该如何使用它,因为 MT5 的API 已经关闭!因此,只需一个 MT5 管理器和 DLL 的想法简直就是乌托邦"。;-)对某些人来说,这是 "封闭 "和 "乌托邦",而对另一些人来说,则是 "一切正常"。 bernd 2010.07.10 00:12 #15 需要指出的是,除了 Delphi 之外,还有另一种选择。如果你还不是 Delphi 用户,你应该考虑使用 Lazarus/FPC,它是开放源码的,拥有与 Delphi 几乎相同的功能(甚至更多一些),在很大程度上与 Delphi 源代码兼容,我甚至可以打赌上述所有示例都可以在 Lazarus 中编译,而无需做任何修改。如果你更喜欢开源软件而不是专有软件(无论如何你都应该这么做),那么 Lazarus 就是你要找的,而不是 Delphi 的商业试用版。 Dmitry Luck'janenko 2010.11.18 13:00 #16 文章中有这样一个过程://----------------------------------------------------------+ 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 是什么。 能否请您告诉我,它到底应该是什么,应该在哪里声明,以及是关于哪个缓冲区的? Andriy Voitenko 2010.11.22 21:04 #17 lucka88:编译器问我未声明的变量BUFFER_SIZE 是什么。 能否请您告诉我应该在哪里声明,以及我们所说的缓冲区是什么?在项目 文件dll_mql5.dpr 中有如下声明const BUFFER_SIZE = 255;通过一行代码Buffer:=AllocMem(BUFFER_SIZE); 用于存储字符串的内存在堆中分配。缓冲区指针本身用于 GetStringBuffer 函数,该函数演示了如何处理字符串。 KRTRADE 2011.01.22 02:20 #18 DLL 帮助 我们能否在 MT5 上使用MT4 DLL 文件,如果可以......在哪里将其安装到 MT5 中,以及我需要了解的其他信息。 另外,我们应该将 DLL 文件存放在哪个文件夹中?我已经没有 DLL 的代码了,所以我真的不能再重写它了。 如果有任何建议和帮助,我将不胜感激。 meneo 2012.03.09 19:08 #19 在 MT5 中连接智能交易系统时,我遇到了 "dll 不是 64 位版本 "的错误。有办法使用 32 位 dll 吗?如果没有,谁能告诉我如何在 Delphi XE 中编译 64 位 dll? Andriy Voitenko 2012.04.19 17:52 #20 meneo:如何在 Delphi XE 中编译 64it dll? Delphi XE2 和 Lazarus 中出现了对 64 位的支持。 123 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
你至少应该增加一段关于调试的内容。文章提到了 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 的书籍和文章,而只就文章中描述的真正行不通的地方提出主张。最好能举例说明。
感谢您的评论。我认为这一部分可以扩展到最常见的错误。不过,为了避免 "漫长而不成功 "地搜索错误,请按照文章中写的去做。文中的示例是可行的。此外,还可以使用MetaEditor 中的调试器,它具有逐步调试和断点功能,非常实用!
在这篇文章中,我不想教任何人如何编程。如果有人犯了初级错误就大声嚷嚷, ,也许他还不应该创建自己的DLL,而应该开始学习 Mat 部分。
唉,你大错特错了。不仅那些正在学习编程的人会犯错误(包括初级错误和不太初级的错误),熟练的程序员也会犯错误。
这与数学无关,而是与调试工具有关。让我们记住著名的 "80 乘 20 "统计:80% 的时间用于调试,只有 20% 的时间用于编写代码。据我所知,这篇文章的目的是教你如何编写一个可行的 DLL,也就是说,不仅是给出的具体示例,还包括假设的其他代码。当然,我们不可能考虑到所有潜在的错误,但我们需要原则上如何捕捉错误的信息。否则,读者除了重现示例之外什么也做不了。
MetaEditor 也与此无关,因为我们讨论的是调试 DLL,即其内部结构。
你是作者--你知道得更多。我只是表达了我对演示文稿中某些不完整之处的看法。
这是一篇关于 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 的商业试用版。
文章中有这样一个过程:
编译器问我未声明的变量BUFFER_SIZE 是什么。
能否请您告诉我,它到底应该是什么,应该在哪里声明,以及是关于哪个缓冲区的?
编译器问我未声明的变量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?
如何在 Delphi XE 中编译 64it dll?