Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
1. Функции вызываются по определенным правилам - Calling convention. MT4 гарантировано работает с функциями, которые придерживаются __stdcall (частный случай разновидности правил). Для уверенности в том, что экспортируемая функция использует вышеупомянутые правила, она должна выглядеть следующим образом: void __stdcall AnyFn();
2. Я знаю два способа заставить библиотечную функцию экспортироваться – при помощи __declspec(dllexport) и при помощи def файла (это проще, иначе вдобавок придется бороться с декорированием функций). В VS для включения def файла в проект, сначала добавить к файлам проекта, затем добавить имя файла в: свойства проекта/компоновщик/ввод/файл определения модуля.
P.S: Пример проекта с def файлом находятся в: каталог терминала\ experts\samples\DLLSample.
ПЕРЕДАЧА ПАРАМЕТРОВ В DLL ФУНКЦИЮ
1. При передачи string переменной, в DLL передается массив из char (ANSI символ, занимает 1 байт).
2. Передача int или double в библиотеку приведет к копированию переменной, следовательно при изменении переменной в dll не происходит изменение в МКЛ:
3. Для наличия возможности изменения переменных int и double, объявленных в MQL, следует передавать массивы:
4. При передачи массива из string, в DLL передается структура struct MqlStr:
P.S.
Всякий раз, когда в ДЛЛ передаются массив или строка (string), то в фактически отсылается указатель на участок памяти (указатель), в библиотеке его принимаем следующем образом:
void __stdcall fn(int *pointer) {} // так. Так можно работать как с массивом, например, pointer[4] = 4.
void __stdcall fn(int &reference) {} // или так. Но получим доступ только к одному элементу. Актуально при передачи в библиотеку массива из одного элемента.
Не смог найти толкового объяснения знаку * перед pointer, зачем он нужен ??? Разве без него нельзя ????
И вопрос по ходу как из длл получить текст ???
Не смог найти толкового объяснения знаку * перед pointer, зачем он нужен ??? Разве без него нельзя ????
И вопрос по ходу как из длл получить текст ???
1. Передача строки в МКЛ:
2. Знак * говорит о том, что это указатель. Если коротко, то у любой переменной есть не только какое-то значение, но и адрес по которому она расположена в памяти. Указатели могут работать с этим адресом. Этот вопрос необходимо хорошо понимать, думаю стоит обратить внимание на книги по C++;1. Передача строки в МКЛ:
2. Знак * говорит о том, что это указатель. Если коротко, то у любой переменной есть не только какое-то значение, но и адрес по которому она расположена в памяти. Указатели могут работать с этим адресом. Этот вопрос необходимо хорошо понимать, думаю стоит обратить внимание на книги по C++;Только нужно быть осторожным с глобальными данными библиотеки. МКЛ программы выполняются независимо друг от друга (но имеют общие глобальные переменные, так как в одном потоке), следовательно возможна ситуация когда несколько скриптов станут писать и читать в одну область памяти (что не есть хорошо). Тут нужна синхронизация, например, с помощью критических секций. Подчеркиваю, что это актуально для глобальных данных (объявленных вне функций). При вызове функций создается свой, независимый набор переменных.