Ru-Board.club
← Вернуться в раздел «Программы»

» Inno Setup (создание инсталяционных пакетов)

Автор: Kindly
Дата сообщения: 22.12.2006 12:06
Genri

Цитата:
Я три дня убил на попытку распаковать закриптованный инсталлятор. Не получилось.


innounp setup.exe -x -m -f(pass.txt) Pass узнаем выдирая плагином compiledcode.bin.
Хотя твой инсталл не качал пока. Нет меня дома.

Цитата:
Это противоречит не только всем законам криптографии, но и просто здравому смыслу (какой смысл прятать информацию в сейф, а ключ от него, положить даже не под коврик, а просто повесить рядом с замком).
В принципе ты прав, но раньше нельзя было распаковать при использовании нестандартных символов. Еще есть вариант - юзать в секции [Setup] SetupLdr=no, тогда плагин "отлетает". В инсталле то что криптуется - это файло в {app}, {win} и т.д. временные файлы и картинки, в том числе м compiledcode.bin не криптуются, поскольку юзаются сразу. Но автору распаковщика не составит проблем реализовать выдирание некриптованных файлов отдельно в следующей версии - у меня есть мысль как раз ему об этом написать.


Автор: Genri
Дата сообщения: 22.12.2006 12:29
Kindly

Цитата:
Pass узнаем выдирая плагином compiledcode.bin.
-- Ну не вижу я пароля в compiledcode.bin! Строковые переменные вижу, хеш командной строки вижу, а пароля нет! Наверно к старости зрение подводит.
Все-таки хотелось бы знать, насколько безопасно использовать криптование. Поэтому пока выкладывать пароль и параметр командной строки не буду. Подожду результатов твоего эксперимента. Попробуешь - сообщи.
Автор: omals
Дата сообщения: 22.12.2006 12:36
2 ProFiler

Цитата:
Может кто знает, можно ли в Inno определить что инсталлятор запущен на Amd64? Надо мне для этой платформы драйвер другой устанавливать. В документации сходу ничего не нашел

не заметил ответил ли хто на этот вопрос
посему попробую ответить
есть такая функция
function IsWin64: Boolean;
и еще
function GetWindowsVersion: Cardinal;
именно с этой парой я и определяю какие драйвера ставить.



Добавлено:
2 maxdddca123

Цитата:
Как сделать, что бы программа отображалась в установке\удалении программ ?


см. в хелпе
[Setup]: CreateUninstallRegKey
но поумолачанию там yes
то должна быть автоматом

или я неверно понял вопрос...
Автор: maxdddca123
Дата сообщения: 22.12.2006 14:03
omals
Да всё разобрался. Спасибо Вам.

To all please help !
если путь установки программы не определён (пусто), то при выборе каталога к пути добавляется \Новая папка .Как это убрать ?
Автор: omals
Дата сообщения: 22.12.2006 15:28
maxdddca123


Цитата:
To all please help !
если путь установки программы не определён (пусто), то при выборе каталога к пути добавляется \Новая папка .Как это убрать ?


может просто
DefaultDirName={pf}
Автор: maxdddca123
Дата сообщения: 22.12.2006 18:23
И ещё трудный вопрос: как мне распаковать файлы в несколько директорий одновременно ? Список дирректорий хранится в реестре, надо чот бы пользователь не выбирал 1 дирректорию как обычно, а что бы этот список считывался, вставал в компоненты и пользователь отмечал галками, в какие ему надо установить, а в какие нет. Очень жду помощи !


Добавлено:
Как мне увидеть результат выполнения этой функции ? (Конкретно это окошко: MsgBox('Список имен разделов:'#13#10#13#10 + S, mbInformation, MB_OK); )

function RegGetValueNames(const RootKey: Integer; const SubKeyName: String; var Names: TArrayOfString): Boolean;var

I: Integer;
S: String;
begin
if RegGetValueNames(HKEY_CURRENT_USER, 'Control Panel', Names) then

begin
S := '';
for I := 0 to GetArrayLength(Names)-1 do
S := S + Names[I] + #13#10;
MsgBox('Список имен разделов:'#13#10#13#10 + S, mbInformation, MB_OK);
end else
begin
MsgBox('ошибка', mbInformation, MB_OK);

end;
end;

Прописал в Code но ничего не происходит. Хелп плиз !
Автор: omals
Дата сообщения: 23.12.2006 10:37
maxdddca123
если задать
DefaultDirName="{pf}"
то будет
С:\Program Files


Добавлено:
maxdddca123


Цитата:
function RegGetValueNames(const RootKey: Integer; const SubKeyName: String; var Names: TArrayOfString): Boolean;var

I: Integer;
S: String;
begin
if RegGetValueNames


не понял тут, что переопределение стандартной функции RegGetValueNames?

да еще и с вызовом ее же из себя - рекурсия?

может просто нужно имя свое задать
function MYRegGetValueNames( а дальше все как есть?
Автор: maxdddca123
Дата сообщения: 23.12.2006 11:40
omals

Цитата:
если задать
DefaultDirName="{pf}"
то будет
С:\Program Files

нет, дело было в ключе AppendDefaultDirName=true


Цитата:
не понял тут, что переопределение стандартной функции RegGetValueNames?

Разобрался....

Добавлено:
Вот такая ф-ция считывает имена параметров в указанный строковый массив Names.

procedure InitializeWizard();

var Names: TArrayOfString;


I: Integer;
S: String;
begin
if RegGetValueNames(HKEY_CURRENT_USER, 'Software\1C\1Cv7\7.7\Titles', Names) then

begin
S := '';
for I := 0 to GetArrayLength(Names)-1 do
S := S + Names[I] + #13#10;
MsgBox('Список имен разделов:'#13#10#13#10 + S, mbInformation, MB_OK);
end else
begin
MsgBox('ошибка', mbInformation, MB_OK);

end;
end;

А как сделать, что бы считывались ещё и значения этих параметров ? Стандартной ф-ции к сожалению нет.
Автор: omals
Дата сообщения: 23.12.2006 12:49
2 maxdddca123
for I := 0 to GetArrayLength(Names)-1 do
S := S + Names[I] + #13#10;
MsgBox('Список имен разделов:'#13#10#13#10 + S, mbInformation, MB_OK);
RegQueryStringValue(HKCU, 'Software\1C\1Cv7\7.7\Titles', Names[I], Value);
MsgBox(Value, MB_OK);
end

но если там не String значения то используеш вместо
RegQueryStringValue
другие
function RegQueryStringValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultStr: String): Boolean;
function RegQueryMultiStringValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultStr: String): Boolean;
function RegQueryDWordValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultDWord: Cardinal): Boolean;
function RegQueryBinaryValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultStr: String): Boolean;

все функции описаны в хелпе в разделе
Pascal Scripting: Support Functions Reference
Автор: maxdddca123
Дата сообщения: 23.12.2006 14:00
omals
Дак эти эти ф-ции возвращают вроде 1 параметр, а мне тоже нужно массив.
Автор: omals
Дата сообщения: 23.12.2006 14:09
в
var Value: TArrayOfString;

а потом в for
RegQueryStringValue(HKCU, 'Software\1C\1Cv7\7.7\Titles', Names[I], Value[I]);
Автор: maxdddca123
Дата сообщения: 23.12.2006 14:14

Цитата:
MsgBox(Value, MB_OK);

Это что ??

Добавлено:
Написал вот так

procedure InitializeWizard();
var Value, Names: TArrayOfString;


I: Integer;
S: String;
begin
if RegQueryStringValue(HKEY_CURRENT_USER, 'Software\1C\1Cv7\7.7\Titles', Names[I], Value[I]) then

begin
S := '';
for I := 0 to GetArrayLength(Names)-1 do
S := S + Value[I] + #13#10;
MsgBox('Список имен разделов:'#13#10#13#10 + S, mbInformation, MB_OK);

end;
end;

Пишет out of range
Автор: omals
Дата сообщения: 23.12.2006 14:24
procedure InitializeWizard();

var Names: TArrayOfString;
Value: TArrayOfString;

I: Integer;
S, S1: String;
begin
if RegGetValueNames(HKEY_CURRENT_USER, 'Software\1C\1Cv7\7.7\Titles', Names) then

begin
S := '';
for I := 0 to GetArrayLength(Names)-1 do
S1:='';
S := S + Names[I] + #13#10;
MsgBox('Список имен разделов:'#13#10#13#10 + S, mbInformation, MB_OK);
RegQueryStringValue(HKCU, 'Software\1C\1Cv7\7.7\Titles', Names[I], Value[I]);
S1:='Для имени ' + Names[I] + 'значение: '+ Value[I];
MsgBox(S1, mbInformation, MB_OK);
end else
begin
MsgBox('ошибка', mbInformation, MB_OK);

end;
end;
Автор: maxdddca123
Дата сообщения: 23.12.2006 14:26
omals
всёравно пишет при запуске инсталлятора out of range.
Вот содержание ветки:

[HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles]
"C:\\Program Files\\1Cv77\\TaxDB2\\"="Конфигурация 1С:Налогоплательщик 2.0"
"C:\\Program Files\\1Cv77\\DbBase\\"="База рабочая"
"D:\\Program Files\\1Cv77\\AprBase\\"="Информационная база"
Автор: omals
Дата сообщения: 23.12.2006 14:34
S := '"'+S + Names[I] +'"';
а
S1:='"'+'Для имени ' + Names[I] + 'значение: '+ Value[I]+'"';

Автор: maxdddca123
Дата сообщения: 23.12.2006 14:47
omals

Цитата:
S := '"'+S + Names[I] +'"';
а
S1:='"'+'Для имени ' + Names[I] + 'значение: '+ Value[I]+'"';

Всё равно out of range

Добавлено:
Мне вообще нужна что бы выводилось
MsgBox('Список имен разделов:'#13#10#13#10 + S + S1, mbInformation, MB_OK);
где s1 примерно S := S + Value[I];

Добавлено:
Т.е. при запуске что бы окошко выглядело так

C:\Program Files\1Cv77\TaxDB2\ - Конфигурация 1С:Налогоплательщик 2.0"
C:\Program Files\1Cv77\DbBase\ - База рабочая"
D:\Program Files\1Cv77\AprBase\ - Информационная база"

Добавлено:
Вот чего удалось добиться:

procedure InitializeWizard();

var Names: TArrayOfString;
Value: String;

I: Integer;
S,S1: String;
begin
if RegGetValueNames(HKEY_CURRENT_USER, 'Software\1C\1Cv7\7.7\Titles', Names) then

begin
S := ''; S1:= ''
for I := 0 to GetArrayLength(Names)-1 do

S := S + Names[I] + #13#10;

for I := 0 to GetArrayLength(Names)-1 do
RegQueryStringValue(HKEY_CURRENT_USER, 'Software\1C\1Cv7\7.7\Titles', Names[I], Value)
S1 := S1 + Value + #13#10;
MsgBox('Список имен разделов:'#13#10 + S + S1, mbInformation, MB_OK);
end;
end;

Уже лучше, но там почему то выводится тока название последней базы, а мне надо всех трёх. Народ памагайте же !!! Ну
Автор: omals
Дата сообщения: 23.12.2006 18:29
шото я нифига не понял шо нужно
может так

procedure InitializeWizard();

var    Names: TArrayOfString;
    Value: TArrayOfString;

I: Integer;
S: String;
begin
if RegGetValueNames(HKEY_CURRENT_USER, 'Software\1C\1Cv7\7.7\Titles', Names) then

begin
for I := 0 to GetArrayLength(Names)-1 do
    RegQueryStringValue(HKCU, 'Software\1C\1Cv7\7.7\Titles', Names[I], Value[I]);
    S:='"' + Names[I]+ ' - ' + Value[I] + '"';
    MsgBox(S, mbInformation, MB_OK);
end else
begin
MsgBox('ошибка', mbInformation, MB_OK);
end;
end;


в масивах Names и Value у тебя есть имена и соответсвенные им значения
потом делай с ними шо надо ....
для Names[1] будет значение записи Value[I] .....
Автор: maxdddca123
Дата сообщения: 23.12.2006 19:23
omals
Ты прально понял, но ты сам проверял этот скрипт ? Он же не работает !!!

Добавлено:
Конкретно выдаёт ошибку на этой строчке:
RegQueryStringValue(HKCU, 'Software\1C\1Cv7\7.7\Titles', Names[I], Value[I]);
Ошибка Runtime Error at (1:259)
Out of range.
Я так понимаю изза того, что сама ф-ция RegQueryStringValue не может работать с массивами !

Добавлено:

Цитата:
для Names[1] будет значение записи Value[I] .....

Value[i] или Value[1] ???
Автор: Genri
Дата сообщения: 23.12.2006 20:29
maxdddca123

Цитата:
Я так понимаю изза того, что сама ф-ция RegQueryStringValue не может работать с массивами !
-- неправильно понимаешь. Ошибка потому, что не задан размер массива Value

Код:
procedure InitializeWizard();

var
Names: TArrayOfString;
Value: TArrayOfString;
I: Integer;
S: String;
begin
if RegGetValueNames(HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Themes', Names) then
begin
SetArrayLength(Value,GetArrayLength(Names));
for I := 0 to GetArrayLength(Names)-1 do
begin
RegQueryStringValue(HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Themes', Names[I], Value[I]);
S:=S + '"' + Names[I]+ ' - ' + Value[I] + '"' + #10#13;
end;
MsgBox(S, mbInformation, MB_OK);
end else
begin
MsgBox('ошибка', mbInformation, MB_OK);
end;
end;
Автор: maxdddca123
Дата сообщения: 23.12.2006 20:46
Genri
Где ты был раньше ??? Спасибо огромное Правда это только начало.
Теперь этот список надо что бы отображался в этой форме:

NewCheckListBox1 := TNewCheckListBox.Create(Page);
with NewCheckListBox1 do
begin
Parent := Page.Surface;
Left := ScaleX(0);
Top := ScaleY(40);
Width := ScaleX(413);
Height := ScaleY(181);
TabOrder := 0;
end;

Смысл в том, что пользователь выбирает галочками те пункты списка, в которые ему надо установить обновление. Подскажи как это реализовать ?
Автор: Chanka
Дата сообщения: 23.12.2006 21:02
Genri,

Есть какие-нибудь продвижения с тем, что я у тебя спрашивал по лич. сообщению?
Автор: Genri
Дата сообщения: 23.12.2006 22:07
maxdddca123
Примерно так:
NewCheckListBox1.AddCheckBox(Names[I], Value[I], 0, True, True, False, False, nil);

Chanka -- пока нет времени.
Автор: maxdddca123
Дата сообщения: 23.12.2006 22:29
Genri
Ааа, получилось ))))))))))

Автор: Genri
Дата сообщения: 23.12.2006 22:46
maxdddca123

Цитата:
NewCheckListBox1 := TNewCheckListBox.Create(Page);
with NewCheckListBox1 do
begin
Parent := Page.Surface;
Left := ScaleX(0);
Top := ScaleY(40);
Width := ScaleX(413);
Height := ScaleY(181);
TabOrder := 0;
end;
-- я не совсем понял, причем тут это. Думаю тебе надо следующее:

Код:
[Code]
var
Names: TArrayOfString;
Value: TArrayOfString;
Page: TInputOptionWizardPage;

procedure InitializeWizard();
var
I: Integer;
S: String;
begin
Page := CreateInputOptionPage(wpWelcome,
'Выберите компоненты', 'Какие компоненты хотите установить?',
'Выберите необходимые компоненты и нажмите далее.',
False, True);

if RegGetValueNames(HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Themes', Names) then
begin
SetArrayLength(Value,GetArrayLength(Names));
for I := 0 to GetArrayLength(Names)-1 do
begin
RegQueryStringValue(HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Themes', Names[I], Value[I]);
Page.CheckListBox.AddCheckBox(Names[I], Value[I], 0, True, True, False, False, nil);
end;
end else
begin
MsgBox('ошибка', mbInformation, MB_OK);
end;
end;
Автор: maxdddca123
Дата сообщения: 23.12.2006 22:49
Супер ! Хотя я сделал вот так:

NewCheckListBox1 := TNewCheckListBox.Create(Page);

with NewCheckListBox1 do
begin
Parent := Page.Surface;
if RegGetValueNames(HKEY_CURRENT_USER, 'Software\1C\1Cv7\7.7\Titles', Names) then
begin
SetArrayLength(Value,GetArrayLength(Names));
for I := 0 to GetArrayLength(Names)-1 do
begin
RegQueryStringValue(HKEY_CURRENT_USER, 'Software\1C\1Cv7\7.7\Titles', Names[I], Value[I]);
S:=S + Value[I]+ ' - ' + Names[I] + #10#13;

NewCheckListBox1.AddCheckBox(Names[I], Value[I], 0, True, True, False, False, nil);
Left := ScaleX(0);
Top := ScaleY(40);
Width := ScaleX(413);
Height := ScaleY(190);
TabOrder := 0;
end;
end;
end;

Ну и теперь самое сложное: нужно, что бы файлы, которые я засунул в проект, распаковывались в те папки (поочереди наверно), которые отмечены галочками. Жду помощи и примного благодарен !
Автор: QuickeneR
Дата сообщения: 23.12.2006 22:51
Kindly

Цитата:
For example we have some update of the program. Update compiled with:
UseSetupLdr=no
and encrypted (password auto-paste in password page during installation and
password page clicked automatically).
Update no have uninstall, consequently we can not see the really password in
log-file unins000.dat but need extract the files used the unpacker.
I want to suggest new option for innounpacker - extract embedded files only
(they is not encrypted).
And else, multiarc setting for Total Commander not support unpacking in this
case (UseSetupLdr=no). Unpacking work only for UseSetupLdr=yes.

Your realized the new option?

Не особо понял твой вопрос. Если Total Commander не распаковывает файлы без SetupLdr, это проблемы его мультиарка и настроек. Вот тут прислали какое-то обновление настроек, погляди, может оно работает правильно. В фаре все ок. Сам распаковщик не требует пароля, если нужно распаковать только незашифрованные файлы.
Автор: maxdddca123
Дата сообщения: 23.12.2006 22:52
И где бы посмотреть описание NewCheckListBox1.AddCheckBox (параменты в скобках)?
Автор: QuickeneR
Дата сообщения: 23.12.2006 22:53
ЗЫ. Настройки для FAR деляю и проверяю сам, настройки для TC шлют юзеры, поэтому их работоспособность и актуальность не гарантируются.
Автор: Genri
Дата сообщения: 23.12.2006 23:14
maxdddca123

Цитата:
begin
SetArrayLength(Value,GetArrayLength(Names));
for I := 0 to GetArrayLength(Names)-1 do
begin
RegQueryStringValue(HKEY_CURRENT_USER, 'Software\1C\1Cv7\7.7\Titles', Names[I], Value[I]);
S:=S + Value[I]+ ' - ' + Names[I] + #10#13;

NewCheckListBox1.AddCheckBox(Names[I], Value[I], 0, True, True, False, False, nil);
Left := ScaleX(0);
Top := ScaleY(40);
Width := ScaleX(413);
Height := ScaleY(190);
TabOrder := 0;
end;

-- т.е. если у тебя пять параметров в Names, то ты пять раз выставляешь Left := ScaleX(0); и нижеследующие ? Дело твое.


Цитата:
где бы посмотреть описание .... AddCheckBox
-- как всегда. в хелпе. раздел Support Classes Reference. если коротко, то:

function AddCheckBox(const ACaption, ASubItem: String; ALevel: Byte; AChecked, AEnabled, AHasInternalChildren, ACheckWhenParentChecked: Boolean; AObject: TObject): Integer;

function AddGroup(ACaption, ASubItem: String; ALevel: Byte; AObject: TObject): Integer;

function AddRadioButton(const ACaption, ASubItem: String; ALevel: Byte; AChecked, AEnabled: Boolean; AObject: TObject): Integer;


Автор: maxdddca123
Дата сообщения: 23.12.2006 23:19
Genri

Цитата:
-- т.е. если у тебя пять параметров в Names, то ты пять раз выставляешь Left := ScaleX(0); и нижеследующие ? Дело твое.

А если end поставить после NewCheckListBox1.AddCheckBox то норма будет ?

И пожалуйста помоги с последним вопросом самым главным:
нужно, что бы файлы, которые я засунул в проект, распаковывались в те папки (поочереди наверно), которые отмечены галочками. Как это сделать ?
Причём я поставил CreateAppDir=false

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

Предыдущая тема: ICONS


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.