Просмотр темы форума
Тема: Ошибки 7-й версии (юникодной)
Сразу замечу в 6.4.0 все нормально.
В 7.2.1 (указано в 'О программе') команда 'Изменить переменную-Получить [Имя файла]' установка вылетает, если в имени файла нет расширения.
Похоже, юникодную версию для полноценных проектов использовать не возможно, мне не удалось ни один свой полноценный проект запустить без ошибок на 7-й. Что-то ну очень простое будет работать, но это уже не серьёзно для инсталлятора. Получается создание нового инсталлятора с нуля и многолетним тестированием, что согласитесь уже сложно назвать нормальным. Я не хотел бы после стольких лет изучения CreateInstall бросать и искать что-то другое. Хотя я думаю в таком случае просто лучше использовать 6-ю, ещё ни один год она будет работать, а использовать новые уже просто не имеет смысла, все равно не работают.
Ещё раз напишу, только если по умолчанию будет все работать как в 6-й (не юникодной) включая создание инсталляций, а не только использование уже готовых установок имеет смысл вообще делать перевод на юникод. А так получается, что все серьёзные проекты просто не работаю в 7-й, а 6-я уже не будет развиваться, и в чем тогда смысл существования 7-й для тех, кто давно им пользуется, все отлаженные проекты заново 'вылизывать' для 7-й просто не возможно. Для тех, кто первый раз будет пользоваться 7-й может быть и интересно, но для меня, например уже нет смысла использовать 7-ю.
>В 7.2.1 (указано в 'О программе') команда 'Изменить переменную-Получить [Имя файла]' установка вылетает, если в имени файла нет расширения.
Аналогично проблеме со встроенными файлами. Перепробовали разные варианты - всё работает нормально. На какой версии Windows собираете установки?
Пришлите ваш .ci проект где проявляется ошибка на info@createinstall.com.
По переходу от 6 к 7 версии. Я могу вспомнить сейчас только три вещи, которые работают по другому.
1. Кодировка файлов в Readme и License должна быть в UTF-8 или уникод.
2. Calculate Hash по умолчанию работает с UTF-8. Нужно использовать noutf в дополнительных параметрах.
3. Если используются строки на русском в команде Исходный код - то они неверно обрабатываются. Можно обойти выносом в отдельный .g файл или работать через переменные и функции macrox_...
На данный момент 7-я версия может не такая стабильная как 6, но все ошибки исправляются как можно быстрее и сейчас каких-то критических ошибок нет.
Уточняю.
1) 'Изменить переменную-Получить [Имя файла]' установка вылетает, если в имени файла нет расширения.
Проблема возникает если в пути есть точка, а сам файл без расширения.
пример пути с ошибкой: C:\test4.1\пример
2) Команда 'Встроенные файлы'
Проблема проявляется если команда находится внутри команды 'Исходный код' если команду 'Встроенные файлы' вынести за пределы команды 'Исходный код' то все работает.
3) Команда 'Диалог-Readme'
Если файл используется заранее известный то это не проблема . Но суть в том, что сам файл может создаваться в процессе установки динамически и вот здесь и возникла проблема, что текст в юникоде не все программы и утилиты могут выводит, а с Win1251 это проще. Поэтому получится, что его нужно будет конвертировать в юникод, перед выводом, а здесь может быть и уже есть проблема конвертирования связанная с размером самого файла, особенно если таким образом выводить отчет, созданный в результате работы какой-то программы, а размер за ранее не известен. При том, что сам установщик выводит файл больших размеров нормально, а вот конвертирование не так уж и однозначно получается.
4) 'Изменить переменную-Вычислить хэш'
С noutf это я понятно, но суть в том что очень много готовых и отлаженных частей кода инсталлятора уже создано и используется во многих проектах и везде есть мелкие модификации, которые в ручную отловить уже не просто, когда проблема возникает в цепочке операций уже готового проекта. Если делать с нуля, то конечно уже можно многое учесть, но с ранее сделанными это не просто. Особенно когда вылезают ещё и ошибки появившиеся в самой 7-й.
По 1 и 2 пункту - ошибки исправлены.
По 3 пункту - Определите переменную Readansi и присвойте ей 1 в команде Диалог - Readme. Для Диалог - Лицензия определите переменную Licansi. В этом случае, можно использовать файлы в кодировке Windows 1251 и они будут обрабатываться как раньше.
Мы выпустили версию 7.2.2 со всеми этими исправлениями и изменениями. Скачать можно на сайте.
Очередная проблема в 7.2.2. Если порядок команд:
1) Диалог-Прогресс { внутри любые команды }
2) Диалог-Установки (вне команды Диалог-Прогресс)
то кнопка 'Отмена' нажимается, но не срабатывает.
Если перед 'Диалог-Установки' добавить любую команду (вне команды Диалог-Прогресс) то кнопка 'Отмена' работает.
Откройте CreateInstall\cmds\sources\dlgprog.g
Найдите там в самом конце
macrox_setint( "DOK", macrox_getint("DOK_") )
if macrox_getint("Progauto") : id = $IDC_NEXT
}
}
return defcmdproc( wnd, id )
}
и вставьте перед macrox_setint( "DOK", macrox_getint("DOK_") )
gcancel = 0
Ближайшее обновление будет содержать это исправление.
Давно заметил (и в 6-ке и 7-ке есть) проблему при распаковке 7z архивов. Если при сжатии архива 7z включён параметр ‘Размер блока - Непрерывный’ (Solid Block size – Solid), то при распаковке инсталлятор занимает очень много памяти, точнее полный размер архива, архив целиком загружается в память и если архив огромный несколько гигабайт, то это огромная проблема. Если этот режим выключен то всё нормально. При распаковке архива в 7z, SFX модулем распаковки или другими программами, для распаковки используется размер памяти указанный при создании архива как и положено. Нужно подправить команду для распаковки.
Мы просто скомпилировали исходники для распаковки, которые предоставляет 7z.
Они и отвечают за отведение памяти при распаковке. Там проблематично будет разобраться и что-то исправить.
Возможно в 7z какие-то дополнительные параметры нужно передовать, я посмотрел другие программы которые используют DLL для распаковки 7z, и вроде они столько памяти не требуют.
И ещё в 7-й версии в команде 'Изменить переменную' есть 'Прибавить' и 'Добавить' в справке они так и написаны, а в самой команде это два одинаковых пункта 'Добавить'.
Как сложно пользоваться 7-й, так и не получилось ещё ни чего серьёзного сделать. Все работает вперемешку то ANSI, то UTF8, не понятно, что где получится.
1) При использовании 'INI файл - получить значение' включено 'Кодировка UTF-8'.
При получении значения, если INI файла нет, а в качестве значения по умолчанию выбрано, к примеру, #exepath# в котором есть русский буквы, то получаем абракадабра в пути с выключенным UTF-8 все нормально.
>Возможно в 7z какие-то дополнительные параметры нужно передовать, я посмотрел другие программы которые используют DLL для распаковки 7z, и вроде они столько памяти не требуют.
Распаковывали для сравнения одинаковые архивные файлы?
>И ещё в 7-й версии в команде 'Изменить переменную' есть 'Прибавить' и 'Добавить' в справке они так и написаны, а в самой команде это два одинаковых пункта 'Добавить'.
Исправим в ближайшей версии. Пока можно переключиться на английский язык.
>1) При использовании 'INI файл - получить значение' включено 'Кодировка UTF-8'. При получении значения, если INI файла нет, а в качестве значения по умолчанию выбрано, к примеру, #exepath# в котором есть русский буквы, то получаем абракадабра в пути с выключенным UTF-8 все нормально.
Исправил. Можно взять новый /cmds/sources/ini.g файл по этой ссылке
https://yadi.sk/i/C7CbzOW0oJGXd
При использовании нового 'ini.g' значения в командах INI вообще перестали устанавливаться и с UTF и без UTF, значения не получаются их файла при любом режиме и не устанавливаются значением по умолчанию.
Когда я тестировал эту проблему с 7z, я создавал два архива для двух режимов (SOLID и без) и проверял на программах, которые использую для распаковки внешнюю DLL и такую проблему заметил только в CreateInstall на SOLID архивах.
>При использовании нового 'ini.g' значения в командах INI вообще перестали устанавливаться и с UTF и без UTF, значения не получаются их файла при любом режиме и не устанавливаются значением по умолчанию.
Скачайте и установите версию 7.2.5 и туда скопируйте ini.g. В эту команду добавилось поле Условие, из-за этого конфликт.
http://www.createinstall.com/downloads/ci-setup.7.2.5.exe
>Когда я тестировал эту проблему с 7z, я создавал два архива для двух режимов (SOLID и без) и проверял на программах, которые использую для распаковки внешнюю DLL и такую проблему заметил только в CreateInstall на SOLID архивах.
Посмотрим, что там можно сделать.
Я что-то вообще не вижу у 7-zip при создании архива опцию для SOLID сжатия.
Можете дать ссылку на какой-нибудь готовый solid 7z архив?
В 7z при создании формата 7z называется 'Размер блока - Непрерывный' в английской версии 'Solid Block size – Solid', параметр командной строки 's=on'. При просмотре в 7z информации об архиве есть строка 'Непрерывный: +'(Solid: +) '+' говорит о том что это Solid архив.
Чтобы увидеть явную разницу по потребляемой памяти нужен архив в 500-1000Гб, и при распаковке в 7z и через установщик CreateInstall видно сколько потребляют процессы.
Ситуация на данный момент следующая. Мы используем не готовую dll, а компилируем свою на основе исходников на С из SDK. Я сейчас скачал последнюю версию SDK и просто скомпилировал пример 7zDec.exe. Проблема у этого экзешника при распаковке точно такая же. Постараюсь как-то связаться с разработчиком.
Разработчик сообщил, что реализация на С сделана проще чем на С++, которая используется в dll. В случае solid архивов именно отводится памяти столько сколько требуется для хранения всех данных и работы распаковщика. В планах у него есть переделать алгоритм на C, но говорит, что это требует много времени и сроки назвать не может.
С другой стороны, примерно аналогичная ситуация для нас с переходом на использование 7zxa.dll, требуется время. Будем по возможности смотреть как проще осуществить переход.
Спасибо, теперь понятно.
Опять ошибка,привожу поведение 6-й и 7-й версии.
ОС: Windows 8.1 64bit (другие пока не проверял).
Инсталлятор: 6-я версия
Ситуация: Запуск установки (требующей права Админа) Пользователем без прав Админа и выбор другого пользователя с правами Админа для запуска
Команда: 'Реестр - Установить значение' в ключ 'HKEY_CURRENT_USER\Software\TEST', содержит несколько ключей для добавления
Итог: Только первый ключ из списка добавляется правильно в раздел запустившего пользователя, все остальные добавляются в раздел запустившего пользователя, но с приставкой (S-1-5-21-3744348833-552633375-2494321684-1002 = идентификатор пользователя):
HKEY_CURRENT_USER\S-1-5-21-3744348833-552633375-2494321684-1002\ Software\TEST
Инсталлятор: 7-я версия
Ситуация и Команда: аналогичны
Итог: Все ключи добавляются правильно, но в раздел пользователя от имени, которого получены права Админа
И ещё после исправления работы команды нужно наконец-то добавить в инсталлятор возможность удаления пустых ключей реестра, поскольку при удалении пустых ключей из исходного кода в такой ситуации ключ не будет удалён.
С пользователями будем проверять.
А что не так с удалением пустых ключей, не совсем ясно. В какой ситуации пустой ключ не удаляется, при другом пользователе? Но там тогда и обычный ключ удаляться не будет.
Для 7-й версии
Скачайте новый registry.g по этой ссылке
https://drive.google.com/file/d/0B3rNeTlGRFFOQUlFR1BXV1A5TU0/view?usp=sharing
и скопируйте его в cmds\sources поверх текущего
По удалению из исходного кода - нужно модифицировать вот так
if regkeys( root, key, keys ) && !*keys
{
arrustr values
uint iroot = root
ustr ikey = key
regoriginal( &iroot, ikey )
if regvalues( iroot, ikey, values ) && !*values
{
uint ret = regdelkeys( root, key, 0)
}
}
Спасибо. Теперь все работает, заодно и для 6-й себе добавил эти изменения.
Только пример с удалением пустых ключей немного подправить нужно, но это мелочи.
Ещё одну ошибку заметил 7-й и 6-й.
В команде 'Удалить файлы и директории' при удалении файлов с использованием маски, файлы не удаляются:
test\name.exe*
то есть если до маски есть точка, то файлы не будут удалены, если точки нет, то будут удалены.
В команде 'Поиск файлов и директории' тоже самое.
Да, сейчас всё что после последней точки считается расширением и маска применяется исходя из этого - отдельно для расширения, а отдельно для имени. Так изначально было реализовано в библиотеке языка. При данном подходе, будут находится name.exexxx, но не будут name.exe.xxx. У вас не находятся файлы с несколькими точками при указанной маске?
Если есть первая точка, то все следующие точки просто игнорируются и не находятся. Поиск работает только если точка одна. Просто иногда нужно найти файлы журналов или дампы ошибок которые имеют полное имя файла и на конце что-то типа name.exe.log, name.exe.dmp. Обидно конечно, что так не получится.
Если расширения известны, то указывайте их. У меня, например, работают следующие варианты: *.gz, *.sql.gz, d*.sql.gz, u*.gz. Так вот тоже работает: d*.sql.*.
Попробуйте указывать так: name.exe*.*
16.01.25 Выпущен инсталлятор CreateInstall 8.11.1.
19.06.24 Выпущен инсталлятор CreateInstall 8.11.0. подробнее
13.11.22 Выпущен инсталлятор CreateInstall 8.10.1.
21.05.22 Выпущен инсталлятор CreateInstall 8.10.0.
25.09.21 Выпущен инсталлятор CreateInstall 8.9.0.
15.07.21 Выпущен инсталлятор CreateInstall 8.8.1.