Хорошо, я знаю, что все думают: «На это уже отвечали несколько раз». Ну, вы не правы. Это время другое. Я попробовал все эти другие ответы. Итак, вот ситуация.
Я создаю индикатор в 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
проходит успешно, на индивидуальной основе.
Теперь код 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);
}
}
В моем файле определения:
LIBRARY test
EXPORTS
LiveChart
Я рассмотрел код с Зависимость Уокер программа. Это говорит мне, что имя функции:
bool LiveChart(struct BarTrack const &,struct Stars &,struct Patterns *,struct Patterns *,struct Patterns *,struct Patterns *,struct BarData const *,struct Basics &)
Насколько я понимаю, все так и должно быть.
Мой вопрос,
Почему MetaTrader до сих пор говорят, что не может найти
имя функции в dll?
Я что-то упустил?
Я использую неправильный тип вуду?
Звезды не выровнены правильно?
Правда, я все еще довольно новичок в C ++ (около месяца), но, насколько я могу судить, все кошерно, и оно должно работать.
В заключение! Я пришел к решению этой проблемы. Проблема была в том, что файл def стал не связанным с проектом. Вот что случилось.
При запуске нового проекта dll VS создает файл dllmain.cpp с основной функцией в нем. Мне не нравится иметь этот дополнительный файл в проекте, поэтому я предпочитаю перенести основную функцию в мой файл project.cpp. Когда я делаю это, я удаляю файл dllmain.cpp из проекта. Очевидно, если вы уже связали свой файл def перед удалением dllmain.cpp, он отменит ваш файл def. Я даже не думал перепроверить это, потому что знал, что уже правильно связал файл def.
Чтобы решить эту проблему, все, что мне нужно было сделать, это выбрать файл project.cpp, перейти в меню Project / Properties и заново связать файл def. Теперь я могу наконец начать отладку …..