Войти

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 4]


Страниц : 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

R.i.m.s.k.y.
08-02-2012, 14:40
vitl,
код рабочий джигурда процентов


[Setup]
AppName=Обновление Флеш-версии
AppVerName=Обновление
UsePreviousAppDir=no
AppendDefaultDirName=no
AllowRootDirectory=yes
DirExistsWarning=no
DefaultDirName={code:Pathapp}
DisableStartupPrompt=yes
DisableReadyPage=yes
; DisableFinishedPage=yes
DisableDirPage=True
DisableProgramGroupPage=yes
OutputBaseFilename=Updater_Fl
Compression=lzma
SolidCompression=yes
Uninstallable=false
//WizardImageFile=SFXLogo3.bmp

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

[Files]
; Source: "{src}\utils\*"; DestDir: "{app}\"; Flags: external recursesubdirs skipifsourcedoesntexist

Source: filenull; DestDir: {tmp}; BeforeInstall: BackUp; Flags: ignoreversion
Source: Settings\Client\*; DestDir: {app}\Settings\Client\; BeforeInstall: ChangeCaption('\Settings\Client\'); Flags: ignoreversion recursesubdirs createallsubdirs
Source: utils\; DestDir: {app}\utils\; BeforeInstall: ChangeCaption('\utils\'); Flags: ignoreversion recursesubdirs createallsubdirs


[*Code]

var Drive_Letter : string;

procedure ChangeCaption(str: string);
begin
WizardForm.StatusLabel.Caption:= str;
end;

Function InitializeSetup: Boolean;
var i : Integer;
begin
Drive_Letter := ''; i:= Ord('a');
while ( (Length(Drive_Letter)=0) and (i<=Ord('z')) )
do begin
if FileExists(Chr(i)+':\markerfile') then Drive_Letter := Chr(i);
i := i +1;
end;
if (Length(Drive_Letter) > 0) then begin
Result := True
end
else begin
MsgBox('флэшка не найдена', mbError, mb_Ok);
Result := False;
end;
end;

function Pathapp(String:String): String;
begin
if (Length(Drive_Letter) > 0) then Result := Drive_Letter +':\' else Result := ExpandConstant('{tmp}');
end;

procedure copyfiles(fromfile, tofile:string);
var res : integer;
begin
Exec('cmd.exe', ' /c xcopy /Y ' + AddQuotes(fromfile) + ' ' + AddQuotes(tofile),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

Procedure backUp();
begin
ChangeCaption('BackUp');
If DirExists (Drive_Letter +':\'+'Settings\Client\') then copyfiles(Drive_Letter +':\'+'Settings\Client\*', Drive_Letter +':\'+'Backup\'+GetDateTimeString('YYYYMMDD_hh:nn:ss', '-', '-')+'\Settings\Client\');
if DirExists (Drive_Letter +':\'+'utils\') then copyfiles(Drive_Letter +':\'+'utils\*', Drive_Letter +':\'+'Backup\'+GetDateTimeString('YYYYMMDD_hh:nn:ss', '-', '-')+'\utils\');
end;

vitl
08-02-2012, 18:48
[*Code] »

1.) Заработало, когда исправил на [Code]
Спасибо, R.i.m.s.k.y.

2.) Но почему то не обновляются файлы (при запуске готового EXE-ка), а только бэкапятся. В чем м.б. проблема? При компиляции такого нет.

3.) Что делает код? (см. ниже)
Source: filenull; DestDir: {tmp}; BeforeInstall: BackUp; Flags: ignoreversion »

4.) Еще вопрос по тому-же скрипту: что изменить в коде, чтобы копировались в backup только те файлы, которые обновляются?

R.i.m.s.k.y.
08-02-2012, 21:41
vitl,
1. пожалуйста
2. строчка Source: Settings\Client\*; DestDir: {app}\Settings\Client\; копирует обновления, проверяйте пути, можно в ее изменить, добавить AfterInstall: MsgBox(ExpandConstant('{app}\Settings\Client\'), mbError, mb_Ok) - будет выводится путь куда пишется, хотя это должно писаться над зеленой колбасой
3. бэкапит, nullfile - любой левый мелкий файлик, можно и через CurStepChanged, но это следующий уровень
4. писать руками имена файлов в Procedure backUp()

vitl
08-02-2012, 22:11
проверяйте пути, можно в ее изменить »

1.) а можно ли организовать все так:
на одном уровне с ЕХЕ-ком положить каталог UPD\, который содержит обновленные папки с файлами (т.е. Settings\Client\ и UTILS\), как и в корне флешки?
Чтобы из UPD\ подхватывались обновления - чтобы не дописывать каждый раз скрипт при изменении в последующих обновлениях.
Т.е. в дистрибе с обновлениями папка UPD\ будет повторять корень флешки.

2.) Еще вопрос по тому-же скрипту: что изменить в коде, чтобы копировались в backup только те файлы, которые обновляются?

R.i.m.s.k.y.
08-02-2012, 22:26
vitl,
1. Source: {src}\upd\Settings\Client\*; ... Flags: external
2. см 4 выше, ручками дописываешь в процедуру backup в copyfiles(Drive_Letter +':\'+'Settings\Client\file1', Drive_Letter +':\'+'Backup\'+GetDateTimeString('YYYYMMDD_hh:nn:ss', '-', '-')+'\Settings\Client\');
Можно конечно замутить опрос в цикле {src} и бэкап, но а) сложность не оправдывается целями ибо б) полные бэкапы спасут мир, а инкрементные следует предать анафеме

gvshil
09-02-2012, 02:01
Прошу помощи:

Во время установки запускается процесс, нужно дождаться появления его окна и убить процесс.

[Run]
Filename: {app}\MyProg.exe; Parameters: -init
Filename: {sys}\taskkill.exe; Parameters: /f /im MyProg.exe; Flags: runhidden waituntilidle
Не убивается процесс.

R.i.m.s.k.y.
09-02-2012, 08:10
gvshil, а что делает точка с запятой в имени экзешника?

gvshil
09-02-2012, 08:19
а что делает точка с запятой в имени экзешника? »
Да это опечатка, в скрипте MyProg.exe;

R.i.m.s.k.y.
09-02-2012, 08:28
gvshil,
а руками из комстроки он прибивается?

gvshil
09-02-2012, 08:45
R.i.m.s.k.y.
Отписал в РМ.

R.i.m.s.k.y.
09-02-2012, 08:48
gvshil, на тематические вопросы отвечаю в темах
сам прибиваю также, через taskkill

Gugle
09-02-2012, 12:07
Доброго времени суток!
Подскажите как можно проверить создана Panel или нет?

Что то типа:
[*code]
VAR
panel: TPanel;

....

PROCEDURE Test();
BEGIN
if (panel = null) then begin
panel := TPanel.Create(WizardForm);
end;
END;

YURSHAT
09-02-2012, 13:36
Подскажите как можно проверить создана Panel или нет? »
А не проще ли создавать панель если удовлетворяется условие для ее создания? То есть ""если мое условие удовлетворяется - panel := TPanel.Create(WizardForm)... и т.д.""

А так, какой смысл создавать элемент, который не используется?

Gugle
09-02-2012, 14:41
Нет не проще. Панелька может создаваться при выполнении нескольких не взаимосвязанных условиях.

R.i.m.s.k.y.
09-02-2012, 14:48
Gugle, я в таких случаях делаю проще:
1. объявляю глобальную переменную типа integer, к примеру var panelka_goooogle : integer;
2. в InitializeSetup присваиваю ей -1 panelka_goooogle := -1// переменная неопределена
3. в процедуре где создается твоя панелька делаю уже panelka_goooogle := 1 если панелька дропается или еще какие уловия panelka_goooogle := 0, 2, 3...
4. где нужна проверка на панельку if (panelka_goooogle = 1) then... )[/off]

Serega
10-02-2012, 15:29
А не проще ли создавать панель если удовлетворяется условие для ее создания? »
Полностью согласен, но видимо Gugle требуется доп. проверка...
Подскажите как можно проверить создана Panel или нет? »
Всё просто:


var
panel: TPanel;

procedure InitializeWizard;
begin
panel := nil; // укажем, что объект ещё не создан...
end;

procedure Test;
begin
if panel = nil then
begin
panel := TPanel.Create(WizardForm);
// и т.д. и т.п.
end;
end;

Serega
10-02-2012, 15:57
как в BeforeInstall записать 2 параметра? »
Вы немного путаете, две функции в одну строку нельзя.
в справке говорится, что через запятую, но у меня это не работает »
В справке говорится, что вы можете передать несколько параметров одной функции, которые будут разделены запятыми.с этой проблемой столкнулся, когда объединял эти 2 кода »
Решается она просто:


[Files]
Source: "{src}\*.exe"; DestDir: {app}; BeforeInstall: AddInfo('Откиньтесь на спинку кресла и наслаждайтесь!')
Source: "{src}\*.dll"; DestDir: {app}; BeforeInstall: AddInfo('Не забудьте зарегистрироваться')
Source: E:\Program\Inno Setup 5.3.8 Ext\*; DestDir: {app}; BeforeInstall: AddInfo(''); Flags: nocompression recursesubdirs createallsubdirs

[Code]
var
FilesMemo: TMemo;

procedure AddInfo(s: string);
var
AFile: string;
begin
AFile := ExpandConstant(CurrentFilename);
if ExtractFileExt(AFile) = '' then
FilesMemo.Lines.Add('CreateFolder: ' + RemoveBackslash(AFile))
else
FilesMemo.Lines.Add('Extract: ' + AFile);
if s <> '' then
WizardForm.StatusLabel.Caption := s;
end;

procedure InitializeWizard();
begin
FilesMemo := TMemo.Create(WizardForm);
with FilesMemo do
begin
SetBounds(ScaleX(0), ScaleY(80), ScaleX(418), ScaleY(120));
WordWrap := False;
Parent := WizardForm.InstallingPage;
ScrollBars := ssVertical;
ReadOnly := True;
Clear;
end;
end;

Johny777
10-02-2012, 17:11
Serega,
спасибо,
.................................................................................................... ............................
и ещё вопрос

как сделать, чтобы созданный мной сроллбокс в расширенной версии инно, в дизайнере
чтобы он прокручивался колесом мыши.
VertScrollBar.Tracking := True; не помогает
подозреваю, что не хватает какой-то функции

TROY Diamond
11-02-2012, 13:32
можно через код...

Старый вопрос... а как?

Как "тихо" запустить определённый exe-шник, копируемый в папку установки, сразу же после его успешного копирования и потом закрыть его "автоматом", или после распаковки всех файлов приложения, НО ДО ЗАВЕРШЕНИЯ УСТАНОВКИ?

Ничего "криминального" - этот "файл" является небольшой родной "утилиткой", которая собирает определённые сведения о системе и прописывает необходимые данные в реестр в ветку устанавливаемого приложения.
Если есть какой-нибудь другой способ, то тоже неплохо.

Пробовал в секции Run - сначала запустить этот файл, а потом, убить его с помощью батника, в котором прописано "taskkill /f /im MyProg.exe" - НЕ получается, прога запускается и висит, батник не запускается, пока прогу НЕ закроешь, а мне ведь и НАДО ЕЁ закрыть!!!
Если поставить флаг "nowait", то он действительно НЕ ждёт и не даёт файлу даже запуститься...

Почему-то НЕ работает флаг "runhidden", он не скрывает окно приложения и даже НЕ сворачивает с флагом "runminimized".
Этот флаг работает только для скрытия консольных окон что ли? Их он скрывает без проблем.
Помогите, пожалуйста!!! Может через секцию Code как-то можно сделать?

Пробовал так, тоже не получилось:

function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}\ISTask.dll stdcall delayload;

function KillTask(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall delayload';

procedure CurStepChanged(CurStep: TSetupStep);
var
ResultCode:Integer;
begin
if CurStep = ssPostInstall then
begin
Exec(ExpandConstant('{app}\MyProg.exe'), '', ExpandConstant('{app}'), SW_Hide, ewWaitUntilTerminated, ResultCode);
begin
if RunTask('MyProg.exe', false) then
KillTask('MyProg.exe');
UnloadDll(ExpandConstant('{app}\ISTask.dll'));
end;
end;

И так: Exec('taskkill', '/f /im MyProg.exe', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);

А также можно ли, чтобы данные в реестр вносились "в самом начале" или же "2 раза" или "по частям". Нужно, чтобы выбранный путь установки (папка назначения), внеслись в реестр ДО завершения установки.

TROY Diamond
11-02-2012, 14:17
Serega

Вы как-то делали "фейковый" индикатор процесса, по типу IE. Есть ли сейчас какие-нибудь варианты и наработки?
Нужна индикация процесса во время установки дополнительного ПО - установка долгая минут 15...
Можете ли Вы "доработать" Ваш индикатор, "под секцию Code", а не "под Run"?


function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';

const
PBM_SETMARQUEE = $040A;
GWL_STYLE = -16;
PBS_MARQUEE = $08;

var
AnimatePb: TNewProgressBar;

procedure CreateAnimatePb;
begin
AnimatePb := TNewProgressBar.Create(WizardForm);
with AnimatePb do
begin
Parent := WizardForm.InstallingPage;
SetBounds(WizardForm.ProgressGauge.Left, WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(-21),
WizardForm.ProgressGauge.Width, WizardForm.ProgressGauge.Height);
SetWindowLong (AnimatePb.Handle, GWL_STYLE, (GetWindowLong (AnimatePb.Handle, GWL_STYLE) or PBS_MARQUEE));
SendMessage(AnimatePb.Handle, PBM_SETMARQUEE, 1, 20);
end;
end;

procedure AnimatePbMsg(const msg: string);
begin
if AnimatePb = nil then
CreateAnimatePb;
WizardForm.FilenameLabel.Caption := msg;
end;

procedure AnimatePbFree;
begin
if AnimatePb <> nil then
begin
AnimatePb.Free;
AnimatePb := nil;
end;
end;

И действительно он НЕ работает на некоторых темах (скорее всего из-за того что они не подписанные/не официальные)... Работает на "стандартной" во всех ОС и на "Классической" - но бегунок двигается намного медленнее...




© OSzone.net 2001-2012