好吧,我知道每个人都在想,“这已经有好几次回答了。”嗯,你错了。这个时间不同了。我已经尝试了所有其他答案。所以情况就是这样。
我在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 &)
据我所知,一切都应该如此。
我的问题是,
为什么 metatrader 仍然说它无法找到 dll中的函数名称?
我忽略了什么吗?
我使用了错误的伏都教类型吗?
星星是否未正确对齐?
不可否认,我仍然是C ++的新手(大约一个月),但据我们所知,一切都是犹太教,它应该有效。
答案 0 :(得分:0)
最后!我已经就此问题达成了解决方案。问题是,def文件与项目无关。发生了什么。
当启动一个新的dll项目时,VS会创建一个带有main函数的dllmain.cpp文件。我不喜欢在项目中有这个额外的文件,所以我更喜欢将main函数移动到我的project.cpp文件中。当我这样做时,我从项目中删除dllmain.cpp文件。显然,如果您在删除dllmain.cpp之前已经链接了您的def文件,它将取消链接您的def文件。我从来没有想过要重新检查这个,因为我知道我已经正确地链接了def文件。
要解决此问题,我所要做的就是选择project.cpp文件,然后进入Project / Properties菜单,重新链接def文件。现在,我终于可以开始调试......