Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420

Редактирование инсталятора

05.10.2017, 09:50. Показов 1371. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Ранее я никогда не создавал установщики для программ, а тут вот внезапно понадобилось отредактировать уже готовый. Причём эта тема на удивление сложно гуглится. Само создание инсталятора найти можно без проблем, а вот дальше проблемы. И если честно, я даже не очень знаю, что надо показывать, чтобы вы мне помогли, так что говорите.
А задача в следующем: При установке пользователю надо выбрать какие именно компоненты он хочет поставить и какой язык ему нужен (на скриншоте это RadioButtons). Всё работает. Если после установки запустить файл установщика ещё раз, то у пользователя будет выбор: удалить программу или восстановить (кстати, вот где этот выбор я так и не нашёл). Нужно сделать так, чтобы в случаи выбора восстановления у пользователя спрашивали какие компоненты он хочет ставить и какой язык ему нужен.
В каком месте и как это вообще делается?
P.S. Сам проект кидать сюда очень накладно.
Миниатюры
Редактирование инсталятора  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.10.2017, 09:50
Ответы с готовыми решениями:

Файлы для инсталятора
Здравствуйте форумчане, такой вот вопрос, написал приложение, после чего нужно файлы засунуть в инсталятор, какие именно файлы требуется...

Создание инсталятора
Уважаемые форумчане! Подскажите с помощью какой программы можно создать установщик, в который входит несколько программ, например: -...

Проблемы с публикацией инсталятора
Здравствуйте, есть программа которая осуществляет подключения к удаленной бд через MySQL NET Connectors. Программу я наконец закончил, но...

17
 Аватар для XIST
1962 / 1072 / 148
Регистрация: 01.10.2009
Сообщений: 3,617
Записей в блоге: 1
05.10.2017, 19:02
FaceHoof, возьмите лучше
Code
1
inno setup
1
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
08.11.2017, 09:36  [ТС]
Попробовал разобраться с inno setup и, наверное, получилось. По крайней мере инсталятор вышел. Да вот беда: начальство настаивает, чтобы я работал именно в VS, потому что "всегда так делали и нефиг придумывать велосипед".
А потому проблема вновь актуальна: как редактировать инсталятор из VS? Где вообще смотреть и редактировать логику какое окно за каким идёт и как вести себя при том или ином выборе? А то сейчас для меня этот инсталер - это как литой металлический куб, который надо открыть... бррр...
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
08.11.2017, 10:03
Скинь свойства проекта IdentSetup или проект, - собирается в MSI в итоге?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.11.2017, 10:06
Цитата Сообщение от FaceHoof Посмотреть сообщение
Где вообще смотреть и редактировать логику какое окно за каким идёт
Правокликом по проекту, View, User Interface.

Цитата Сообщение от FaceHoof Посмотреть сообщение
как вести себя при том или ином выборе?
В окне User Interface выберите страницу для редактирования — например, RadioButtons как на скриншоте выше.
Справа в панели свойств пропишите свойство, которое будут устанавливать "шарики", на скриншоте выше это BTNSELECTDRIVERNAME.
После этого окошка данному свойству будет присвоено значение, соответствующее выбранному шарику — у вас это 1, 2, 3 или 4 (1 по умолчанию, свойство DefaultValue).
Это свойство можно использовать для того, чтобы устанавливать определенные файлы. Например, если выбрать в обозревателе проекта Primary Output from LaserDriverSERS и в панели свойств в поле Condition прописать BTNSELECTDRIVERNAME=4, то эти файлы будут установлены только тогда, когда была выбрана опция, соответствующая значению 4 в диалоге.
Если нужно производить какие-то дополнительне действия (изменить настройки после установки, например), то можно создать Custom Action, передать туда это свойство и работать с его значением напрямую.
0
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
08.11.2017, 10:18  [ТС]
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Скинь свойства проекта IdentSetup или проект, - собирается в MSI в итоге?
Прикрепил файл.
И да, наверное это стандартный MSI.
kolorotur, большое спасибо! Но всё равно не понятно... При первом запуске инсталера всё проходит по пунктам как есть в User Interface. Но если я запускаю исталер при уже установленной программе, то меня спрашивают хочу я удалить приложение или восстановить (приложил скриншот). Где здесь это окно?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.11.2017, 10:25
Цитата Сообщение от FaceHoof Посмотреть сообщение
Где здесь это окно?
Его там нет, оно добавляется автоматически и, насколько мне известно, его нельзя отключить стандартными свойствами — только через CustomAction.
0
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
08.11.2017, 10:33  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Его там нет, оно добавляется автоматически и, насколько мне известно, его нельзя отключить стандартными свойствами — только через CustomAction.
Да мне не отключить надо... На данный момент ситуация такова: При установке на новый компьютер (под новым подразумевается компьютер на котором данное приложение никогда не стояло) приложение устанавливается нормально но при запуске по каким-то причинам происходит восстановление и восстанавливается английская версия. Воспроизводится проблема только при первой установки, при всех последующих всё ок. Нужно узнать с чего вдруг происходит это восстановление. Уже перерыл всё что перерывается и в реестре по гуиду приложения смотрел, сравнивал реестр машины на которой приложение только установлено но ни разу не запускалось и обычный, но ничего. Всё вроде бы хорошо. Вот я и хочу посмотреть логику работы реестра и узнать где же происходит это ответвление от нормального запуска в сторону непонятного восстановления.
Цитата Сообщение от kolorotur Посмотреть сообщение
оно добавляется автоматически
Это так же значит, что после него невозможно добавить ещё одно окно с выбором языка для восстановления, на пример?
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
08.11.2017, 10:39
Цитата Сообщение от FaceHoof Посмотреть сообщение
и какой язык ему нужен.
Насчет языка - с MSI это можно проделать только через недокументированные возможности, создавая .mst диффы локализаций и заливая их в английскую версию, - при этом возможно автоопределение языка,
и\или запуск через
Bash
1
msiexec /i setup.msi TRANSFORMS=":0x0415"
Цитата Сообщение от FaceHoof Посмотреть сообщение
Нужно сделать так, чтобы в случаи выбора восстановления у пользователя спрашивали какие компоненты он хочет ставить
Тут хз, возможно ли такое на MSI, возможно, нужно писать оболочку-бутстраппер для него.
Можно попробовать отредачить MSI через Orca или др. утилиты
Но, там - темный лес, если не знаешь...
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.11.2017, 11:02
Цитата Сообщение от FaceHoof Посмотреть сообщение
при запуске по каким-то причинам происходит восстановление и восстанавливается английская версия.
Восстановление при запуске производится если не хватает каких-то компонентов, которые должны быть установлены.
Может, какой-нибудь файл устанавливается в какую-нибудь запрещенную папку или сама папка не создалась при установке, или что-то должно было при установке записаться в реестр, но не записалось.
Посмотрите лог событий, там должно быть событие от MsiInstaller, в нем должно быть указано какого компонента не хватает.
А что при починке устанавливает не ту версию — скорее всего как-то криво настроена условная установка файлов, например в обход установщика.

Цитата Сообщение от FaceHoof Посмотреть сообщение
Это так же значит, что после него невозможно добавить ещё одно окно с выбором языка для восстановления, на пример?
Да, т.к. восстановление — это именно восстановление.
Изменение установленных компонентов делается через опцию Change/Modify, но в студийном установщике она не поддерживается
0
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
08.11.2017, 12:41  [ТС]
kolorotur, события от MsiInstaller действительно есть, только в них нет совсем ничего необычного. Вот все, которые появились в журнале после установке на новую машину:
Product: Identification Application -- Installation completed successfully.
Windows Installer installed the product. Product Name: Identification Application. Product Version: 2.3. Product Language: 1033. Manufacturer: Optec. Installation success or error status: 0.
0
Unnamed
 Аватар для kingzfate
160 / 158 / 81
Регистрация: 09.06.2011
Сообщений: 852
08.11.2017, 13:00
FaceHoof, то что у вас Product Language: 1033 это ничего? Английский язык по умолчанию включен
0
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
08.11.2017, 13:16  [ТС]
kingzfate, да ничего. То, что пользователь выбрал при установке другой язык пишется в конфиг. Но после первого запуска запускается восстановление и трёт эту запись оттуда. Сейчас уже "не тот язык" - это второстепенная проблема. Куда важнее почему запускается восстановление при первом запуске.
0
Unnamed
 Аватар для kingzfate
160 / 158 / 81
Регистрация: 09.06.2011
Сообщений: 852
08.11.2017, 13:25
FaceHoof, ничего объективного сказать не могу по этому поводу, но попробуйте установить в программу в какой ни будь песочнице или программе со слежкой. Что бы можно было отследить пути установки на всем ПК. И так же проверить после первого запуска. Возможно и правда что-то "недоустанавливается"
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.11.2017, 15:29
Цитата Сообщение от FaceHoof Посмотреть сообщение
То, что пользователь выбрал при установке другой язык пишется в конфиг.
В какой? Как?

Цитата Сообщение от FaceHoof Посмотреть сообщение
после первого запуска запускается восстановление и трёт эту запись оттуда.
Восстановление, похоже, просто сверху записывает файл конфига (ветку в реестре?) из установщика.

Цитата Сообщение от FaceHoof Посмотреть сообщение
Куда важнее почему запускается восстановление при первом запуске.
Чего-то на момент запуска, наверное, не хватает.
Как происходит установка? Под какой учеткой? Под какой учеткой потом запускается установленная программа?
0
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
09.11.2017, 09:29  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
В какой? Как?
В папке с приложением лежит небольшой конфигурационный файл. В него пишется строка-параметр с языком. Записывается она в специальном классе приложения под названием Installer.cs
Наверное, не будет ничего страшного если я его сюда кину.
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
namespace IdentificationApplication
{
    [RunInstaller ( true )]
    public partial class Installer : System.Configuration.Install.Installer
    {
 
        #region Constructors
 
        public Installer ( )
        {
            InitializeComponent ( );
        }
 
        #endregion
 
        #region Public methods
 
        [SecurityPermission ( SecurityAction.Demand )]
        public override void Install ( IDictionary stateSaver )
        {
            base.Install ( stateSaver );
 
            if ( File.Exists ( Path.GetDirectoryName ( Assembly.GetExecutingAssembly ( ).Location ) + @"\LineHSServer.exe" ) )
                startLineServer ( Path.GetDirectoryName ( Assembly.GetExecutingAssembly ( ).Location ), true );
        }
 
        [SecurityPermission ( SecurityAction.Demand )]
        public override void Uninstall ( IDictionary savedState )
        {
            base.Uninstall ( savedState );
 
            if ( File.Exists ( Path.GetDirectoryName ( Assembly.GetExecutingAssembly ( ).Location ) + @"\LineHSServer.exe" ) )
                startLineServer ( Path.GetDirectoryName ( Assembly.GetExecutingAssembly ( ).Location ), false );
        }
 
        #endregion
 
        #region Private methods
 
        private void Installer_AfterInstall ( object sender, InstallEventArgs e )
        {
            // create folder in ProgramData
            String sDir = Environment.GetFolderPath ( Environment.SpecialFolder.CommonApplicationData ) + @"\Optec\IdentificationApp\";
            Directory.CreateDirectory ( sDir );
 
            // create directory for settings
            Directory.CreateDirectory ( sDir + @"Settings" );
            // create laser.xml
            AppProfile.Load ( ).Save ( );
 
            // create directory for archive
            Directory.CreateDirectory ( sDir + @"Archive" );
 
            // create directory for logs
            Directory.CreateDirectory ( sDir + @"Logs" );
 
            // create factory, user, calibration database folders
            String sBasesPath = sDir + @"Databases";
            Directory.CreateDirectory ( sBasesPath + @"\Manufacturer\m1" );
            if ( !Directory.Exists ( sBasesPath + @"\User\u1" ) && ! Directory.Exists ( sBasesPath + @"\User\u1.disabled" ) )
                Directory.CreateDirectory ( sBasesPath + @"\User\u1" );
            Directory.CreateDirectory ( sBasesPath + @"\User\Substance" );
            Directory.CreateDirectory ( sBasesPath + @"\Calibration" );
            // place calibration spectrum in Calibration database folder
            if ( !File.Exists ( sBasesPath + @"\Calibration\Polystyrene.dat" ) )
                File.Move ( Path.GetDirectoryName ( Assembly.GetExecutingAssembly ( ).Location ) + @"\Polystyrene.dat", sBasesPath + @"\Calibration\Polystyrene.dat" );
            Directory.CreateDirectory ( sBasesPath + @"\Image" );
 
            // Open App.Config of executable
            Configuration config = ConfigurationManager.OpenExeConfiguration ( Path.GetDirectoryName ( Assembly.GetExecutingAssembly ( ).Location ) + @"\Identification Application.exe" );
            // Add an Application Setting.
            config.AppSettings.Settings.Add ( "DatabasesPath", sBasesPath );
 
            if ( Context.Parameters [ "selectedLanguage" ] == "1" )
            {
                config.AppSettings.Settings.Add ( "Language", "Ru" );
            }
            else
            {
                config.AppSettings.Settings.Add ( "Language", "En" );
            }
            // Save the changes in App.config file.
            config.Save ( ConfigurationSaveMode.Modified );
            // Force a reload of a changed section.
            ConfigurationManager.RefreshSection ( "appSettings" );
 
            // profiles
            Directory.CreateDirectory ( Profile.ProfilesPath );
            // default - profile
            String sManufactureProfile = Profile.ProfilesPath + "default.xml";
            Profile.Load ( sManufactureProfile ).Save ( sManufactureProfile );
 
            // users
            Directory.CreateDirectory ( User.UsersPath );
            // optec_admin - user
            if ( !File.Exists ( User.UsersPath + "optec_admin.xml" ) )
                new User ( ) { Password = "tMgt82&Q", FullName = "ОПТЭК", Role = Role.SuperUser, Profile = "default" }.Save ( User.UsersPath + "optec_admin.xml" );
            // admin - user
            if ( !File.Exists ( User.UsersPath + "admin.xml" ) )
                new User ( ) { Password = "admin", FullName = "Администратор", Role = Role.Admin, Profile = "default" }.Save ( User.UsersPath + "admin.xml" );
            // user - user
            if ( !File.Exists ( User.UsersPath + "user.xml" ) )
                new User ( ) { Password = "q1w2", FullName = "", Role = Role.User, Profile = "default" }.Save ( User.UsersPath + "user.xml" );
 
            // get full control of app's ProgramData folder
            DirectorySecurity dir_security = Directory.GetAccessControl ( sDir );
            dir_security.AddAccessRule ( new FileSystemAccessRule ( new SecurityIdentifier ( WellKnownSidType.WorldSid, null ),
                                                                    FileSystemRights.FullControl,
                                                                    InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
                                                                    PropagationFlags.None,
                                                                    AccessControlType.Allow ) );
            Directory.SetAccessControl ( sDir, dir_security );
        }
 
        private static void startLineServer ( string targetDir, bool isInstall )
        {
            ProcessStartInfo psi = new ProcessStartInfo ( targetDir + @"\LineHSServer.exe", isInstall ? "/Register" : "/Unregister" );
 
            Process p = new Process ( )
            {
                StartInfo = psi
            };
            p.Start ( );
            p.WaitForExit ( );
        }
 
        #endregion
 
    }
}

Цитата Сообщение от kolorotur Посмотреть сообщение
Как происходит установка? Под какой учеткой? Под какой учеткой потом запускается установленная программа?
Установка происходит из под администратора, а вот запуск и правда нет... Проверю этот момент, чтобы знать наверняка.

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

Добавлено через 17 часов 32 минуты
kolorotur, действительно, если устанавливать и запускать из под администратора, то проблема не воспроизводится. Но что это значит? Что при установке что-то было закинута туда, куда есть доступ только у админа и при запуске нам приходится это закидывать ещё раз?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
09.11.2017, 10:37
Цитата Сообщение от FaceHoof Посмотреть сообщение
В папке с приложением лежит небольшой конфигурационный файл. В него пишется строка-параметр с языком.
В общем-то, вот и причина повторного запуска установщика.
По умолчанию установщик создает не обычный ярлык на программу, а т.н. Advertised Shortcut. Если вы откроете свойства этого ярлыка, то увидите, что путь к исполняемому файлу не указан и его невозможно изменить.
Особенность таких ярлыков в том, что при запуске через них приложения пакет установки проверяет целостность всех установленных компонентов и если какого-то из них не хватает или он был изменен, то установщик автоматически запускает восстановление и перезаписывает измененные и добавляет отсутствующие файлы из пакета установки.

Решения проблемы мне видится два:
1. Отключите в установщике опцию создания подобных ярлыков. Для этого надо где-нибудь установить свойство DISABLEADVTSHORTCUTS на значение 1 — тогда установщик будет создавать обычные ярлыки с путем к файлу, по запуску из которых не будет производиться валидация. Надо признать, что в проекте установки, поставляемом со студией, значение свойств можно устанавливать только через пользовательский интерфейс
Один из вариантов — заменить окно Welcome на, например, Checkboxes, скопировать из окошка Welcome в окошко с чекбоксами весь текст, самим чекбоксам выставить свойство Visible на false, одному из них установить свойство DISABLEADVTSHORTCUTS и значение Checked. После чего окно Welcome удалить из установщика.

2. Этот вариант, как мне кажется, лучше: хранить языковые настройки не в настройках приложения, а в пользовательских настройках. В пользовательские конфиги установщик не суется и дополнительным бонусом будет возможность каждому пользователю устанавливать свой язык приложения.
3
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
09.11.2017, 16:01  [ТС]
kolorotur, большое спасибо за подробный ответ!
Но я не понял один момент: Почему восстановление происходит только после первой установки приложения? Все последующие разы я могу удалять и заново устанавливать приложение сколько влезет и никакого восстановления не будет, хотя конфиг меняется точно так же.
P.S. А если поменять конфиг руками, то да, таки запускается восстановление.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.11.2017, 16:01
Помогаю со студенческими работами здесь

Создание инсталятора
Привет всем. Понадобилось создать программу которая будет создавать инсталятор. Интерфейс инсталятора уже написан. Все файлы...

Создание инсталятора
Здравствуйте, создаю инсталлятор программы, но почему то библиотеки подчеркнуты красным, но никаких ошибок нет, вообщем не создается и-за...

Создание инсталятора
Всем доброго времени суток. Многие на форуме задавали этот вопрос но вразумительного ответа я не нашел... Есть много способов создать...

Создание инсталятора c#
Здравствуйте. Задача - создать инсталлятор. Пытаюсь это сделать через Visual 2012, он потребовал регистрацию. Письмо на почту не приходит....

Создание инсталятора
Здравствуйте. Не подскажите пожалуйста, как создать инсталятор для проекта делфи(какая программа лучше всего для этого подойдет) и как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru