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

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

Автор: Artem_Butenko
Дата сообщения: 30.08.2008 12:49
Victor_Dobrov

Извините Виктор, но кроме Вас мне больше никто не желает помочь в разборе проблем скинирования инсталлятора, штатными "средствами" паскаль скрипта. Ранее я спрашивал о возможности наложения битмапа (трёх состояний) на такие элементы как: TRadioButton; TCheckBox; TListBox и TComboBox. В инсталляторах на NSIS это реализовано, а вот за Inno Setup как то обидно. Вообще стоит пытать счастье осуществить тоже самое в Inno Setup, или лучше использовать скинирование на основе ISSkin.dll. Если честно, то я согласен с Вами по поводу "ненужной"(?!) перегрузки интерфейса инсталлятора, но все же интересно знать возможно то, о чём я говорю или нет?

Добавлено:
Товарищи

В инсталляторах патчей к играм основанных на Inno Setup используется утилита XPatch. Где её можно найти и как она вообще взаимодействует с Inno Setup (в коде)?
Автор: Diawer
Дата сообщения: 30.08.2008 18:02
Unc1e,
точно это то, лохонулся, спасибо.


Добавлено:
Посмотрите пожалуйста, добавил в код по обнаружению запущенной программы, код изминения надписи шапки окна, Почему у меня снизу на панели задач рядом с кнопкой Пуск появляется два окна 1- стандартное “Установка” и 2 – изменённое “Установка Test”.
Чё за фигня, посмотрел проги которые паковал раньше, то же самое, не обращал внимание. [more=ЗдесЬ] [Setup]
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
DefaultGroupName=Test

[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Files]
Source: compiler:ISTask.dll; DestDir: {tmp}; Flags: dontcopy

[Code_]
const
MB_ICONINFORMATION = $40;
MB_ICONEXCLAMATION = $30;
MB_ICONQUESTION = $20;
MB_ICONSTOP = $10;
MB_ICONNONE = $0;

function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer;
external 'MessageBoxA@user32.dll stdcall';

function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';

function InitializeSetup(): Boolean;
begin
If RunTask('Compil32.exe', false) then
begin
if MessageBox(0, 'Обнаружен запущенный экземпляр. Пожалуйста, закройте все экземпляры приложения и попробуйте снова.', 'Установка Test', $30 or mb_Ok) = idok then
Exit;
end;
Result:=True;
end; [/more]
Автор: serg_aka_lain
Дата сообщения: 30.08.2008 18:49
Diawer

Цитата:
Пуск появляется два окна 1- стандартное “Установка” и 2 – изменённое “Установка Test”.

- из-за использования системной MessageBox

Автор: Angel_Smerti
Дата сообщения: 30.08.2008 22:35
Прошу помощи!!!
Собрал инсталлятор, а секцию [Code] до ума довести не получается. Я почти все примеры взял из InnoSetupFAQ_ru-board.chm, но соединить их корректно не могу. [more=Посмотрите, кто-нибудь, как этот коктейль соединить?]
[Files]
Source: ISSkin.dll; DestDir: {app}; Flags: dontcopy noencryption
Source: VistaVGUltimate.cjstyles; DestDir: {tmp}; Flags: dontcopy noencryption
Source: Click2.wav; DestDir: {tmp}; DestName: click.wav; Flags: dontcopy nocompression noencryption
Source: $program.exe; DestDir: {userdocs}\My Games\Downloads; AfterInstall: ExtLog(); Flags: recursesubdirs ignoreversion

[Code]
// 1.) Запуск скина из библиотеки ISSkin.DLL
// Importing LoadSkin API from ISSkin.DLL
procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:isskin.dll stdcall';

// Importing UnloadSkin API from ISSkin.DLL
procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

// Importing ShowWindow Windows API from User32.DLL
function ShowWindow(hWnd: Integer; uType: Integer): Integer;
external 'ShowWindow@user32.dll stdcall';

function InitializeSetup(): Boolean;
begin
    ExtractTemporaryFile('VistaVGUltimate.cjstyles');
    LoadSkin(ExpandConstant('{tmp}\VistaVGUltimate.cjstyles'), 'NormalAero32.ini');
    Result := True;
end;

procedure DeinitializeSetup();
begin
    // Hide Window before unloading skin so user does not get
    // a glimse of an unskinned window before it is closed.
    ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
    UnloadSkin();
end;

// 2.) Проверка реестра на наличие определенного ключа
Function InitializeSetup: Boolean;
Begin
if RegKeyExists(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppName")}_is1')
or RegKeyExists(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{80DB2577-43E3-4C34-00AF-0D7967B942C9}')
then
result:= true
else
MsgBox('{#SetupSetting("AppName")} не найдена!', mbInformation, mb_Ok)
End;

// 3.) Варианты озвучивания клавиш
function sndPlaySound(lpszSoundName: string; uFlags: cardinal):integer;
external 'sndPlaySoundA@winmm.dll stdcall';

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('click.wav');
Result := True;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
sndPlaySound(ExpandConstant('{tmp}\click.wav'), $0001);
Result := True;
end;

function BackButtonClick(CurPageID: Integer): Boolean;
begin
sndPlaySound(ExpandConstant('{tmp}\click.wav'), $0001);
Result := True;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
sndPlaySound(ExpandConstant('{tmp}\click.wav'), $0001);
end;

// Для Обзора папок
function DirBrowseButtonClick(CurPageID: Integer): Boolean;
begin
sndPlaySound(ExpandConstant('{tmp}\click.wav'), $0001);
Result := True;
end;

// Для пуска
function GroupBrowseButtonClick(CurPageID: Integer): Boolean;
begin
sndPlaySound(ExpandConstant('{tmp}\click.wav'), $0001);
Result := True;
end;

// 4.) Изменение размера страницы с индикатором выполнения установки
procedure InitializeWizard();
begin

// Выносим кнопку "Отмена" на передний план
WizardForm.CancelButton.BringToFront;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpInstalling
then
begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(395);
WizardForm.Height:=ScaleY(142);
//Здесь смещение страницы установки (в верхний левый угол)
WizardForm.Left:=ScaleX(0);
WizardForm.Top:=ScaleY(0);
{Внимание! Нижеописанные способы смещения работают, только когда вставлено фоновое изображение или WindowVisible=yes}
{Выводит в правом верхнем углу экрана}
//WizardForm.Left:=ScaleX(MainForm.Width-420);
//WizardForm.Top:=ScaleY(MainForm.Left+20);
{Выводит снизу по центру экрана}
//WizardForm.Position:=poScreenCenter;
//WizardForm.Top:=ScaleY(MainForm.Height-170);
{Выводит в нижнем левом углу (как в Doom 3 Resurrection of Evil от 1C)}
//WizardForm.Left:=ScaleX(MainForm.Left+20);
//WizardForm.Top:=ScaleY(MainForm.Height-170);
{Выводит в нижнем правом углу}
//WizardForm.Left:=ScaleX(MainForm.Width-420);
//WizardForm.Top:=ScaleY(MainForm.Height-170);

WizardForm.InnerNotebook.Left:=ScaleX(10);
WizardForm.InnerNotebook.Top:=ScaleY(10);
WizardForm.InnerNotebook.Width:=ScaleX(370);
WizardForm.StatusLabel.Left:=ScaleX(0);
WizardForm.StatusLabel.Top:=ScaleY(0);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(154);
WizardForm.CancelButton.Top:=ScaleY(80);
end
if CurPageID=wpFinished
then
begin
WizardForm.Width:=502; {Размер окна по горизонтали}
WizardForm.Height:=392; {Размер окна по вертикали}
WizardForm.Position:=poScreenCenter; {Возврат в исходное состояние}
end
end;

// 5.) Подсчёт длительности установки (по времени старта и завершения)
type TSystemTime = record wYear, wMonth, wDayOfWeek, wDay, wHour, wMinute, wSecond, wMilliseconds: Word; end;
var StartTime, Time: TSystemTime; TLabel: TNewStaticText;

function GetLocalTime(var lpTime: TSystemTime): Boolean; external 'GetLocalTime@kernel32.dll stdcall';

Function GetWorkTime: String;
Begin
GetLocalTime(Time) {время завершения установки}
if Time.wHour < StartTime.wHour then begin
Time.wHour:= 24 - StartTime.wHour + Time.wHour
end else begin
Time.wHour:= Time.wHour - StartTime.wHour
end
if Time.wMinute < StartTime.wMinute then begin
Time.wMinute:= 60 - StartTime.wMinute + Time.wMinute
Time.wHour:= Time.wHour - 1
end else begin
Time.wMinute:= Time.wMinute - StartTime.wMinute
end
if Time.wSecond < StartTime.wSecond then begin
Time.wSecond:= 60 - StartTime.wSecond + Time.wSecond
Time.wMinute:= Time.wMinute - 1
end else begin
Time.wSecond:= Time.wSecond - StartTime.wSecond
end
if Time.wMilliseconds < StartTime.wMilliseconds then begin
Time.wMilliseconds:= 1000 - StartTime.wMilliseconds + Time.wMilliseconds
Time.wSecond:= Time.wSecond - 1
end else begin
Time.wMilliseconds:= Time.wMilliseconds - StartTime.wMilliseconds
end
Result:= 'Длительность: ' + IntToStr(Time.wHour) + ' час, ' + IntToStr(Time.wMinute) + ' мин, ' + FloatToStr((Time.wSecond*1000 + Time.wMilliseconds)/1000) + ' сек.'
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
if CurPageID = wpFinished then TLabel.Caption:= TLabel.Caption + #13#10 + GetWorkTime;
End;

Procedure InitializeWizard;
Begin
GetLocalTime(StartTime) {время начала установки}
TLabel:= TNewStaticText.Create(WizardForm);
TLabel.Top:= WizardForm.CancelButton.Top;
TLabel.Left:= WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width;
TLabel.Parent:= WizardForm;
TLabel.Caption:= 'Время старта: ' + IntToStr(StartTime.wHour) + ' час, ' + IntToStr(StartTime.wMinute) + ' мин, ' + FloatToStr((StartTime.wSecond*1000 + StartTime.wMilliseconds)/1000) + ' сек.' ;
End;

// 6.) Не отключать страницу, если не хватает места на диске, а просто сделать неактивным выбор папки
procedure InitializeWizard();
begin
WizardForm.DirBrowseButton.Enabled:=False
WizardForm.DirEdit.Enabled:=False
end;

// 7.) Отображение процентов выполнения, если у пользователя в системе установлено другое оформление, и цвет прогресс-бара будет неизвестно какой
var
ProgressLabel: TLabel;

procedure ExtLog();
begin
with WizardForm.ProgressGauge do begin
ProgressLabel.Caption:=IntToStr((Position-Min)/((Max - Min)/100)) + '%'
end
end;

procedure InitializeWizard;
begin
ProgressLabel:=TLabel.Create(WizardForm)
with WizardForm.ProgressGauge do
begin
ProgressLabel.Top:=4
ProgressLabel.Left:=200
ProgressLabel.Caption:='0%'
ProgressLabel.AutoSize:=True
ProgressLabel.Font.Color:=clWindowText
ProgressLabel.Font.Style:=[fsBold]
ProgressLabel.Transparent:=True
ProgressLabel.Parent:=WizardForm.ProgressGauge
end;
end;
[/more]
Автор: serg_aka_lain
Дата сообщения: 31.08.2008 01:41
Angel_Smerti

Цитата:
как этот коктейль соединить?


-так [more]

[_Code]


type
TSystemTime = record
wYear, wMonth, wDayOfWeek, wDay, wHour, wMinute, wSecond, wMilliseconds: Word;
end;



function sndPlaySound(lpszSoundName: string; uFlags: cardinal):integer;
external 'sndPlaySoundA@winmm.dll stdcall';

procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:isskin.dll stdcall';

procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

function ShowWindow(hWnd: Integer; uType: Integer): Integer;
external 'ShowWindow@user32.dll stdcall';

function GetLocalTime(var lpTime: TSystemTime): Boolean;
external 'GetLocalTime@kernel32.dll stdcall';



var
StartTime, Time: TSystemTime;
LabelW: TNewStaticText;
ProgressLabel: TLabel;



function GetWorkTime: String;
begin
GetLocalTime(Time);
if Time.wHour < StartTime.wHour then
begin
Time.wHour := 24 - StartTime.wHour + Time.wHour
end else
begin
Time.wHour := Time.wHour - StartTime.wHour
end
if Time.wMinute < StartTime.wMinute then
begin
Time.wMinute := 60 - StartTime.wMinute + Time.wMinute
Time.wHour := Time.wHour - 1
end else
begin
Time.wMinute := Time.wMinute - StartTime.wMinute
end
if Time.wSecond < StartTime.wSecond then
begin
Time.wSecond := 60 - StartTime.wSecond + Time.wSecond
Time.wMinute := Time.wMinute - 1
end else
begin
Time.wSecond := Time.wSecond - StartTime.wSecond
end
if Time.wMilliseconds < StartTime.wMilliseconds then
begin
Time.wMilliseconds := 1000 - StartTime.wMilliseconds + Time.wMilliseconds
Time.wSecond := Time.wSecond - 1
end else
begin
Time.wMilliseconds:= Time.wMilliseconds - StartTime.wMilliseconds
end
Result := 'Длительность: ' + IntToStr(Time.wHour) + ' час, ' + IntToStr(Time.wMinute) + ' мин, ' + FloatToStr((Time.wSecond*1000 + Time.wMilliseconds)/1000) + ' сек.'
end;


procedure ExtLog();
begin
with WizardForm.ProgressGauge do
begin
ProgressLabel.Caption := IntToStr((Position-Min)/((Max - Min)/100)) + '%'
end;
end;


function InitializeSetup: Boolean;
begin
ExtractTemporaryFile('VistaVGUltimate.cjstyles');
LoadSkin(ExpandConstant('{tmp}\VistaVGUltimate.cjstyles'), 'NormalAero32.ini');
Result := True;

if RegKeyExists(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppName")}_is1')
or RegKeyExists(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{80DB2577-43E3-4C34-00AF-0D7967B942C9}') then
begin
Result := true;
end else
begin
MsgBox('{#SetupSetting("AppName")} не найдена!', mbInformation, mb_Ok);
Result := False;
Exit;
end;

ExtractTemporaryFile('click.wav');
Result := True;
end;


procedure DeinitializeSetup();
begin
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
UnloadSkin();
end;


function NextButtonClick(CurPageID: Integer): Boolean;
begin
sndPlaySound(ExpandConstant('{tmp}\click.wav'), $0001);
Result := True;
end;


function BackButtonClick(CurPageID: Integer): Boolean;
begin
sndPlaySound(ExpandConstant('{tmp}\click.wav'), $0001);
Result := True;
end;


procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
sndPlaySound(ExpandConstant('{tmp}\click.wav'), $0001);
end;


function DirBrowseButtonClick(CurPageID: Integer): Boolean;
begin
sndPlaySound(ExpandConstant('{tmp}\click.wav'), $0001);
Result := True;
end;


function GroupBrowseButtonClick(CurPageID: Integer): Boolean;
begin
sndPlaySound(ExpandConstant('{tmp}\click.wav'), $0001);
Result := True;
end;


procedure InitializeWizard;
begin
WizardForm.DirBrowseButton.Enabled := False;
WizardForm.DirEdit.Enabled := False;

GetLocalTime(StartTime);

LabelW := TNewStaticText.Create(WizardForm);
LabelW.Top := WizardForm.CancelButton.Top;
LabelW.Left := WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width;
LabelW.Parent := WizardForm;
LabelW.Caption := 'Время старта: ' + IntToStr(StartTime.wHour) + ' час, ' + IntToStr(StartTime.wMinute) + ' мин, ' + FloatToStr((StartTime.wSecond*1000 + StartTime.wMilliseconds)/1000) + ' сек.' ;

ProgressLabel := TLabel.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressLabel.Top := ScaleY(4);
ProgressLabel.Left := ScaleX(180);
ProgressLabel.Caption := '0%';
ProgressLabel.AutoSize := True;
ProgressLabel.Font.Color := clWindowText;
ProgressLabel.Font.Style := [fsBold];
ProgressLabel.Transparent := True;
ProgressLabel.Parent := WizardForm.ProgressGauge;
end;

end;



procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpInstalling then
begin
WizardForm.MainPanel.Visible := False;
WizardForm.Bevel1.Visible := False;
WizardForm.Width := ScaleX(395);
WizardForm.Height := ScaleY(142);
WizardForm.Left := ScaleX(0);
WizardForm.Top := ScaleY(0);
WizardForm.InnerNotebook.Left := ScaleX(10);
WizardForm.InnerNotebook.Top := ScaleY(10);
WizardForm.InnerNotebook.Width := ScaleX(370);
WizardForm.StatusLabel.Left := ScaleX(0);
WizardForm.StatusLabel.Top := ScaleY(0);
WizardForm.StatusLabel.Width := WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left := ScaleX(0);
WizardForm.FileNameLabel.Top := ScaleY(20);
WizardForm.FileNameLabel.Width := WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top := ScaleY(40);
WizardForm.ProgressGauge.Width := WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left := ScaleX(154);
WizardForm.CancelButton.Top := ScaleY(80);
WizardForm.CancelButton.BringToFront;
end

if CurPageID=wpFinished then
begin
LabelW.Caption := LabelW.Caption + #13#10 + GetWorkTime;
WizardForm.Width:= ScaleX(502);
WizardForm.Height:= ScaleY(392);
WizardForm.Position := poScreenCenter;
end;
end;

[/more]



Автор: KurtWagner
Дата сообщения: 31.08.2008 08:06
[more]SotM[more]
Чувак вот http://kurtwagner.wen.ru/Universal.zip это надо распаковать автоматом!!! Заранее спасибо!

2-ой вопросик у меня такой файл уже загружен и запушен скажем Glass2k.exe и он находится в трее! Мне надо чтоб он пропускал ощибку что этот файл запушкен и его невозможно заменить!
Автор: Diawer
Дата сообщения: 31.08.2008 10:12
serg_aka_lain, дак это можно исправить?
Автор: Angel_Smerti
Дата сообщения: 31.08.2008 12:02
serg_aka_lain - СПАСИБО!!!
Пока тесты идут нормально.
Автор: serg_aka_lain
Дата сообщения: 31.08.2008 12:24
Diawer

Цитата:
дак это можно исправить?

-Пользоваться встроенными MsgBox, например [more]

[Setup]
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
DefaultGroupName=Test

[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Files]
Source: compiler:ISTask.dll; DestDir: {tmp}; Flags: dontcopy

[Code]

function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';

function InitializeSetup(): Boolean;
begin
If RunTask('Compil32.exe', false) then
begin
MsgBox('Обнаружен запущенный экземпляр. Пожалуйста, закройте все экземпляры приложения и попробуйте снова.', mbError , mb_Ok);
Result := False;
Exit;
end;

Result := True;
end;

[/more]
Автор: Artem_Butenko
Дата сообщения: 31.08.2008 13:44
Друзья, пожалуйста помогите "эмулировать" в Inno Setup патчер dUP. Т.е., возможно ли осуществить следующие действия: вынести чек-бокс создания бэкапа на страницу приветствия, отключив все остальные страницы; организавать поиск установленного приложения в реестре, если ключ не найден, появлялось диалоговое окно где предлагалось бы указать директорию установки, и по нажатию "OK" происходила бы установка (с проверкой MD5 хэша исходного файла). Надеюсь на общую помощь и заранее спасибо!
Автор: SotM
Дата сообщения: 31.08.2008 15:03
KurtWagner
Хе, ну насколько я могу судить, то этой программе нельзя передать какие-нибудь параметры через командную строку. Да и "нажать" кнопки в этой программе будет сложновато, это ведь внешняя программа.
С помощью AutoIt было бы проще это сделать, но это нужно обсуждать уже в другой ветке форума.

Автор: Diawer
Дата сообщения: 31.08.2008 17:09
serg_aka_lain, спасибо конечно, но ты собственно убрал то что я добавил, если ты внимательно читал вопрос, мне Нужна смена заголовка,
но что бы не вылазило второе окно.
Автор: serg_aka_lain
Дата сообщения: 31.08.2008 18:00
Diawer

Ну, способа спрятать системное сообщение из панели задач я не знаю, но может быть и реально.
Автор: Artem_Butenko
Дата сообщения: 31.08.2008 19:01
Ребята!!! -- к моему вопросу о эмуляции интерфейса патчера dUP в Inno Setup, - как можно проверить (MD5 хэш + по имени файла) наличие рядом с исполнительным файлом инсталлятора, файла определенного размера и имени; и, если этот файл найден, распаковка происходила бы здесь же. Если это возможно, пожалуйста помогите ценным советом!
Автор: Diawer
Дата сообщения: 31.08.2008 21:51
serg_aka_lain, жаль, а то смотрится как баг.


Может кто решал эту проблему?
Автор: htuos
Дата сообщения: 31.08.2008 23:19
Diawer
убрать кнопку в панели задач можно в InitializeWizard
[more]procedure InitializeWizard;
begin
If RunTask('Compil32.exe', false) then
if MessageBox(MainForm.Handle, 'Обнаружен запущенный экземпляр. Пожалуйста, закройте все экземпляры приложения и попробуйте снова.', 'Установка Test', $30 or mb_Ok) = idok then Exit;
end;
[/more]
Автор: serg_aka_lain
Дата сообщения: 01.09.2008 00:01
htuos, Diawer

Цитата:
убрать кнопку в панели задач можно в InitializeWizard

Тогда уже так, наверное, правильно будет [more]

procedure InitializeWizard;
begin
If RunTask('Compil32.exe', false) then
begin
if MessageBox(WizardForm.Handle, 'Обнаружен запущенный экземпляр. Пожалуйста, закройте все экземпляры приложения и попробуйте снова.', 'Установка Test', $30 or mb_Ok) = idok then
Abort;
end;
end;

[/more]

Вроде в этом обработчике Exit не используется

Автор: nOobCrafter
Дата сообщения: 01.09.2008 09:27
Может кто ответить по поводу записи версии в лог?..
Вот код лога:

Код: Function InitializeSetup: Boolean;
begin
str:= #13#10 + '=================' + #13#10 +
'Установка начата : ' + GetDateTimeString('dd/mm/yyyy hh:nn:ss', '-', ':');
str:= str + #13#10 + 'Компьютер/Пользователь : ' +
GetComputerNameString + '/' + GetUserNameString;
SaveStringToFile('C:\Windows\log.txt', str, True);
end;

procedure DeinitializeSetup();
begin
str:= #13#10 + 'Установка закончена : ' +
GetDateTimeString('dd/mm/yyyy hh:nn:ss', '-', ':');
SaveStringToFile('C:\Windows\og.txt', str, True);
end;
Автор: bull3t
Дата сообщения: 01.09.2008 10:12
Может таки кто знает?

Как обойти проблему с кодировкой?
я записываю в .bat файл с помощью ф-ии SaveStringToFile путь к файлу. и, если в пути встречаются русские символы(ну типа "Рабочий стол" и т.п.) то, естественно, он их не находит.

Автор: SotM
Дата сообщения: 01.09.2008 10:40
bull3t
В смысле "не находит"? Кто кого не находит?
Еще раз выложи свой скрипт.
Автор: SergeyLS
Дата сообщения: 01.09.2008 11:57
Здравствуйте!
Вот возник вопросик по поводу инкрементального обновления базы данных.
Пока в базе были общие датники (dat.dba ... .d0x) - все было в порядке и работало с таким кодом:

[more]
#define MyAppName "My Udate Data"
#define MyAppVerName "My Udate Data 1.5"
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "http://www.example.com/"

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{8F70737A-2509-4E5D-82D2-980A1A3EA1E0}
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename=setup
Compression=lzma
SolidCompression=true
AllowNoIcons=true
ShowLanguageDialog=auto
Uninstallable=false

[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Files]
Source: dat.dbа; DestDir: {app}; DestName: {code:SetFileName}
Source: dat.d00; DestDir: {app}; DestName: {code:SetFileName}
Source: dat.d01; DestDir: {app}; DestName: {code:SetFileName}


Код:

Код:
function SetFileName(Param: String): String;
var
i: integer;
begin
i:= 0;
if not FileExists(ExpandConstant('{app}\dat.dbа')) then
Result:= 'dat.dbа'
else
begin
while FileExists(ExpandConstant('{app}\') + Format('dat.d%.2d', [i])) do
i:= i+1;
Result := Format('dat.d%.2d', [i]);
end;
end;

Автор: SotM
Дата сообщения: 01.09.2008 12:35
SergeyLS

Дык, а чё, [more=разве так сложно сделать?]
[Files]
Source: soup.dba; DestDir: {app}; DestName: {code:SetFileName1}
Source: soup.d00; DestDir: {app}; DestName: {code:SetFileName1}
Source: soup.d01; DestDir: {app}; DestName: {code:SetFileName1}

------
------

Source: wine.dba; DestDir: {app}; DestName: {code:SetFileNameX}
Source: wine.d00; DestDir: {app}; DestName: {code:SetFileNameX}
Source: wine.d01; DestDir: {app}; DestName: {code:SetFileNameX}

[no][code][/no]

function SetFileName(Param: String): String;
var
i: integer;
begin
i:= 0;
if not FileExists(ExpandConstant('{app}\' + Param + '.dba')) then
Result:= Param + '.dba'
else
begin
while FileExists(ExpandConstant('{app}\') + Format(Param + '.d%.2d', [i])) do
i:= i+1;
Result := Format(Param + '.d%.2d', [i]);
end;
end;


function SetFileName1(Param: String): String;
begin
Result := SetFileName( 'soup' )
end;

------
------

function SetFileNameX(Param: String): String;
Result := SetFileName( 'wine' )
end;
[/more]
Автор: bull3t
Дата сообщения: 01.09.2008 13:38
SotM



Цитата:

[Run]
Filename: "{tmp}\run_dotnetfx.bat"; Flags: shellexec waituntilterminated; Parameters: /NORESTART /VERYSILENT; Description: "Установка .Net"; Components: operator


if CurPageId = 7 then begin //Проверка на наличие ДотНета
if IsComponentSelected('operator') or IsComponentSelected('arm_admin') or IsComponentSelected('arm_admin\admin') or IsComponentSelected('arm_admin\instrument') or IsComponentSelected('arm_admin\sn') or IsComponentSelected('server') and RegKeyExists(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322') then begin
if MsgBox('У вас уже установлен .NET Framework. Хотите ли вы установить его заново?', mbInformation, MB_YESNO) = idYes then begin
DeleteFile(ExpandConstant('{tmp}\run_dotnetfx.bat'));
SaveStringToFile(ExpandConstant('{tmp}\run_dotnetfx.bat'), ExpandConstant('{src}\1033dotnetfx.exe /q:a'), True);
end
else begin
DeleteFile(ExpandConstant('{tmp}\run_dotnetfx.bat'));
SaveStringToFile(ExpandConstant('{tmp}\run_dotnetfx.bat'), 'echo Installation is running...', True);
end;
end;


Ф-ия SaveStringToFile записывает путь в файл и потом секция Run запускает батник. Так вот если я запускаю скрипт из какой-нибудь папки с русским названием, то при запуске батника все русские символы превращаются в абракадабру. ВИН кодировка, а не ДОС, как я понимаю. Но как с этим бороться, я хз.
Автор: SergeyLS
Дата сообщения: 01.09.2008 14:19
Привет!
SotM

Цитата:
SergeyLS

Дык, а чё, разве так сложно сделать?

Можно, но особо не облегчит жизнь, так-как таких строк может быть пару десятков.
Это ведь для каждой из них - придется дописывать
А вот символ (*) скрипт не принимает - ругается!
Вот если бы можно было массив написать, то тогда было бы классно.
Но все-равно спасибо.
Пока!
Автор: SotM
Дата сообщения: 01.09.2008 14:34
bull3t
Ну да, это происходит из-за разной кодировки. Как перекодировать я не знаю. Может тут уже обсуждалось об этом, но просто я не заметил.
Как вариант: не использовать секцию Run, а запускать прямо из кода, но только тогда нужно что-то на экран выводить, а то процесс установки DotNet может затянуться.
Автор: bull3t
Дата сообщения: 01.09.2008 15:14
SotM

а как запускать из кода?
Автор: SotM
Дата сообщения: 01.09.2008 15:43
bull3t
В хелпе можешь почитать о функции Exec. Или же скачать примеры из шапки и посмотреть самому.
Автор: Genri
Дата сообщения: 01.09.2008 15:47
Kindly

Цитата:
...64 битные параметры, Inno ругается. Можно ли адаптировать под новую версию?
-- вряд-ли. По крайней мере, добавить базовый тип, я способа не знаю.

Artem_Butenko

Цитата:
а) простая проверка присутствия папок и файлов по их имени;
б) комбинированная проверка - по имени и размеру файлов и папок исходников.
И можно ли совместить (очень важно!!!) данную страницу (выбора директории исходников) со страницей выбора директории установки.
-- проверка наличия папки там уже есть (if Not DirExists(Page.Values[0]) then...). В это место можешь добавлять все проверки, которые тебе нужны (наличие конкретного файла, чексумма и т.п.). В принципе, можно проверку вообще вынести в отдельную функцию, которой в качестве параметра передавать имя папки.
Совместить со страницей выбора папки установки можно, но трудоемко - писанины много.

SergeyLS

Цитата:
как сделать, чтобы одна процедура или одна функция работала для всего наборчика?
-- передавать имя файла в качестве параметра. [more][no]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program

[Files]
Source: dat.dba; DestDir: {app}; DestName: {code:SetFileName|dat}
Source: dat.d00; DestDir: {app}; DestName: {code:SetFileName|dat}
Source: dat.d01; DestDir: {app}; DestName: {code:SetFileName|dat}

Source: wine.dba; DestDir: {app}; DestName: {code:SetFileName|wine}
Source: wine.d00; DestDir: {app}; DestName: {code:SetFileName|wine}
Source: wine.d01; DestDir: {app}; DestName: {code:SetFileName|wine}

[Code]
function SetFileName(Param: String): String;
var
i: integer;
begin
i:= 0;
if not FileExists(ExpandConstant('{app}\' + Param + '.dbа')) then
Result:= Param + '.dbа'
else
begin
while FileExists(ExpandConstant('{app}\') + Param + Format('.d%.2d', [i])) do
i:= i+1;
Result := Param + Format('.d%.2d', [i]);
end;
end; [/no][/more]
Автор: bull3t
Дата сообщения: 01.09.2008 15:48
ок. спасибо.
Автор: Sid007
Дата сообщения: 01.09.2008 15:51
Всем здрасти. Захотел я тут такой фокус провернуть как в СТАЛКЕРЕ приповторном запуске инсталятора он спрашиват "Запустить игру?". Может кто знает каким это образом сделано или сслылочку если это было уже. Максимум на что хватило ума это вот на это:

function InitializeSetup(): Boolean;
var
ResultStr: String;
begin
Result:=True;
if RegValueExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Grand Theft Auto III_is1', 'UninstallString')
then
begin
MsgBox('Игра "Grand Theft Auto III" уже установлена.', mbInformation, mb_ok);
Result:=False;
end;
end;

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

Предыдущая тема: Презентация


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