|
Как грамотно закрыть приложение при Uninstall?
|
|||
---|---|---|---|
#18+
Ну, нормальный человек сначала закроет программу, потом нажмет на Uninstall. Но рассчитывать на это нельзя. Естественно если exe запущен, то он и используемые им компоненты не удалятся. Установщик (своими средствами) с этим в общем случае не справляется. Оптимальным видится след. вариант. 1) Находим hwndTagret окна exe-шника через FindWindowEx либо правильнее перебором через EnumWindow с перепроверкой как я это делаю 2) Если hwndTagret <> 0, то шлем SendMessage (закройся) 3) Целевой exe-шник сообщение принимает и штатно делает все Unload - без kill-ов Ну как вариант снабдить proga.exe ключом proga.exe /exit т.е. ищет ранее запущенную AppInstance, шлет туда "закройся" сам выходит. Но здесь несколько вопросов тупо и сразу: 1) Как отслеживать что "вышло"? Это может быть несколько секунд. Путем долбежки на предмет hwndTagret <> 0 в цикле с DoEvent? Но hwndTagret это хэндл окна, а не процесс ассоциированный с exe. Хэндл м.б. уже закрылся а процесс еще не закончился. 2) Если hwndTagret несколько? Как правило один это контролируется, но не всегда. У меня есть exe-шники кот. могут быть запущены без нарушения логики в нескольких экземплярах. Напр., для каждой картинки свое окно (свой запуск exe). 3) Дальше. Компьютер запущен под "просто Юзер". Пришел админ удалять прогу. Пароль по запросу Uninstall ввел, Uninstall (и все что запускает Uninstall) запустился под "Admin", а exe естественно запущен как "User". Я сомневаюсь что SendMessage (закройся) в этом случае попадет в цель, да и вообще эта цель (hwndTagret) будет найдена в этом случае. Присоветуйте как сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2013, 22:01 |
|
Как грамотно закрыть приложение при Uninstall?
|
|||
---|---|---|---|
#18+
Принудительное закрытие программы - неправильно. Обнаружив, что программа запущена, следует сообщить об пользователю и предложить ему закрыть программу. Пока он этого не сделает - удаление не проводить. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2013, 22:45 |
|
Как грамотно закрыть приложение при Uninstall?
|
|||
---|---|---|---|
#18+
AkinaПринудительное закрытие программы - неправильно. Вы что под "принудительно" понимаете? Я под принудительно понимаю команду: Код: vbnet 1.
когда проге вякнуть не дают. И здесь я соглашусь что это неправильно. А если у нас не терминальный сервер, а обычная 7-ка, виста или XP с не более одним пользователем за экраном, то нажатие на Uninstall - вполне осознанное решение того кто за компом в данный момент сидит и философия - излишне. Другое дело, что запущенный exe должен быть закрыт грамотно. В пред. проге я использовал метод: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Не особо заморачивался, но кажется код вполне разумный. Но он без "отслеживания" что закрылось. Хотя у меня сейчас в главном exe сделан нек. подвох (крестик сворачивает в трей, а не выгружает) Код: vbnet 1. 2. 3. 4. 5. 6.
Посему код выше кот. не обеспечивает RealUnload = True попросту не сработает (равно как и taskkill без /F). Посему послать SendMessage и пусть сам себя закрывает как умеет разумнее. Дмитрий773) Дальше. Компьютер запущен под "просто Юзер". Пришел админ удалять прогу. Пароль по запросу Uninstall ввел, Uninstall (и все что запускает Uninstall) запустился под "Admin", а exe естественно запущен как "User". Я сомневаюсь что SendMessage (закройся) в этом случае попадет в цель, да и вообще эта цель (hwndTagret) будет найдена в этом случае. Здесь сделал тест и почти успокоился. Окно, запущенное под USER видно из-под ADMIN и даже наоборот. Поэтому снаряд выпущенный admin "в юзера" думаю попадет. Счас попробую набросать Test, кот. по ключу /quit выгружает все ранее запущенные экземпляры себя и поиграться немного. Нарочно в unload какую нибудь дрянь добавлю чтоб подольше не выгружался. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2013, 23:44 |
|
Как грамотно закрыть приложение при Uninstall?
|
|||
---|---|---|---|
#18+
Вот такой вариант сойдет? Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
FindMyWindow(1) -немного модифицированный вариант FindWindow - чтоб точно находила что надо - обсуждал тут недавно Она ищет "Form1" (+ проверяет наличие кнопки с зарезервированной абракодаброй) в данном случае Вопросы: 1) DoEvent одного хватит? 2) А вдруг из цикла не выйдет? Как бы подстраховаться? Элементарно невыход из цикла делается так: proga.exe -от имени Администратора потом proga.exe /quit -от имени тек. пользователя (не администратора) Наоборот (как в uninstall) естественно работает. Но ХЗ, вдруг там зависло чего-нибудь. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2013, 00:41 |
|
Как грамотно закрыть приложение при Uninstall?
|
|||
---|---|---|---|
#18+
Как такой вариант? Ну т.е. если за 10 сек с чем-то не удалось справиться, то типа ну его, висеть самим дальше смысла нет. Код конечно на безупречность логики не претендует, но для указанных целей думаю сойдет. Самое плохое что может быть 1) окно или часть окон не закроются 2) Uninstall не удалит файл или несколько файлов. Честно пытались помочь ему это сделать. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2013, 01:23 |
|
Как грамотно закрыть приложение при Uninstall?
|
|||
---|---|---|---|
#18+
Еще надо следить чтоб второстепенные формы вызывались кодом Код: vbnet 1.
а не Код: vbnet 1.
иначе послать WM_CLOSE основной формы не закроет приложение из-за того что второстепенная форма была открыта пусть бы даже модально. Ну т.е. ньюансы есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2013, 03:05 |
|
Как грамотно закрыть приложение при Uninstall?
|
|||
---|---|---|---|
#18+
Дмитрий77Еще надо следить чтоб второстепенные формы вызывались кодом Код: vbnet 1.
В принципе это далеко не всегда обязательно. Общий смысл такой: Если есть proga.exe то надо снабжать ее ключом proga.exe /quit И в деинсталлятор пихать эту команду для каждого потенциального exe из комплекта. Главное когда proga шлет WM_CLOSE "главным окнам" своих экземпляров, и выполняется FormMain_Unload, надо проверять частные случаи, когда кроме FormMain загружены еще другие, особенно модальные. Потому как то что невозможно сделать "ручками" (нажать крестик при запущенной поверх модальной форме), очень даже можно сделать через WM_CLOSE и имеющийся код на это не всегда рассчитан. Посему надо проверять, смотреть что мешает в каждом конкретном случае и исправлять (чтоб не висла и не уходила в Hide). Но это не очень пыльная работа. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2013, 05:22 |
|
Как грамотно закрыть приложение при Uninstall?
|
|||
---|---|---|---|
#18+
Дмитрий77нажатие на Uninstall - вполне осознанное решение того кто за компом в данный момент сидит... или случайное. Пользователь - личность творческая, а жисть куда как богаче фантазии. Хотя мне в общем начхать. Философия так философия. Вот только за каким хреном ты создаёшь тему, если уже принял решение? чтобы все тебе расказали, как ты ппц прав и мудр? или чтобы с собой побеседовать? нет, оно, конечно, с умным человеком всегда приятно поговорить, но тогда предупреждай, что ответов не требуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2013, 09:10 |
|
Как грамотно закрыть приложение при Uninstall?
|
|||
---|---|---|---|
#18+
Akina, >создаёшь тему, если уже принял решение? Если создаю, значит еще не принял. И на момент создания ответа не знаю. И иногда мне здорово помогают. Вот здесь Хочу понять логику "уведомлений в трей". Antonariy например дал мне очень ценную идею насчет "очереди из Notifications внутри приложения" -до меня бы не доперло. Хотя я и не стал использовать коллекции для реализации. >Пользователь - личность творческая, Ну да грешу. Немного протоколирую наработки где в общем понятно что ответов уже не будет. Но в этом есть плюс. Когда что-то надо найти/вспомнить то порой быстрее нахожу ответ на форуме в собственном топике чем в творческом бардаке своего компьютера. Не, с другой стороны, решение надо спрятать в коробочку и никому не рассказывать. Но здесь я как раз не сильно рискую, а кому нибудь м.б. пригодится. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2013, 11:11 |
|
Как грамотно закрыть приложение при Uninstall?
|
|||
---|---|---|---|
#18+
Дмитрий77>Пользователь - личность творческая, Ну да грешу. Немного протоколирую наработки где в общем понятно что ответов уже не будет. Я имел в виду конечного пользователя. Ту тупую безрукую скотину, которая хвостом бешеного мула запустит два экземпляра твоей программы (хотя она и защищена от повторного запуска - и на вопрос "Как???" стандартно ответит "Не знаю, я вообще ничего не делал."), и тут же стартанёт деинсталляцию (а то и три подряд)... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2013, 12:54 |
|
|
start [/forum/topic.php?fid=60&fpage=56&tid=2156891]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
2ms |
others: | 262ms |
total: | 388ms |
0 / 0 |