文章写得很好,但也提出了一些令人担忧的问题。
5. DLL calls wrapper and loss of speed on calls As already described above, every call of DLL functions is wrapped into a special wrapper in order to ensure safety. This binding masks the basic code, replaces the stack, supports stdcall / cdecl agreements and monitors exceptions within the functions called. This work inevitably leads to delay of the calling function. Therefore, it isn't recommended to perform very frequent DLL function calls (hundreds or thousands of times per second) for small operations. It' s better to make infrequent calls.
我支持为应用程序添加保护,但不能以牺牲性能为代价。 这是 MT4 的另一个变化,因为 dll 中的异常会导致 MT4 崩溃,但编写良好的代码应该可以处理这种情况,我更希望看到关于在 dll 中编写安全代码以克服此类问题的文章。 因此,现在由于不良的编码习惯,每个人都要付出性能代价。
如果您的算法库是以 tick 为基础调用的,那么这就非常非常糟糕,我敢说这会使算法库变得毫无用处。 鉴于我看到的很多关于 MT5 的反馈并不好,主要是由于人们需要重写指标 等,这只是另一个造成很多挫折的项目,而且由于它确实会影响性能,我可以想象,像我这样大量使用 DLL 的用户会尽可能长时间地使用 MT4,然后寻找另一个没有这个问题的平台。
为什么 Metaquotes 就不能添加一种稍有不同的方法,以安全的方式调用 DLL。这样,开发人员就可以选择通过安全加载或性能加载,并确保他们编写了能捕获异常的良好代码。
"最好不要频繁调用",我是说真的,这算哪门子话?
我使用 visual c++ express 2008 编译了该 dll,但有趣的是,终端并没有捕获异常,而是在 fnReplaceString 内崩溃。
我的终端构建是 239。有什么线索吗?
我使用 visual c++ express 2008 编译了 dll,但有趣的是,终端并没有捕获异常,而是在 fnReplaceString 内崩溃了。
我的终端构建是 239。有什么线索吗?
文章写得很好,但也提出了一些重大问题。
我支持为应用程序添加保护,但不能以牺牲性能为代价。 这是 MT4 的另一个变化,因为 dll 中的异常会导致 MT4 崩溃,但写得好的代码应该能处理这种情况,我更希望看到关于在 dll 中编写安全代码以克服这类问题的文章。 因此,现在由于不良的编码习惯,每个人都要付出性能代价。
如果您的算法库是以 tick 为基础调用的,那么这就非常非常糟糕,我敢说这会使算法库变得毫无用处。 鉴于我看到的很多关于 MT5 的反馈并不好,主要是由于人们需要重写指标 等,这只是另一个造成很多挫折的项目,而且由于它确实会影响性能,我想其他像我这样大量使用 DLL 的用户会尽可能长时间地使用 MT4,然后寻找其他没有这个问题的平台。
为什么 Metaquotes 就不能添加一种稍有不同的方法,以安全的方式调用 DLL。这样开发人员就可以选择通过安全加载或性能加载,并确保他们编写了良好的代码来捕获异常。
"最好不要频繁调用",我是说真的,这算哪门子话?
难怪这个社区很难写出像样的文章。 任何优秀的作者都不会花时间在这里写文章。 他们为什么要写呢? 他们做了一些像样的事情,比如展示如何集成 dlls 和建立通信,然后就会有人来把他们从树上打下来。
但问题是,如果情况如此糟糕,而你又是这个社区的一员,你为什么不尝试用代码解决你发现的明显的性能问题呢?
你提出这个问题固然很好,但如果你不愿意提出解决方案,甚至不愿意就如何实现目标提出建议,那么你的抱怨对任何人都没有好处。
这篇文章是否暴露了风险,是的,我想我们甚至得到了一个风险样本,当另一个人说,嘿,我下载了它,但我遇到了这个问题。 这正是文章中讨论的问题。我认为,如果我想对这篇文章进行扩展,就会像你在 PFX 上说的那样,展示如何安全地进行交互。 不过,他确实暴露了其中的风险,这就为像你这样的人留下了足够的空间,让他们通过 "安全 "这一主题的概念进行扩展。
我想对作者说的一点是,在撰写主题时,尽量避免使用新手这样的术语。 这是对人的侮辱和贬低,不是一种专业的说话方式,你希望那些人跟随你的智慧。
C++ dll 和 C# dll 有什么区别。
C# dll 程序集用于存储托管代码,而 C++ dll 包含本地代码。
但有一种技巧可以让程序集导入成为可能:反向 P/Invoke。
对于我来说,我习惯于为此编写 c++\cli wrapper dll,或者使用 c++\cli 编写所有托管代码。
您能告诉我如何将结构导入 C++ 库吗?
我想在 MQL5DLLSample.cpp 中添加以下代码:
------------------------
structMqlTick
{
INT64 Time;
double Bid;
double Ask;
double Last;
UINT64 Volume;
};
_DLLAPI MqlTick __stdcall MyTick(MqlTick &my)
{
my.Bid = 1;
return(my);
}
------------------------
然后,我将这段代码添加到 MQL5DLL Test.mq5 中(导入部分)
MqlTick MyTick(MqlTick &tick);
并在 OnTick() 中调用它
MqlTick tick;
SymbolInfoTick("GBPUSD", tick);
MyTick(tick);
Print("My tick: ",tick.bid);
------------------------
c++ 库和 EA 的编译没有错误。
在终端调用 MyTick(tick) 函数后,出现错误:MQL5DLL_Test (EURUSD,M1) 访问违规写入 0x00000008
大家好、
这篇文章写得很好!
但我想知道,有没有人可以帮我把这篇文章中描述的事情倒过来做:从 metatrader 中获取数据(ticks 或 bars 数据)到 C++ 程序中?
我使用标准 int 数组实现了这一功能,但是否有可能在 Visual Studio C++ 中传递 CArrayObj /CArrayDouble?
新文章 如何交换数据:10 分钟为 MQL5 创建 DLL已发布:
现在很多开发人员不知道如何编写简单的 DLL,而这是不同系统绑定的特殊特性。我将通过多个示例,展示在 10 分钟内创建简单 DLL 的整个过程,并讨论我们绑定实施的一些技术细节。我将给出 Visual Studio 中的 DLL 创建的分步过程,以及交换不同变量类型的示例(数字、数组、字符串等)。此外,我还将说明在自定义 DLL 中如何使您的客户端免于崩溃。
作者:MetaQuotes Software Corp.