Давным-давно был отработан код деинсталлятора с самоудалением: копируем себя во временный файл, открываем его с FILE_FLAG_DELETE_ON_CLOSE, запускаем через CreateProcess, передавая свой Process Id, ждем, пока он установит флаг, завершаемся, он дожидается нашего завершения, делает все, что нужно, завершается — система его удаляет.
Все отлично работало, начиная с NT4 и кончая 2003. В висте, как водится, работать перестало Никаких ошибок не возникает — файл копии благополучно открывается, но при завершении не удаляется. Такое ощущение, что в висте изменилась логика отметки файла для удаления.
Вопрос: как проще всего поменять алгоритм, чтобы он и работал в любой NT-системе, и не был связан с шаманством типа последовательного запихивания в стек адресов системных функций?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Давным-давно был отработан код деинсталлятора с самоудалением: копируем себя во временный файл, открываем его с FILE_FLAG_DELETE_ON_CLOSE, запускаем через CreateProcess, передавая свой Process Id, ждем, пока он установит флаг, завершаемся, он дожидается нашего завершения, делает все, что нужно, завершается — система его удаляет.
ЕМ>Все отлично работало, начиная с NT4 и кончая 2003. В висте, как водится, работать перестало Никаких ошибок не возникает — файл копии благополучно открывается, но при завершении не удаляется. Такое ощущение, что в висте изменилась логика отметки файла для удаления.
ЕМ>Вопрос: как проще всего поменять алгоритм, чтобы он и работал в любой NT-системе, и не был связан с шаманством типа последовательного запихивания в стек адресов системных функций?
Здравствуйте, IID, Вы писали:
IID>создай BAT файл, который потом сам себя прибъет
Так я делал под 9x. Под NT получилось более изящно — с DELETE_ON_CLOSE. С bat-файлом много возни, и возникают лишние риски того, что одно не запустится, другое — не завершится...
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, IID, Вы писали:
IID>>создай BAT файл, который потом сам себя прибъет
ЕМ>Так я делал под 9x. Под NT получилось более изящно — с DELETE_ON_CLOSE. С bat-файлом много возни, и возникают лишние риски того, что одно не запустится, другое — не завершится...
хз, у меня все прекрасно завершается. Как вариант — подстрахуйся с MoveFileEx, DELAY_UNTIL_REBOOT
Здравствуйте, IID, Вы писали:
IID>хз, у меня все прекрасно завершается.
У меня (в тестах) — тоже Но надо, чтоб работало везде, у всех юзеров, а практика показывает, что усложнение почти обязательно ведет к росту процента глюков.
IID> Как вариант — подстрахуйся с MoveFileEx, DELAY_UNTIL_REBOOT
Здравствуйте, TarasCo, Вы писали:
TC>Скорее всего просто нет прав на удаление файла.
Так в этом случае CreateFile возвращала бы ошибку. И в случае, если процесс создать не удается, файл успешно удаляется.
Я все-таки грешу на тонкости поведения висты.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Самоудаление под вистой
От:
Аноним
Дата:
15.01.07 15:51
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, TarasCo, Вы писали:
TC>>Скорее всего просто нет прав на удаление файла.
ЕМ>Так в этом случае CreateFile возвращала бы ошибку. И в случае, если процесс создать не удается, файл успешно удаляется.
ЕМ>Я все-таки грешу на тонкости поведения висты.
А мож виста файл экзешника держит какое-то время в надежде на то что программу опять запустят (или еще там какойто хитрявый механизм) и плюют на влаг DELETE_ON_CLOSE? Мож надо подождать/поработать пол-часика и посмотреть — удаляется он в итоге или нет?
Здравствуйте, <Аноним>, Вы писали:
А>А мож виста файл экзешника держит какое-то время в надежде на то что программу опять запустят (или еще там какойто хитрявый механизм) и плюют на влаг DELETE_ON_CLOSE? Мож надо подождать/поработать пол-часика и посмотреть — удаляется он в итоге или нет?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Есть, конечно. Я вообще под нативным админом проверяю.
Я имею ввиду проверить программно, IsUserAdmin(). Я столкнулся с тем, что даже под админом в Viste
только запуск моей программы "Run as administrator" дал нужный результат.
Здравствуйте, mansur, Вы писали:
M>Я имею ввиду проверить программно, IsUserAdmin().
А зачем? Для использования FILE_FLAG_DELETE_ON_CLOSE не требуется прав администратора.
M>Я столкнулся с тем, что даже под админом в Viste только запуск моей программы "Run as administrator" дал нужный результат.
"Под админом" — это под родным юзером Administrator (предварительно разблокированным), или под юзером из группы Administrators? Если второе — так и должно быть. Если первое — как запускаете?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>А зачем? Для использования FILE_FLAG_DELETE_ON_CLOSE не требуется прав администратора.
Кто знает, может и требуются, я всего лишь предлагаю попробовать...
ЕМ>"Под админом" — это под родным юзером Administrator (предварительно разблокированным), или под юзером из группы Administrators? Если второе — так и должно быть. Если первое — как запускаете?
Особо не заморачивался этим вопросом, кажется под логином, которым устанавливал Висту.
Тоже свой простенький инсталлятор, и без функции IsUserAdmin() нето что файл не удалялся, даже иконка на
десктопе не прорисовалась как нужно.
И еще заметил багофичу — чекбокс со стилем BS_PUSHLIKE("button") при включенных темах показывется инверсно — нажатый закрашивается и наоборот,
причём с кнопками и стандартными чекбоксами всё в порядке. Пока до лучших времен инвертировал реакцию на нажатие чекбокса, осталось как-то отловить включение темы.
С уважением mansur.
Здравствуйте, mansur, Вы писали:
ЕМ>>"Под админом" — это под родным юзером Administrator (предварительно разблокированным), или под юзером из группы Administrators?
M>Особо не заморачивался этим вопросом, кажется под логином, которым устанавливал Висту.
Во, а надо было бы заморочиться Ибо те аккаунты, который виста предлагает создать в конце установки — это обычные юзеры, включенные в группу администраторов. У них по умолчанию права далеко не полные, в тех случаях, когда виста сама догадывается, что прав может не хватить — она спрашивает. Но для своего инсталлятора она не догадается. А администраторский аккаунт нужно разблокировать, чтобы он стал доступен для логина.
M>Тоже свой простенький инсталлятор, и без функции IsUserAdmin() нето что файл не удалялся, даже иконка на десктопе не прорисовалась как нужно.
IsUserAnAdmin, по документации, говорит только о том, что пользователь включен в группу администраторов.
M>И еще заметил багофичу — чекбокс со стилем BS_PUSHLIKE("button") при включенных темах показывется инверсно — нажатый закрашивается и наоборот,
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>IsUserAnAdmin, по документации, говорит только о том, что пользователь включен в группу администраторов.
Прошу прощения, IsUserAdmin() Игоря Вартанова отсюда: http://rsdn.ru/article/qna/baseserv/isusradm.xml
В своей утилите http://lookanet.com/download/lookanet.exe я использую IsUserAdmin() для включения некоторых фич,
а в Висте пришлось использовать и в инсталляторе.
ЕМ>RTM или RC?
Windows 6.0 build 6000.
ЕМ>Можно багрепорт написать
А можно сие делегировать вам?
Суважением mansur.