【问题标题】:C++ and MQL4 Cannot find function in dllC++ 和 MQL4 在 dll 中找不到函数
【发布时间】:2015-06-17 15:45:23
【问题描述】:

好吧,我知道每个人都在想,“这已经回答了好几次了。”好吧,你错了。这一次不同。我已经尝试了所有其他答案。情况就是这样。

我正在 Metatrader 4(mql4 代码)中创建一个指标。我正在编写一个 dll 来用 C++ 在 Visual Studio 2013 中进行计算。
相关的MQL4#import代码为:

#import  "test.dll"
bool  LiveChart( BarTrack &bars,
                 Stars    &points,
                 Patterns &gartleys[],
                 Patterns &bats[],
                 Patterns &butterflies[],
                 Patterns &cyphers[],
                 BarData  &rates[],
                 Basics   &basics
                 );
#import

以及在OnCalculate()函数中调用函数:

     bool test = LiveChart( bars,
                            points,
                            gartleys,
                            bats,
                            butterflies,
                            cyphers,
                            rates,
                            basics
                            );
     Print( "test: ", test );

注意:所有传递的参数都是struct-引用。没有一个结构包含对象、指针、引用、字符串、其他结构、类、方法或数组。一些结构是数组,但作为传递的参数是完全有效的。因此,没有传递无效的参数。我已验证每个 struct 都成功通过了。

现在是 C++ 代码:

#define WIN32_LEAN_AND_MEAN
#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>

#define MT4_EXPFUNC __declspec(dllexport)

MT4_EXPFUNC bool __stdcall LiveChart(const BarTrack &bars, Stars &points, Patterns *gartleys, Patterns *bats,
Patterns *butterflies, Patterns *cyphers, const BarData *rates, Basics &basics)
{
   Observatory astronomer;

   return astronomer.OnCalculateLive(bars, points, gartleys, bats, butterflies, cyphers, rates, basics);
}

注意:我也试过:

extern "C"
{
   MT4_EXPFUNC bool __stdcall LiveChart(const BarTrack &bars, Stars &points, Patterns *gartleys, Patterns *bats,
Patterns *butterflies, Patterns *cyphers, const BarData *rates, Basics &basics)
   {
      Observatory astronomer;

      return astronomer.OnCalculateLive(bars, points, gartleys, bats, butterflies, cyphers, rates, basics);
   }
}

在我的 def 文件中:

LIBRARY test

EXPORTS
   LiveChart

我已经使用Dependency Walker 程序查看了代码。它告诉我函数的名称是:

bool LiveChart(struct BarTrack const &,struct Stars &,struct Patterns *,struct Patterns *,struct Patterns *,struct Patterns *,struct BarData const *,struct Basics &)

据我了解,一切都应该如此。

我的问题是

  1. 为什么 metatrader 仍然说找不到 dll中的函数名?

  2. 我是否忽略了什么?

  3. 我是否使用了错误的巫毒教?

  4. 星星是否对齐不正确?

诚然,我对 C++ 还是很陌生(大约花了一个月时间),但据我所知,一切都是 kosher 的,它应该可以工作。

【问题讨论】:

  • 你试过了吗:extern __declspec(dllimport)?
  • 当我输入那行代码时,它给了我两条错误消息。 1:“此声明没有存储类或类型说明符”。 2:“期望一个';' ”。也就是说,我确实尝试使用第四个代码块中所述的 extern 声明。并且,代码使用 __declspec(dllimport),如第三个代码块中所述。
  • 我认为您的函数应该在公共类中。所以有一种方法可以在外面随叫随到。我不知道你是否理解,但是给定一个简单的函数调用,甚至没有将其声明为 public 应该会因为没有定义的函数调用而引发错误。如果我错了,请纠正我。一个 bool、一个 int 或任何你调用的函数,都应该公开。我想是我声明了一个通用的 int A 函数,它应该在过程内部而不是外部调用(正如你的 dll 所假设的那样)。所以公共类,函数返回一些东西。调用外部类->函数,看看我的意思。
  • 好吧,我会尝试你的建议,但是......就我所看到和执行的所有示例和测试而言,我拥有的代码应该完全按原样工作。这就是为什么我最终放弃并将其发布在这里的原因。我希望有人知道为什么 metatrader 会拒绝一个完全可以接受的 dll 调用。
  • 为了清楚起见......我什至将相关代码复制到了一个shell程序和shell dll中,以进行测试,它们运行良好。所以,老实说,我不知道它为什么拒绝来电。没有什么可以干扰它。

标签: c++ c dll struct mql4


【解决方案1】:

终于!我已经就这个问题达成了解决方案。问题是,def 文件与项目取消链接。这就是发生的事情。

当启动一个新的 dll 项目时,VS 会创建一个包含 main 函数的 dllmain.cpp 文件。我不喜欢在项目中有这个额外的文件,所以我更喜欢将 main 函数移动到我的 project.cpp 文件中。当我这样做时,我从项目中删除了 dllmain.cpp 文件。显然,如果您在删除 dllmain.cpp 之前已经链接了您的 def 文件,它将取消链接您的 def 文件。我什至从未想过要重新检查它,因为我知道我已经正确链接了 def 文件。

要解决此问题,我所要做的就是选择 project.cpp 文件,然后进入 Project/Properties 菜单,然后重新链接 def 文件。现在,我终于可以开始调试了.....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多