C ++和MQL4在dll

时间:2015-06-17 15:45:24

标签: c++ c dll struct mql4

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

我在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. 星星是否未正确对齐?

  5. 不可否认,我仍然是C ++的新手(大约一个月),但据我们所知,一切都是犹太教,它应该有效。

1 个答案:

答案 0 :(得分:0)

最后!我已经就此问题达成了解决方案。问题是,def文件与项目无关。发生了什么。

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

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