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