1

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

我正在 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-references。没有一个结构包含对象、指针、引用、字符串、其他结构、类、方法或数组。一些结构是数组,但作为传递的参数是完全有效的。因此,没有传递无效的参数。我已经验证每个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 的,它应该可以工作。

4

1 回答 1

0

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

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

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

于 2015-06-18T21:14:30.367 回答