Сейчас на форуме: jinoweb (+6 невидимых) |
eXeL@B —› Программирование —› Решить проблему с принудительным закрытием программы (Delphi) |
Посл.ответ | Сообщение |
|
Создано: 26 января 2018 18:47 · Поправил: Kindly · Личное сообщение · #1 Дабы далеко по программерским форумам не ходить, создал здесь Проблема заключается с принудительным закрытием всего приложения, если закрыть окно консоли, вызванной через AllocConsole. Используется это в патч-мейкере: https://exelab.ru/f/action=vthread&forum=3&topic=23332&page=0#16 Прежде чем писать, гугла вкурил сколько мог, но безрезультатно. Итак, патч-мейкер имеет возможность компилировать без отображения консольного окна, так и с ним. Залил образец для тестирования: https://www.upload.ee/files/7940823/pack.7z.html Как проверять: - анпакнуть желательно в корень диска C, чтобы пути не менять. - все установки настроены, от вас требуется нажать кнопку Build Patch. - после этого начнется создание патча и вызов консольного окна на момент обработки скрипта препроцессором инно. - повторите компиляцию и успейте закрыть консоль вручную - всю программу ожидает вылет. - в папке DLLSRC исходник dll, а саму dll нужно закидывать в папку pdata патч-мейкера ISXPM_. В качестве попытки был использован обработчик, а процедура FreeConsole в нем не приносит нужного эффекта. Code:
Нужно, чтобы при любом ручном закрытии консоли, она закрывалась и возвращала код ошибки или успешной отработки и при этом не гасила программу. А дальше я ловлю код ошибки и уведомляю пользователя об отмене компиляции. Если отметить опцию SimplyLog в Build and Log Options, то консоль будет вызываться не через dll, а через инновскую Exec (аналог CreateProcess) и при ее досрочном закрытии будет возвращен код ошибки. Вызов консоли с отображением процесса компиляции через dll возможен только с отключенной опцией SimplyLog. По моему понятию, нужно где-то вызвать FreeConsole так, чтобы она безвредно закрыла консоль и не позволила приложению улететь. Просьба гуру подсказать ----- Array[Login..Logout] of Life |
|
Создано: 26 января 2018 19:39 · Личное сообщение · #2 Kindly увы, только так. а на контрол-хендлере и обрабатывай брейки от юзера Code:
----- От многой мудрости много скорби, и умножающий знание умножает печаль | Сообщение посчитали полезным: Kindly |
|
Создано: 26 января 2018 20:15 · Личное сообщение · #3 ajax, ну так норм робит и обрабатывает, можно вернуть и выполнить в обработчике уже что угодно. Этот метод вполне подойдет. Спасибо!!! Если кто желает найти способ как заставить обработчик корректно выполниться до разрушения консоли после нажатия на "крестик", то можете предоставить решение. А пока повисит тема пару дней до закрытия. ----- Array[Login..Logout] of Life |
|
Создано: 26 января 2018 22:59 · Поправил: mysterio · Личное сообщение · #4 Code:
----- Don_t hate the cracker - hate the code. |
|
Создано: 26 января 2018 23:33 · Личное сообщение · #5 |
|
Создано: 27 января 2018 00:06 · Поправил: mysterio · Личное сообщение · #6 Качнул исходник: там обрабатывается bTest - засунь ее в обработчик, присваивай False. поменяй местами строки вида: Code:
----- Don_t hate the cracker - hate the code. | Сообщение посчитали полезным: Kindly |
|
Создано: 04 февраля 2018 12:56 · Поправил: Kindly · Личное сообщение · #7 Все сделал норм, но в ходе теста на Windows 10 возник глюк, как оказалось, 10-ка не переваривает для записи в консоль процедуру write или writeln, т.е. запись в цикле работает, но только первый раз, потом выбивает ошибку и вылет приложения, перезапускаешь прогу - опять, первый раз работает, потом ошибка и вылет. решение: перед циклом объявляем: Code:
в цикле: Code:
может когда кому пригодится ----- Array[Login..Logout] of Life |
eXeL@B —› Программирование —› Решить проблему с принудительным закрытием программы (Delphi) |