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

 

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

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

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

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

Спасибо 

 
Eugeniy Lugovoy:

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

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

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

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

Спасибо 

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

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

 
Eugeniy Lugovoy:

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

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

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

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

Спасибо 


DllMain .

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

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

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


DllMain .

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

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

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

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

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

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

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

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

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

 

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

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


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

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

 
Ilyas:

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

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

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

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


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

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

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

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

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