Помощь - Поиск - Пользователи - Календарь
Полная версия: Инсталлятор программ
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
sheka
Оно работает, что само по себе удивительно. Поэтому посмотрите, пожалуйста, и укажите на то, что не есть хорошо.Нажмите для просмотра прикрепленного файла
Как узнать, установилась ли программа?
Думаю таймером, например, каждую секунду, проверять, не появились ли доступные кнопки для продолжения.
Таким же образом (добавить в таймер) проверять не поменялось ли главное окно.

Почему-то не работает таймер. Ни со своей функцией обработки, ни с функцией главного окна. Запуск и остановка таймера проходят успешно, но функции обработки работа не передается.
sheka
Ошибался. Передается. Просто между моими SetTimer и KillTimer проходило времени меньше 1мс Следовательно WaitForSingleObject() - полный тормоз, чего не ожидал. А так как сообщения от таймера "могут не обрабатываться, если их много накапливается в очереди", то даже по окончании WaitForSingleObject() не делается OnTimer то количество раз, которое он бы сделал за это время.

Что делать в этом случае? Ведь когда программа установилась, инсталлятор обычно просит нажать "Finish" и это надо отследить.
IUnknown
А можно (для тех, у кого нет VC++ и MFC) показать скриншот интерфейса программы, и описать, что именно программа должна делать?
sheka
Нажмите для просмотра прикрепленного файла *.ехе сможете запустить? Если нет - вот скрин Нажмите для просмотра прикрепленного файла
Выбранные программы в верхнем ЛистБоксе запускает, нажимает кнопки с введенными ниже названиями, ожидает закрытия запущенной программы, повторяет.
Лог - для проверки. Пока выводит только оповещение об окончании процесса.
Lapp
Цитата(sheka @ 25.08.2011 1:41) *
*.ехе сможете запустить?

[offtop]я живо представил себе IUnkonown чешущим репу и пытающимся сообразить - а сможет ли он запустить все экзешники хором в текущем каталоге (а также, какой каталог у него текущий))? или речь шла про все экзешники на всем компьютере?.. lol.gif [/offtop]
Krjuger
Я как ни странно имея VS не смог откомпилировать код))Конвертация тоже закончилась провалом)
Я так и не понял в чем проблема?Что необходимо то....
Не есть хорошо то,что после некоторого ожидания в районе 1 секунды,если не закрыть программу с кнопочками,то программа поиска и нажатия зависает до тех пор пока не закроеш программу с кнопочками.Именно зависает,не ожидает.
Еще не понятно почему нарушается последовательность искомых кнопочек,даже по скрину видно,что ввод начинается с 2 кнопки и заканчивается первой делая круг,для других примеров у меня получилось тоже самое.
IUnknown
Цитата
Выбранные программы в верхнем ЛистБоксе запускает, нажимает кнопки с введенными ниже названиями, ожидает закрытия запущенной программы, повторяет.
Навскидку (по твоему скрину + исходникам) вижу как минимум одну ошибку и один недочет...

Ошибка: кнопки нажимаются не в том порядке, в котором присутствуют в листбоксе. Чтобы было в нужном порядке - нужно для каждого элемента листбокса запускать EnumChildWindows (и, пока найденная кнопка неактивна, не проходить дальше по списку в листбоксе, а ждать, когда она станет активной. Другого пути, кроме использования таймера и как минимум одной доп. глобальной переменной для этого - индекс ожидаемой в данной момент кнопки из нижнего листбокса - я пока не вижу), а не просто проходить по всем окнам, и смотреть, есть ли заголовок в списке.

Недочет: что, для всех программ нажимается одна и та же последовательность кнопок? Это неправильно, нужно иметь возможность для каждой программы из верхнего листбокса иметь свой список кнопок для нажатия.

А вообще непонятен смысл создания такого приложения. То есть, для начала, ты должен сам запустить инсталлятор, чтобы выяснить последовательность нажатия кнопок, и только потом - забросить его в свое приложение? Смысл?

Цитата
а сможет ли он запустить все экзешники хором в текущем каталоге
Проблема-то вся в том, что у меня вообще нет exe-файлов no1.gif

Добавлено через 4 мин.
Цитата
Еще не понятно почему нарушается последовательность искомых кнопочек,даже по скрину видно,что ввод начинается с 2 кнопки и заканчивается первой делая круг,для других примеров у меня получилось тоже самое.
Потому что поиск организован некорректно, см. выше... На данный момент кнопки нажимаются не в том порядке, как они перечислены в листбоксе. Скорее всего, нажимаются кнопки, перечисленные в листбоксе, в порядке, задаваемом TabOrder-ом (или как там Windows перечисляет контролы в Enum...-функциях?)
Krjuger
Цитата
Недочет: что, для всех программ нажимается одна и та же последовательность кнопок? Это неправильно, нужно иметь возможность для каждой программы из верхнего листбокса иметь свой список кнопок для нажатия.

Скорее всего,ну или как я себе пресдавляю,поиск будет лиш 3 кнопок,причем с приоритетом.Кнопки "Далее","Обзор","Финиш",Ну и собсвенно последовательность будет бесконечная,до тех пор пока не нажмем финиш ,после чего переход к следующей строчке списка,ну и если на текущий момент есть кнопки далее и обзор,то стачала обзор, устанавливаем директорию, потом далее.Если это расчитано на параллельную установку сразу нескольких программ,то это в большинстве случаев не прокатит.Но ценность данной программы весьма сомнительна,только если после очередной чистки диском или переустановки ОС быстренько установить "джентельменский" набор))
IUnknown
Цитата
Кнопки "Далее","Обзор","Финиш",Ну и собсвенно последовательность будет бесконечная,до тех пор пока не нажмем финиш ,после чего переход к следующей строчке списка
Ну, и неправильно. В одном и том же инсталляторе можно сделать Next -> Next -> Finish (то есть, тебя остальные параметры мало интересуют), а можно - Next -> Next -> Next -> Next -> Next (на этой странице чего-то подкрутил) -> Finish. И какой с учетом вышесказанного должен быть приоритет у кнопок? Как только появилась/стала активной Finish, жать ее, до тех пор - Next?

Цитата
только если после очередной чистки диском или переустановки ОС быстренько установить "джентельменский" набор))
Гугл знает: unattended installation
Krjuger
Цитата

Ну, и неправильно. В одном и том же инсталляторе можно сделать Next -> Next -> Finish (то есть, тебя остальные параметры мало интересуют), а можно - Next -> Next -> Next -> Next -> Next (на этой странице чего-то подкрутил) -> Finish. И какой с учетом вышесказанного должен быть приоритет у кнопок? Как только появилась/стала активной Finish, жать ее, до тех пор - Next?

Ну так речи про "подкрутил" вообще нету.Тут уже голова нужна,а то подкрутить можно так,что и не поедет...Как без участия человека выбирать какие галочки нужны,тут уже не мой уровень,как это сделать при повторной установке со скрипом понятно,можно попробовать сохранить прошлую конфигурацию,но тут вылезет опять куча НО..Например,если это первая установка подобной программы,где брать прошлую конфигурацию.Да и где все эти конфигурации хранить..Создавать БД...Овчинка выделки не стоит.

Да и вообще я привел весьма утрированный пример,конешно почти в каждой программе вылезает окошко с лицензионным соглашением, где надо нужную калочку поставить,иначе не встанет,что в моем примере явно не прокатит.Но это на мой взгляд наиболее простой вариант развития событий,несомненно у него есть минусы,некоторые были уже приведены выше.

Гугл молодец,но даже на примере установки "семерки" этим способом,до начала установки необходимо выбрать все нужные галочки прочитать соглашение и тд.Сделать подобное для 1 программы несложно,но как сделать это для большинства устанавливаемых программ?Потрошить инсталятор, заранее выводить всю запрашиваемую в последствии инфу,заранее ее ввести,запомнить,и когда надо вставить в нужные поля.Тогда встает вопрос, как распотрошить инсталяторы.А это вроде уже не совсем законно..Но зато такой вариант будет универсальным.
Возможно я что то не правильно понял и это можно сделать как то по другому,если что поправьте.
IUnknown
Цитата
Тогда встает вопрос, как распотрошить инсталяторы.
Нормальные инсталляторы не надо потрошить. На сайте MS легально лежит (ну, по крайней мере лежал) редактор БД Orca, который позволяет (разумеется, для Windows Installer-а, а не для самописного) создать так называемый Transform-файл (по простому - MST). Этот файл потом подхватывается самим инсталлятором, и установка происходит именно так, как ты задал. Вот старая статья по этому поводу: http://support.microsoft.com/kb/255905 , новую искать лень. Вот пример, как создается MST-файл для конкретного инсталлятора. Ну, а потом -
msiexec.exe /i TheInstaller.msi TRANSFORMS=myinstallation.mst

, и на фиг тебе не надо никакие кнопочки выискивать...

Ну, а уж коли речь о других (возможно - самописных) инсталлерах - то тут медицина бессильна... smile.gif Возможно, удастся задать нужные данные через ком. строку. Возможно - нет, зависит от качества велосипеда (велосипед в данном случае - всё, кроме Windows Installer-а, являющегося компонентом самой ОС)...
sheka
На проблему с порядком нажатия клавиш внимание обратил, но не придал этому особого значения. Помозгую.
Цитата
только если после очередной чистки диском или переустановки ОС быстренько установить "джентельменский" набор))
Именно так.
Цитата
Гугл знает: unattended installation...Windows Installer
Умеете обламывать велосипеды. smile.gif
Цитата
Я как ни странно имея VS не смог откомпилировать код))Конвертация тоже закончилась провалом)
VS 2005. Удалил папку Debug + *.ncb, чтобы место не занимало. После запуска *.sln все восстанавливается.

Цитата
Не есть хорошо то,что после некоторого ожидания в районе 1 секунды,если не закрыть программу с кнопочками,то программа поиска и нажатия зависает до тех пор пока не закроеш программу с кнопочками.Именно зависает,не ожидает.
Это WaitForSingleObject() виноват.
И все таки, как можно решить вот этот вопрос: Инсталлятор программ
Т.е. если мне нужно обрабатывать сообщения от программы (типа таймер) и одновременно ОТСЛЕЖИВАТЬ, не обязательно ожидать, окончание запущенного процесса?
IUnknown
Цитата
Т.е. если мне нужно обрабатывать сообщения от программы (типа таймер) и одновременно ОТСЛЕЖИВАТЬ, не обязательно ожидать, окончание запущенного процесса?
Проверять текущее состояние процесса в том же таймере. Для этого есть Функция GetExitCodeProcess. Если она возвращает STILL_ACTIVE, то процесс еще не завершился. Иначе - возвращенное значение как раз и есть код завершения процесса.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.