Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
По поводу отладки нужно бы добавить хоть параграф. В статье упоминается одна ситуация, когда может происходить AV, но даже оставив в стороне море прочих потенциальных источников эксепшенов, пытаться вручную (глазами или мысленно) искать место ошибки можно очень долго и безуспешно.
Спасибо за комментарий. Думаю, что этот раздел можно расширить дополнив его наиболее популярными ошибками. Однако, чтобы не искать ошибки "долго и безуспешно" сделайте всё как написано в статье. Примеры в ней работоспособные. Кроме того, используйте отладчик в MetaEditor, он довольно приличный, с пошаговой отладкой и точками останова!
В статье я не хочу никого учить программированию. Если кто-то делает элементарные ошибки, а потом громко кричит, может ему пока не стоит создавать собственные DLL и начать учить мат часть.
Здравствуйте HideYourRichess
Какой Вы шустрый! Столько написали! Вам бы писать собственные статьи на тематику Delphi.
Постараюсь ответить кратко и по порядку:
1. Юниты SysUtils и Classes нужно было оставить в проекте.
SysUtils есть в проекте! Classes ни к чему! Обработчик исключений помимо SysUtils реализован в System который подключен по умолчанию, так что не вижу повода для беспокойств.
2. Не следует использовать в рамках DllEntryPoint (он же DllMain) всякие процедуры.
Пример с DllEntryPoint приведен в интернете на каждом углу. Это штатный способ создания событий DLL, к которым, например, можно привязать выделение и освобождение памяти из кучи. Если у Вас с этим методом работы с памятью будут реальные ошибки, готов рассмотреть.
На счёт всего остального, чего нельзя делать в DllEntryPoint, я не спорю, т.к. не часто это использую.
3. На счёт менеджера памяти Вы много писали. Выделю лишь ваш вывод:
Таким образом можно сделать так, что у DLL и приложения будет единый менеджер памяти, и это будет менеджер памяти MT4.
Проблема в том, что никто из нас не знает, как устроен менеджер памяти в MT5(MT4). И даже если бы мы узнали имена функций реализующий этот менеджер, как Вы собираетесь его использовать, ведь API для MT5 закрытый! Так что идея единого менеджера MT5 и DLL это утопия.
Чтобы не путать читателей, предлагаю вместо этого использовать классический приём работы с памятью реализованный в функциях API. Об этом рассказано в статье в разделе работы со строками.
Очень рассчитываю на то, что вместо цитирования здесь книг и статей по Delphi, автору статьи будут высказаны претензии только в связи с тем, что реально не работает из того что описано в статье. Желательно с примерами.
Спасибо за комментарий. Думаю, что этот раздел можно расширить дополнив его наиболее популярными ошибками. Однако, чтобы не искать ошибки "долго и безуспешно" сделайте всё как написано в статье. Примеры в ней работоспособные. Кроме того, используйте отладчик в MetaEditor, он довольно приличный, с пошаговой отладкой и точками останова!
В статье я не хочу никого учить программированию. Если кто-то делает элементарные ошибки, а потом громко кричит, может ему пока не стоит создавать собственные DLL и начать учить мат часть.
Увы, Вы сильно заблуждаетесь. Ошибки - как элементарные так и не очень - делают не только те, кто учится программировать, но и матерые программисты.
Матчасть тут ни при чем, зато при чем средства отладки. Вспомним известную статистику "80 на 20": 80% времени уходит на отладку, и лишь 20% на написание кода. Задача статьи, насколько я понимаю, научить написанию работоспособной DLL, т.е. не только того конкретного примера, который приведен, но и гипотетического другого кода. Разумеется, невозможно рассмотреть все потенциальные ошибки, но нужна информация, как их в принципе ловить. В противном случае, читатели не смогут ничего сделать кроме воспроизведения примера.
MetaEditor тут тоже ни при чем, т.к. мы говорим об отладке DLL, т.е. её внутренностей.
Вы автор - Вам виднее. Я всего лишь высказал свое мнение относительно некоторой незавершенности в изложении.
Это отрывки из старой статьи по длл для мт4, недописанной. Сюда я просто скопипастил отрывки. Это не сложно и недолго.
"SysUtils есть в проекте! Classes ни к чему! Обработчик исключений помимо SysUtils реализован в System который подключен по умолчанию, так что не вижу повода для беспокойств. "
Дело хозяйское, какие юниты включать. Но, считаю нужно обязательно указать, почему. В данном случае, SysUtils и Classes рекомендованы борландом. И на это есть причины.
"Пример с DllEntryPoint приведен в интернете на каждом углу. Это штатный способ создания событий DLL, к которым, например,"
Борланды не случайно скрыли DllMain, от шаловливых ручек. Штатный способ создания Dll в Дельфи - со скрытым DllMain. Подумайте, - почему так. И почитайте, что там сам майкрософт рекомендует.
"можно привязать выделение и освобождение памяти из кучи. Если у Вас с этим методом работы с памятью будут реальные ошибки, готов рассмотреть."
Дело хозяйское. Но моя рекомендация состоит в том, что в DllMain вообще ничего не нужно делать.
"Проблема в том, что никто из нас не знает, как устроен менеджер памяти в MT5(MT4). И даже если бы мы узнали имена функций реализующий этот менеджер, как Вы собираетесь его использовать, ведь API для MT5 закрытый! Так что идея единого менеджера MT5 и DLL это утопия."
;-) для кого то "закрыто" и "утопия" -а у кого то "всё работает". речь о четвёрке. как в пятёрке - не смотрел.
в статье есть такая процедура :
На что компилятор мне задает вопрос что за необьявленная переменная BUFFER_SIZE
Подскажите пожалуйста что в действительности должно там быть и где ее нужно было обявить и за какой буфер идет речь
На что компилятор мне задает вопрос что за необьявленная переменная BUFFER_SIZE
Подскажите пожалуйста что в действительности должно там быть и где ее нужно было обявить и за какой буфер идет речь
В файле проекта dll_mql5.dpr присутствует объявление
const BUFFER_SIZE = 255;
Строкой кода
Buffer:=AllocMem(BUFFER_SIZE);
в куче выделяется память для хранения строки.
А сам указатель Buffer используется в функции GetStringBuffer, которая демонстрирует работу со строками.
При подключении эксперта в МТ5 пишет ошибку "dll is not 64-bit version".
Можно ли как-то использовать 32bit dll?
Если нет, может кто подскажет, как в Delphi XE скомпилировать 64it dll?
как в Delphi XE скомпилировать 64it dll?
помогите кто может ..
в delphi 7 dll процедура..
procedure test1(var data: array of Double); stdcall;
begin
ShowMessage('Вошли ');
end;
в mt4 :
#import "gayss.dll"
void test1( double &data[] );
#import
ArrayResize(data, 6);
data[0]= 2;
data[1]= 4;
data[2]= 8;
data[3]= 16;
data[4]= 21;
data[5]= 3;
test1(data);
и ошибка вылазит.. 2014.02.06 17:39:04.241 stack damaged, check DLL function call in 'SOG_2014.mq4' (80,7)
может кто знает как надо по правильному..