Как да напишем DLL библиотека в продължение на 10 минути, за да MQL5 статия и споделяне на данни за MQL5
Просто така се случва, че сега, няколко разработчици помнят как да напиша прост DLL, и кои черти задължителни коренно различни системи.
Пусни чрез съветника "File -> New" от менюто, изберете вида на проекта "Visual C ++", шаблон "Win32 Console Application" и въведете име на проекта (например, "MQL5DLLSamples"). Изберете една основна директория на "Местоположение" проекти за съхранение вместо предложената по подразбиране, деактивирайте отметката "Създаване на директория за решение" и кликнете върху бутона "ОК":
Фигура 1. Win32 Wizard кандидатстване, създаването на проекта DLL
В следващата стъпка, просто кликнете върху "Next", за да отидете на страницата за настройки:
Фигура 2. Wizard Win32 Application, параметрите на проекта
изберете тип "DLL" на последната страница, и да оставите другите полета празни, тъй като те са и кликнете върху "Край". Поставете отметка в "Символите на износа", не е необходимо, така че не се изтрива автоматично добавя примерен код:
Фигура 3. Win32 Wizard заявка, п Настройка свойства приложения
Резултатът ще бъде празен проект:
Фигура 4. Изпразнете DLL проект
За удобство, най-добре е да се тества директно в "Output Directory" настройките, за да се посочи DLL г. отвори файла директно в директорията ". \ MQL5 \ библиотеки "на клиентския терминал. Това ще спести много време в последвалата работа:
Фигура 5. Допълнителна изчисления на DLL файлове
2. Подгответе се за добавяне на функции
Добави макро "_DLLAPI" до края на stdafx.h файл. така че да можете лесно и комфортно опишат изнесени функции:
В функция MQL5 призовава използване __stdcall споразумение връзки и __cdecl. Въпреки повиквания stdcall и cdecl различни изпълнения извличане параметри от стека, но изпълнение MQL5 среда дава безболезнено да се използва както поради специфичните обвивка DLL повиквания.
По подразбиране, C ++ компилатор за настройките на функциите, използвани __cdecl, но аз препоръчвам за изнесени функции изрично посочват __stdcall режим.
редовен Функцията за износ, трябва да разполагате със следното:
както е описано в програмата MQL5 и призова по този начин:
След монтажа, stdcall на DLL проект тази функция ще се вижда в таблицата за износ на име _fnCalculateSpeed @ 8. който компилаторът се добавя долна черта и количеството данни, предавани чрез стека в байтове. Такава украса прави по-лесно да се контролира DLL призовава функциите за сигурност се дължи на факта, че на обаждащия се знае точно колко (но не всеки!), Ще трябва да поставите данните в стека.
Ако описанието на функцията на DLL грешка в окончателния размер на блок параметър, функцията няма да се плати и на списанието ще бъде подобно съобщение "Не може да се намери" fnCrashTestParametersStdCall "в" MQL5DLLSamples.dll ''. В този случай, е необходимо да се провери внимателно всички параметри в зависимост на топлина, и в най-DLL.
При липса на пълното име на функцията в таблицата за износ, използвани за търсене Съвместимост опростено описание без украса. Такива имена като fnCalculateSpeed създадени с описание на функциите във формат __cdecl:
3. Методи за предавателни параметри и обмен на данни
Нека да разгледаме няколко варианта за параметрите, които се предават:
- Приемане и предаване на прости променливи
С прости променливи, всичко е просто - те могат да бъдат предадени по стойност или чрез препратка чрез ,
Обади се на MQL5:
резултат: - Приемане и предаване на масив с елементи за пълнене
Трансфер на масива в DLL, за разлика от други MQL5 програми, е чрез директна препратка към буфера за данни без достъп до защитена информация за размерите и размери. Поради това измерение и големината на масива трябва да се подаде отделно.
резултат:
Линии (Unicode) също се прехвърлят чрез директни връзки да работят буфери без заглавна информация. Моля, обърнете внимание, че функцията например е описан във формат cdecl:
Обади се на MQL5:
резултат:
Оказа се, че редът не се е променило! Това е често срещана грешка, направена от начинаещите програмисти, когато те предават копия на обекти (низ - обект), вместо да се позовава на тях. За автоматично се създава в "текст" низ екземпляр, който е бил променен в DLL, а след това копие автоматично ще бъде изтрит без това да повлияе на оригинала.
За да се справи със ситуацията, е необходимо да се премине низ чрез препратка. За да направите това, просто промяна на потока на вноса, добавяйки знак към текста на параметър:
След компилация и работи стигнем до правилния резултат:
4. Прихващане на изключения от функциите на DLL
За да се избегне падането на терминала, всяко обаждане е защитена автоматично обвивка DLL необработено изключение функции. Този механизъм позволява да се предпазите от най-стандартна грешка (позоваване на недостъпно памет, деление на нула, и т.н.)
За да се провери ефикасността на този механизъм ще създаде следния код:
и го наричат от терминала:
5. обвивка DLL призовава и скорост на загуба на повикване
Както беше описано по-горе, за безопасност всяко повикване функция DLL е обвит в специална обвивка. Това обвързване замаскира кода, заместител стека подкрепя stdcall / cdecl споразумения и следи изключения вътре наречени функции.
Такова количество работа не забави значително повикване функции.
6. Окончателно сглобяване
Благодаря ви за вниманието! Ще се радвам да отговоря на въпроса.