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

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

Автор: Vitalliano
Дата сообщения: 15.01.2008 11:38
Kindly, вопрс к Вам.

Я в Вашем руководстве увидел скрипт который не позволяет пользователю установить программу в уже существующею app директорию.
А как сделать так, чтобы прога к примеру не могла установится в внешнюю директорию, к примеру proga а в любую другую могла?

Вот сам скрипт:

[more]function NextButtonClick(CurPage: Integer): Boolean;
var
s, s2:string;
begin
Result:=True;
If CurPage=wpSelectDir
then
begin
s2:=ExpandConstant('{app}')+'';
If DirExists(s2)
then
begin
s:='Установка в существующую папку в целях безопасности невозможна!';
MsgBox(s, mbError, mb_Ok);
Result:=False;
end;
end;
end;[/more]

Заранее благодарю!!!
Автор: Genri
Дата сообщения: 15.01.2008 13:36
Sergey_AV
Цитата:
Надо просто реализовать некий скрит, типа Подробнее...
для автоматической регистрации программы в процессе установки
-- не совсем понятно, что именно подразумевается под "автоматической регистрацией", но вероятно, надо смотреть в сторону:
UserInfoPage, DefaultUserInfoName, DefaultUserInfoOrg, DefaultUserInfoSerial и function CheckSerial(Serial: String): Boolean;

Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
UserInfoPage=yes
DefaultUserInfoSerial=123456

[Code]
function CheckSerial(Serial: String): Boolean;
begin
if Serial = '123456' then Result:= True;
end;
Автор: Sergey_AV
Дата сообщения: 15.01.2008 14:26
Genri

Цитата:
-- не совсем понятно, что именно подразумевается под "автоматической регистрацией"

Имеется ввиду ввод имени пользователя и серийного номера после установки приложения, т.е. типа:
[Run]
Filename: {app}\program.exe; Parameters: -x; Flags: waituntilterminated shellexec
должен запускаться код на выполнение этого самого ввода имени и пароля (серийника).

Цитата:
но вероятно, надо смотреть в сторону:
UserInfoPage, DefaultUserInfoName, DefaultUserInfoOrg, DefaultUserInfoSerial и function CheckSerial(Serial: String): Boolean;

Я это смотрел, если не ошибаюсь, это из руководства в шапке. Но... это немного не мой уровень .
Просто у меня в приложении имя пользователя связанно с серийником, т.е. при изменении имени меняется и серийный номер. И мне не очень понятно, как это дело ввести через скрипт. Сама идея ясна - именно так и хотелось бы реализовать это, но...
знаний моих не хватает . Просто при запуске программы через [Run] вылазит окошко, где надо ввести и имя пользователя, и серийник. Вот я и "пытался изобразить" в том скрипте эту картину.
Если не сложно - помоги, плииз реализовать столь непосильную для меня задачу...

Автор: Victor_Dobrov
Дата сообщения: 16.01.2008 01:59
Sergey_AV, серийный номер с именем пользователя можно связать так:

[Setup]
AppName=Serial
AppVerName=Serial
CreateAppDir=false
UserInfoPage=true
DefaultUserInfoName={username}

[Code]
var MD5, SerName: String; n: Integer;

Function CheckSerial(Serial: String): Boolean;
Begin
if
Serial = SerName then Result:= True;
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
if
(CurPageID = wpUserInfo) and (SerName = '') then begin
MD5:= Uppercase(GetMD5OfString(ExpandConstant('{username}')))
for n:= 1 to Length(MD5) do begin
SerName:= SerName + MD5[n]
n:= n + 1     // убираем каждый второй символ - это только пример)
end
if
WizardForm.UserInfoSerialEdit.Text = '' then WizardForm.UserInfoSerialEdit.Text:= SerName // удалить после отладки
end
End;
Автор: RedGeek
Дата сообщения: 16.01.2008 02:14
Мне кажется, не очень разумно оставлять код проверки серийника в инсталляторе.
Автор: GRom V
Дата сообщения: 16.01.2008 04:52
Подскажите кто знает.......
Пишу в [Registry]
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\GameUX\Games\{{10656425-AFEB-42F3-9E51-D4A92B7EE022}; ValueType: string; ValueName: ConfigApplicationPath; ValueData: {app}\

Но после инсталляции в реестре получается
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\GameUX\Games\{10656425-AFEB-42F3-9E51-D4A92B7EE022}\]
"ConfigApplicationPath"="C:\\Program Files\\Electronic Arts\\Crytek\\Crysis\\"
"ConfigGDFBinaryPath"="C:\\Program Files\\Electronic Arts\\Crytek\\Crysis\\Tools\\VistaEssentials.dll"
"Title"="Crysis"

Тоесть инсталлятор после {10656425-AFEB-42F3-9E51-D4A92B7EE022} ставит еще и \
Как это избежать?????

Добавлено:
Все...разобрался - не критично
Автор: Genri
Дата сообщения: 16.01.2008 09:27
Sergey_AV -- если я правильно понял, в составе приложения есть файл program.exe, запуск которого приводит к появлению окна с двумя полями (для ввода имени пользователя и серийного номера). Ты хочешь автоматизировать процесс заполнения этих полей.
Если все так, то задача выходит за рамки инно. Теоретически, такую фишку прикрутить к инно можно. Но имхо игра не стоит свеч. Да и в чем смысл автоввода серийного номера ? Или это из разряда "варез" ?
Автор: Sergey_AV
Дата сообщения: 16.01.2008 10:00
Genri

Цитата:
если я правильно понял, в составе приложения есть файл program.exe, запуск которого приводит к появлению окна с двумя полями (для ввода имени пользователя и серийного номера).

Абсолютно верно.

Цитата:
Ты хочешь автоматизировать процесс заполнения этих полей.

Угу.

Цитата:
Если все так, то задача выходит за рамки инно.

Жаль.

Цитата:
Теоретически, такую фишку прикрутить к инно можно.

А как?

Цитата:
Но имхо игра не стоит свеч.

Почему?

Цитата:
Да и в чем смысл автоввода серийного номера ?

Смысл - в автоматической установке приложения (ключ /VERYSILENT) на этапе установке Виндоус уже зарегистрированным. Чтобы потом избежать мучительной головной боли со всякими "тыканьями" мышкой и настройки кучи программ. Задача: в результате Unattended-установки получить полностью настроенную СИСТЕМУ. Ну, или почти . Я же все равно инсталлятор этого приложения полностью пересобирал в Inno Setup - в оригинале было слишком много лишнего, да не ставился он в Silent-mode, вот и появилась идея его сразу зарегистрировать.

Цитата:
Или это из разряда "варез" ?

Именно. Но здесь мы будем рассматривать это, как наличие у пользователя некоей лицензии .

Victor_Dobrov
Большое спасибо за пример скрипта - я обязательно попробую на чем-нибудь своем, НО... в данном случае он представляет (для меня) чисто академический интерес . Задача стоит несколько иная - я ее подробно изложил в своем ответе к Genri.










Автор: koc
Дата сообщения: 16.01.2008 11:05
комрады, как открыть *.xml, найти там определенную строку и заменить ее на другую, сохранив табуляцию и пр.?
Автор: Victor_Dobrov
Дата сообщения: 16.01.2008 12:21
RedGeek

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

Это касается любого кода в Inno Setup, который остаётся без защиты, так как исходники программы открыты.
А вместо проверки серийного номера рекомендую защищать инсталлятор шифрованием по паролю.

Sergey_AV, обычно серийник пишется в реестр, и вместо регистрации программы достаточно импортировать REG-файл.
Автор: Sergey_AV
Дата сообщения: 16.01.2008 12:42
Victor_Dobrov

Цитата:
Sergey_AV, обычно серийник пишется в реестр, и вместо регистрации программы достаточно импортировать REG-файл.

В данном случае это немного не так . Во-первых, серийник пишется в рег-файл, который не имеет ничего общего с реестром (формат). Во-вторых, и это более важно - генерация этого рег-файла идет с привязкой к Hardware ID, на другой машине он будет другой. Из за чего я и весь это "сыр-бор" затеял. Единственная возможность - это получить этот рег-файл честным путем, т.е. штатными средствами программы. Я писал на WSH простенький скрипт (на большее моих знаний не хватает), который поочередно "нажимает" нужные клавиши и вводит нужные мне значения в окошки регистрании программы. И, если не ошибаюсь, я приводил подобие этого скрипта на предыдущей странице. Но у подобной конструкции масса недостатков, а самы главный из них - зависимость временных интервалов от железа той машины, на которой это устанавливается. В общем, подбирать задержки - занятие неблагодарное. Кроме того, при установки с DVD-ROM ситуация с задержками меняется координально - я даже зачастую не могу попасть в диапазон. Поэтому, если уж нет другой возможности, хотелось бы этот скрипт (код) вставить в сам инсталлятор: тогда, по-крайней мере, я буду знать, что пока идет установка программы она (инсталляция) выполнит все предписанные для нее задачи.
Надеюсь, я не слишком сумбурно объяснил? Наверно, такие вещи, граничащие с оффтопиком лучше объяснять через РМ .
Автор: Genri
Дата сообщения: 16.01.2008 22:04
Sergey_AV

Цитата:
Цитата:Теоретически, такую фишку прикрутить к инно можно.

А как?

Цитата:Но имхо игра не стоит свеч.

Почему?

-- можно попробовать реализовать через FindWindowEx и WM_SETTEXT. Но имхо, результат не будет сильно отличаться от использования WSH-скрипта. А с учетом того, что вряд ли можно будет придумать этой фишке еще какое-либо применение, игра не стоит свеч - monkey business

koc

Цитата:
как открыть *.xml, найти там определенную строку и заменить ее на другую

-- краткий пример работы с XML можешь посмотреть здесь
Автор: Chanka
Дата сообщения: 16.01.2008 22:12
Помогите, пожалуйста. Этот код растягивает WizardSmallImage. Как сделать, чтобы на нём был текст. Чтобы он сливался с картинкой и не было белых полосок.
WizardSmallImageFile=картинка.bmp


Код: procedure InitializeWizard();
begin
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;

with WizardForm do
begin

with MainPanel do
begin
with WizardSmallBitmapImage do
begin
Left:= ScaleX(0);
Top:= ScaleY(0);
Height:=Mainpanel.Height;
Width:=MainPanel.Width;
end
end
end
end;
Автор: iTASmania_Inc
Дата сообщения: 16.01.2008 22:41
Chanka

Цитата:
WizardSmallImageFile=картинка.bmp

, а если серьёзно, то я бы сделал [more=так]
[Setup]
AppName=My Program
AppVerName=My Program [Version]
DefaultDirName={pf}\My Program

[Code]
var
PageNameLabel, PageDescriptionLabel: TLabel;

procedure InitializeWizard();
begin
WizardForm.PageNameLabel.Hide
WizardForm.PageDescriptionLabel.Hide;

PageNameLabel := TLabel.Create(WizardForm)
PageNameLabel.Left := WizardForm.PageNameLabel.Left
PageNameLabel.Top := WizardForm.PageNameLabel.Top
PageNameLabel.Transparent := True
PageNameLabel.Font.Style := [fsBold]
PageNameLabel.Font.Color := clRed
PageNameLabel.Parent := WizardForm.MainPanel

PageDescriptionLabel := TLabel.Create(WizardForm)
PageDescriptionLabel.Left := WizardForm.PageDescriptionLabel.Left
PageDescriptionLabel.Top := WizardForm.PageDescriptionLabel.Top
PageDescriptionLabel.Transparent := True
PageDescriptionLabel.Font.Color := clRed
PageDescriptionLabel.Parent := WizardForm.MainPanel

with WizardForm do
with MainPanel do
begin
with WizardSmallBitmapImage do
begin
Left := ScaleX(0)
Top := ScaleY(0)
Height := MainPanel.Height
Width := MainPanel.Width
end
end
end;

procedure CurPageChanged(CurPageID: Integer);
begin
PageNameLabel.Caption := WizardForm.PageNameLabel.Caption
PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption
end;
[/more].
Автор: KurtWagner
Дата сообщения: 17.01.2008 03:26
Скчал "Inno Setup Corona Skin and System Test" и ничего не понял! Мош кто поможет???

Добавлено:
С помощью "Inno Setup Corona Skin and System Test" хотел сделать
фигню чтоб определал минимальные требования! + переключатель как в сталкере типа в д столько памяти а в с столько!
Автор: Victor_Dobrov
Дата сообщения: 17.01.2008 07:06
KurtWagner, для сборки Corona Skin необходим препроцессор, вот простой пример.

#define Requirements - мин. требования указываются здесь, подробности в комментариях Corona.iss.
Автор: Chanka
Дата сообщения: 17.01.2008 08:03
iTASmania_Inc
Большое спасибо.
Еще такой вопросик. А можно сделать, чтобы на каждой странице мастера был разный WizardSmallImage.
Автор: Sergey_AV
Дата сообщения: 17.01.2008 09:00
Genri

Цитата:
-- можно попробовать реализовать через FindWindowEx и WM_SETTEXT.

Ясно. Попробую поковырять.

Цитата:
Но имхо, результат не будет сильно отличаться от использования WSH-скрипта.

Но ведь есть же разница между ф-циями, вызываемыми из инсталлятора, и скриптом, вызываемым после установки ? Для меня это важно.
Автор: aka_smile
Дата сообщения: 17.01.2008 13:18
Неужели так трудно дать ответ на #21
Автор: Genri
Дата сообщения: 17.01.2008 14:31
Sergey_AV

Цитата:
есть же разница между ф-циями, вызываемыми из инсталлятора, и скриптом, вызываемым после установки ?

-- скрипт тоже можно вызывать в процессе установки. Но в целом, я согласен с тем, что использование функций предпочтительней.
Если поможет, ниже скрипт, который запускает калькулятор, дожидается его запуска, находит в его окне EditBox и вводит в него цифры 222

Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Code]
const
WM_SETTEXT = $C;

function FindWindowEx(hWndM, hWndC: LongWord; lpszClass, lpszWindow: PChar): LongWord;
external 'FindWindowExA@user32.dll stdcall';

procedure InitializeWizard();
var
ResultCode: Integer;
AppWnd, EditWnd: LongWord;
Text: String;
begin
if Exec(ExpandConstant('{sys}\calc.exe'), '', '', SW_SHOW,
ewWaitUntilIdle, ResultCode) then
begin
Text:= '222';
AppWnd:= FindWindowByWindowName('Calculator');
EditWnd := FindWindowEx(AppWnd, 0, 'EDIT', '');
if EditWnd <> 0 then
SendMessage(EditWnd, WM_SETTEXT, 0, CastStringToInteger(Text));
end;
end;
Автор: iTASmania_Inc
Дата сообщения: 17.01.2008 15:06
Chanka

Цитата:
А можно сделать, чтобы на каждой странице мастера был разный WizardSmallImage.

Ничего сложного. Подробнее.
Genri
Ваш скрипт работает у меня неполностью, а именно: не осуществляется ввод числа 222. Не подскажете, в чём причина? Кстати, не могли бы Вы показать пример нажатия кнопок калькулятора и копирования из EditWnd нужного значения?
Автор: Genri
Дата сообщения: 17.01.2008 15:39
iTASmania_Inc -- возможно у тебя не англ. система. Тогда подозреваю, имя окна будет не Calculator, а Калькулятор или как-то так.
Автор: iTASmania_Inc
Дата сообщения: 17.01.2008 16:34
Genri

Цитата:
имя окна будет не Calculator

Ага, так и есть, спасибо за подсказку. А как насчёт реализации нажатия кнопок?
Автор: Genri
Дата сообщения: 17.01.2008 17:06
iTASmania_Inc
Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Code]
const
BM_CLICK = $F5;
WM_GETTEXT = $D;
WM_GETTEXTLENGTH = $E;

function FindWindowEx(hWndM, hWndC: LongWord; lpszClass, lpszWindow: PChar): LongWord;
external 'FindWindowExA@user32.dll stdcall';

procedure InitializeWizard();
var
ResultCode: Integer;
AppWnd, EditWnd: LongWord;
length: LongInt;
Text: String;
begin
if Exec(ExpandConstant('{sys}\calc.exe'), '', '', SW_SHOW,
ewWaitUntilIdle, ResultCode) then
begin
AppWnd:= FindWindowByWindowName('Calculator');
if AppWnd <> 0 then
begin
SendMessage(FindWindowEx(AppWnd, 0, 'Button', '7'), BM_CLICK, 0, 0);
SendMessage(FindWindowEx(AppWnd, 0, 'Button', '/'), BM_CLICK, 0, 0);
SendMessage(FindWindowEx(AppWnd, 0, 'Button', '8'), BM_CLICK, 0, 0);
SendMessage(FindWindowEx(AppWnd, 0, 'Button', '='), BM_CLICK, 0, 0);

EditWnd:= FindWindowEx(AppWnd, 0, 'EDIT', '');
length:= SendMessage(EditWnd, WM_GETTEXTLENGTH, 0, 0);
Text:= StringOfChar(' ', length);
SendMessage(EditWnd, WM_GETTEXT, length, CastStringToInteger(Text));

MsgBox(Text, mbInformation, MB_OK);
end;
end;
end;
Автор: iTASmania_Inc
Дата сообщения: 17.01.2008 17:26
Genri
ОГРОМНОЕ СПАСИБО! Как всегда гениальны!
Автор: Sergey_AV
Дата сообщения: 17.01.2008 19:20
Genri

Огромное спасибо, буду в выходные разбираться . Однако, кому-то пригодилось, значит не столь уж "monkey business" .
Автор: Raf_SE
Дата сообщения: 18.01.2008 15:44
Ктонить может написать скрипт с этой инсталяхи? http://upload.com.ua/direct/900080931/AS_RUS.exe (2Мб). В частности интересует всплывающая картинка перед запуском инсталяхи и кнопка "О программе" в левом нижнем углу.
Автор: Sampron
Дата сообщения: 18.01.2008 16:27
Raf_SE
Кнопку "О программе" можно взять из примера Examples\CodeClasses.iss
а скрипт на заставку такой:

[Files]
Source: LOGO.bmp; DestDir: {tmp}; Flags: dontcopy
Source: manialogo.exe; DestDir: {tmp}; Flags: dontcopy

[Code]
function InitializeSetup(): Boolean;
var
Res: Integer;
begin
ExtractTemporaryFile('LOGO.bmp')
ExtractTemporaryFile('manialogo.exe')
Exec(ExpandConstant('{tmp}\manialogo.exe'),'','',SW_SHOW,ewWaitUntilTerminated,Res)
Result:=True
end;

Эти файлы распакуй с помощью innounp или вытащи с темпа при запущеном инсталле.
Автор: Raf_SE
Дата сообщения: 18.01.2008 18:38
Sampron
Мож написать скрипт кнопочки? Я просто не шарю в этих вещах, посему из CodeClasses.iss не смог его выделить.
Автор: iTASmania_Inc
Дата сообщения: 18.01.2008 18:55
Raf_SE
[more=Подробнее]
[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program

[Code]
var
AboutButton: TButton;

procedure AboutButtonOnClick(Sender: TObject);
begin
MsgBox('This demo shows some features of the WizardForm object and the various VCL classes.', mbInformation, mb_Ok);
end;

procedure InitializeWizard();
begin
AboutButton := TButton.Create(WizardForm);
AboutButton.Left := WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width;
AboutButton.Top := WizardForm.CancelButton.Top;
AboutButton.Width := WizardForm.CancelButton.Width;
AboutButton.Height := WizardForm.CancelButton.Height;
AboutButton.Caption := '&About...';
AboutButton.OnClick := @AboutButtonOnClick;
AboutButton.Parent := WizardForm;
end;
[/more].

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Поиск в WinDjView


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