Как да напишем DLL библиотека в продължение на 10 минути, за да MQL5 статия и споделяне на данни за MQL5

Просто така се случва, че сега, няколко разработчици помнят как да напиша прост DLL, и кои черти задължителни коренно различни системи.

Пусни чрез съветника "File -> New" от менюто, изберете вида на проекта "Visual C ++", шаблон "Win32 Console Application" и въведете име на проекта (например, "MQL5DLLSamples"). Изберете една основна директория на "Местоположение" проекти за съхранение вместо предложената по подразбиране, деактивирайте отметката "Създаване на директория за решение" и кликнете върху бутона "ОК":

Как да напишем DLL библиотека в продължение на 10 минути, за да MQL5 статия и споделяне на данни за MQL5

Фигура 1. Win32 Wizard кандидатстване, създаването на проекта DLL

В следващата стъпка, просто кликнете върху "Next", за да отидете на страницата за настройки:

Как да напишем DLL библиотека в продължение на 10 минути, за да MQL5 статия и споделяне на данни за MQL5

Фигура 2. Wizard Win32 Application, параметрите на проекта

изберете тип "DLL" на последната страница, и да оставите другите полета празни, тъй като те са и кликнете върху "Край". Поставете отметка в "Символите на износа", не е необходимо, така че не се изтрива автоматично добавя примерен код:

Как да напишем DLL библиотека в продължение на 10 минути, за да MQL5 статия и споделяне на данни за MQL5

Фигура 3. Win32 Wizard заявка, п Настройка свойства приложения

Резултатът ще бъде празен проект:

Как да напишем DLL библиотека в продължение на 10 минути, за да MQL5 статия и споделяне на данни за MQL5

Фигура 4. Изпразнете DLL проект

За удобство, най-добре е да се тества директно в "Output Directory" настройките, за да се посочи DLL г. отвори файла директно в директорията ". \ MQL5 \ библиотеки "на клиентския терминал. Това ще спести много време в последвалата работа:

Как да напишем DLL библиотека в продължение на 10 минути, за да MQL5 статия и споделяне на данни за 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. Методи за предавателни параметри и обмен на данни

Нека да разгледаме няколко варианта за параметрите, които се предават:

  1. Приемане и предаване на прости променливи
    С прости променливи, всичко е просто - те могат да бъдат предадени по стойност или чрез препратка чрез ,
    Обади се на MQL5:
    резултат:
  2. Приемане и предаване на масив с елементи за пълнене

Трансфер на масива в DLL, за разлика от други MQL5 програми, е чрез директна препратка към буфера за данни без достъп до защитена информация за размерите и размери. Поради това измерение и големината на масива трябва да се подаде отделно.

Обади се на MQL5:
резултат:
  • линии за трансфер и модификация
    Линии (Unicode) също се прехвърлят чрез директни връзки да работят буфери без заглавна информация. Моля, обърнете внимание, че функцията например е описан във формат cdecl:
    Обади се на MQL5:
    резултат:
    Оказа се, че редът не се е променило! Това е често срещана грешка, направена от начинаещите програмисти, когато те предават копия на обекти (низ - обект), вместо да се позовава на тях. За автоматично се създава в "текст" низ екземпляр, който е бил променен в DLL, а след това копие автоматично ще бъде изтрит без това да повлияе на оригинала.

    За да се справи със ситуацията, е необходимо да се премине низ чрез препратка. За да направите това, просто промяна на потока на вноса, добавяйки знак към текста на параметър:
    След компилация и работи стигнем до правилния резултат:

    4. Прихващане на изключения от функциите на DLL

    За да се избегне падането на терминала, всяко обаждане е защитена автоматично обвивка DLL необработено изключение функции. Този механизъм позволява да се предпазите от най-стандартна грешка (позоваване на недостъпно памет, деление на нула, и т.н.)

    За да се провери ефикасността на този механизъм ще създаде следния код:

    и го наричат ​​от терминала:


    5. обвивка DLL призовава и скорост на загуба на повикване

    Както беше описано по-горе, за безопасност всяко повикване функция DLL е обвит в специална обвивка. Това обвързване замаскира кода, заместител стека подкрепя stdcall / cdecl споразумения и следи изключения вътре наречени функции.

    Такова количество работа не забави значително повикване функции.

    6. Окончателно сглобяване

    Благодаря ви за вниманието! Ще се радвам да отговоря на въпроса.