Хорошо, я знаю, что все думают: «На этот вопрос уже отвечали несколько раз». Что ж, вы ошибаетесь. На этот раз все по-другому. Я пробовал все эти другие ответы. Так вот ситуация.
Я создаю индикатор в Metatrader 4 (код mql4). Я пишу dll для выполнения вычислений в Visual Studio 2013 на C++.
Соответствующий код 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
проходит успешно в индивидуальном порядке.
Теперь код С++:
#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);
}
}
В моем файле определения:
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++ (около месяца), но, насколько я могу судить, все кошерно и должно работать.