Дайте, пожалуйста, простейшую dll, чтобы мы могли понять проблему. Простейшую - это такую, в которой оставлена только та функциональность, которая иллюстрирует проблему.
Дайте, пожалуйста, простейшую dll, чтобы мы могли понять проблему. Простейшую - это такую, в которой оставлена только та функциональность, которая иллюстрирует проблему.
Уважаемый stringo, спасибо за ответ. К сожалению, я немного поспешил с выводами.
Оказалось, что в МТ4 происходит вещь аналогичная. Т.е. при выходе из процесса на момент вызова в Dll функции DllMain с параметром PROCESS_DETACH, уже и созданный поток уничтожен- и окно. Единственным отличием у МТ4 было то, что почему-то terminal.exe не оставался в списке процессов- и поэтому у меня было основание думать, что GUI поток "ложится" gracefully- и я рассчитывал, что таким образом я получаю возможность сохранять/не сохранять данные.
Т.е. получается такая ситуация, что поскольку МТ не знает ничего о дополнительных окнах в его процессе, он не посылает им при закрытии WM_CLOSE... и поэтому при выходе из процесса- окна и их потоки прибиваются системой.
Возможный выход из ситуации- это либо перехватывать сообщение главного окна MT на закрытие- и пытаться выйти...
или ждать от вас, разработчиков, какой-то подсказки. Возможно... стоило бы искать в User Dll какую-то функцию типа bool CanExit()... которая могла бы даже отказать в закрытии метатрейдера. Или она бы ждала полной нормальной деинициализации всех Gui- потоков, если такие есть...
Самую простую Dll сделать, к сожалению, не смог /на Dll с Gui потоком у меня ушло где-то с неделю- но она привязана к библиотеке кода, с компиляцией есть некоторые нюансы/. Приложил бинарную Dll, которая просто показывает окно.
DbgView при этом показывает, что при закрытии окна крестиком в логе будет строка "Exiting GUI Thread". При закрытии метатрейдера в логе фиксируются надписи "GUI Thread is DEAD" / "IsWindow() = false" - это означает, что поток и окно были разрушены.
P.S.: Моё мнение по поводу Custom GUI Forms /я постил видео на mql4, https://www.mql5.com/ru/forum/120805/- такое, что эта тема может быть весьма интересной. Поэтому, возможно, стоило бы придумать хорошее решение по деинициализации /а возможно, и по загрузке Dll при старте MT.../. Могу написать интересную статью...
- www.mql5.com

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Я столкнулся со странной проблемой.
Я создаю DLL, которая при загрузке из индикатора или скрипта, создает свой GUI-поток и окошки. Создание потока- это вполне валидная операция- собственно, иначе GUI не будет работать. Вопрос в том, что в некоторых случаях DLL загружает большое количество данных- или оказывается не привязанной к конкретному индикатору или скрипту- тогда имеет смысл сделать DLL "невыгружаемой". Реализация "невыгружаемости" достаточно простая- при загрузке (process attach) DLL загружает саму себя еще раз.
Я заметил, что DLL, работавшая на MT4, вдруг отказалась работать с MT5. Вызов Process Detach от MT5 приводил к тому, что цикл ожидания выхода из GUI thread в моей DLL оказывался бесконечным.
Оказалось, что MT5 при выходе из приложения... производит весьма оригинальное действие- он убивает сначала мой поток- потом окно. При этом, естественно, пользователь не может ничего сохранить (поскольку окно не получает сообщения на закрытие), DLL не может нормально выгрузится.
Нельзя ли попросить у уважаемых разработчиков комментариев относительно целей, которые они преследовали при написании столь варварской процедуры деинициализации? Можно ли ожидать, что поведение программы станет более стандартным?