А что, при remove единственной инстанции expert advisor в DLL не приходит DLL_PROCESS_DETACH ?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Eugeniy Lugovoy
2013
Eugeniy Lugovoy  

Собственно, сабж.

Столкнулся с таким нюансом.

Есть EA который вызывает пару функций к самописной DLL. При запуске ATTACH выполняет, а при убирании с чарта DETACH почему-то не вызывается. Зато вызывается при закрытии терминала.

Это так и должно быть?  Раньше при убирании с чарта последней инстанции приходил DETACH от MT4... может я устарел? или логика работы с DLL изменилась все таки?

Спасибо 

Ihor Herasko
22328
Ihor Herasko  
Eugeniy Lugovoy:

Собственно, сабж.

Столкнулся с таким нюансом.

Есть EA который вызывает пару функций к самописной DLL. При запуске ATTACH выполняет, а при убирании с чарта DETACH почему-то не вызывается. Зато вызывается при закрытии терминала.

Это так и должно быть?  Раньше при убирании с чарта последней инстанции приходил DETACH от MT4... может я устарел? или логика работы с DLL изменилась все таки?

Спасибо 

Скорее всего, не все инстансы выгрузили. У меня такой ступор тоже иногда был, но потом перепроверял. Оказывалось, были еще индикаторы или эксперты, использующие эти DLL. Например, пока окно тестера стратегий не закрыто, а в нем последний тест был с вызовом этой DLL, то она не выгружается. Закрываем окно тестера - DLL выгружается.
Eugeniy Lugovoy
2013
Eugeniy Lugovoy  
Ihor Herasko:
Скорее всего, не все инстансы выгрузили. У меня такой ступор тоже иногда был, но потом перепроверял. Оказывалось, были еще индикаторы или эксперты, использующие эти DLL. Например, пока окно тестера стратегий не закрыто, а в нем последний тест был с вызовом этой DLL, то она не выгружается. Закрываем окно тестера - DLL выгружается.

Да инстанс единственный... в том то и дело... 

Alexandre
594
Alexandre  
Eugeniy Lugovoy:

Собственно, сабж.

Столкнулся с таким нюансом.

Есть EA который вызывает пару функций к самописной DLL. При запуске ATTACH выполняет, а при убирании с чарта DETACH почему-то не вызывается. Зато вызывается при закрытии терминала.

Это так и должно быть?  Раньше при убирании с чарта последней инстанции приходил DETACH от MT4... может я устарел? или логика работы с DLL изменилась все таки?

Спасибо 


DllMain .

Насколько понимаю, длл в МТ трактуются как СОМ-объекты. Происходит отложенная выгрузка.

А вообще-то, ИМХО, лучше этой автоматикой не пользоваться, а загружать/выгружать длл вручную через явно прописанные секции. Автоматика нужна, если пишется полноценный плагин, вроде фильтра в фотошопе, который надо подключать/отключать по нескольку раз "на лету".

Динамические библиотеки для гурманов
  • citforum.ru
Книги: [Классика] [Базы данных] [Internet/WWW] [Сети] [Программирование] [UNIX] [Windows] [Безопасность] [Графика] [Software Engineering] [ERP-системы] [Hardware] Динамические библиотеки для гурманов (статья была опубликована в журнале "Программист") Динамическая библиотека - не статичный набор экспортируемых функций. Это живой организм...
Aleksei Radchenko
1109
Aleksei Radchenko  
Alexandre:


DllMain .

Насколько понимаю, длл в МТ трактуются как СОМ-объекты. Происходит отложенная выгрузка.

А вообще-то, ИМХО, лучше этой автоматикой не пользоваться, а загружать/выгружать длл вручную через явно прописанные секции. Автоматика нужна, если пишется полноценный плагин, вроде фильтра в фотошопе, который надо подключать/отключать по нескольку раз "на лету".

DLL - не трактуются как COM объекты и я не помню что бы dll выгружалась при убирании с графика

Пользоваться DllMain вообще не рекомендую, это крайне опасная и ограниченная вещь даже без дополнительных обвязок метатрейдера 

выгрузка происходит если запустить другой советник 

У вас нет средств к "ручной" загрузке/выгрузке dll в метатрейдере

Вопрос: зачем вам вообще выгружать dll? она вам как то мешает?

Если речь идет о неких действия при инициализации/деинициализации советника, то проще прокинуть две интерфейсные функции init/deinit, ну и держать инстансы в пуле, если необходимо что либо сделать при деинициализации последнего инстанса, проверяете размер пула и если ноль - делаете

А вообще обращайтесь, мы на нашем проекте fairforex.org уже собаку съели с dll и особенностями взаимодействия с метатрейдером =) 

Ilyas
1497
Ilyas  

Если в загружаемой библиотеке DLL (или в используемых ею DLL) нет "трюка" предотвращения выгрузки, то DLL должна выгрузиться (вызов DllMain с reason=DLL_PROCESS_DETACH), при выгрузке всех экземпляров MQL программ её использующих.

Возможно, имеется какое-то стороннее ПО, которое предотвращает выгрузку (организовать это несложно).


Если предоставите удалённый доступ (например, через TeamViewer), мы разберёмся с вашим случаем.

Вы также можете создать заявку в сервисдеске и приложить код DLL

AntonZverev
309
AntonZverev  
Ilyas:

Если предоставите удалённый доступ (например, через TeamViewer), мы разберёмся с вашим случаем.

Бывают случаи, что баг на локальной машине, но не ясно, как его воспроизвести. Писать в сервисдеск почти бессмысленно. Можно ли, чтобы через удаленку ко мне подключились разработчики и, во-первых, подтвердили, что баг имеет место быть, а, во-вторых, сделали бы нужный им анализ на моей локальной машине, пока баг присутствует?
Ilyas
1497
Ilyas  
Anton Zverev:
Бывают случаи, что баг на локальной машине, но не ясно, как его воспроизвести. Писать в сервисдеск почти бессмысленно. Можно ли, чтобы через удаленку ко мне подключились разработчики и, во-первых, подтвердили, что баг имеет место быть, а, во-вторых, сделали бы нужный им анализ на моей локальной машине, пока баг присутствует?
Вы всё же создайте заявку в сервисдеск, опишите ошибку - разберёмся.
Eugeniy Lugovoy
2013
Eugeniy Lugovoy  
Ilyas:

Если в загружаемой библиотеке DLL (или в используемых ею DLL) нет "трюка" предотвращения выгрузки, то DLL должна выгрузиться (вызов DllMain с reason=DLL_PROCESS_DETACH), при выгрузке всех экземпляров MQL программ её использующих.

Возможно, имеется какое-то стороннее ПО, которое предотвращает выгрузку (организовать это несложно).


Если предоставите удалённый доступ (например, через TeamViewer), мы разберёмся с вашим случаем.

Вы также можете создать заявку в сервисдеске и приложить код DLL

Даже если есть какие-то "трюки" по предотвращению выгрузки (коих в моем проекте нет), то на последней инстанции DLL_PROCESS_DETACH должна придти. Я конечно проверю сколько инстанций грузится и меняется ли счетчик, возможно в этом проблема...

Просто там еще идет подгрузка .Net объектов, скорее всего это влияет. Попробую на простом примере потестить. Если что отпишусь.

MetaQuotes
Админ
27954
Renat Fatkhullin  
Если там еще цепочка длл, а тем более дотнет, то это все объясняет.
Eugeniy Lugovoy
2013
Eugeniy Lugovoy  
Renat Fatkhullin:
Если там еще цепочка длл, а тем более дотнет, то это все объясняет.
Ренат, а как правильно тогда выгрузить DLL с зависимостями .Net? Мне так кажется что DLL_PROCESS_DETACH должна по любому приходить от терминала или я ошибаюсь?
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий