Скрипты Inno Setup. Помощь и советы [часть 5]
-
Gnom_aka_Lexander
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
поэтому я и отказался делать на инно, что очень сложно сделать так, чтоб и в анси и в юникоде работало и сделал в длл-ке.
-
Gnom_aka_Lexander
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
как сделать растяжение wizard small image на деинсталляторе с сокрытием лейбелов и как сделать,чтобы кликабельное лого отображалось в деинсталляторе
вот скрипт на отображение лого в инсталляторе
[Files]
Source: logo.bmp; Flags: dontcopy
вот скрипт на отображение лого в инсталляторе
читать дальше »
[Files]
Source: logo.bmp; Flags: dontcopy
Код: Выделить всё
procedure InitializeWizard;
//Лого
var BtnImage: TBitmapImage;
begin
RedesignWizardForm;
ExtractTemporaryFile('logo.bmp');
BtnImage:= TBitmapImage.Create(WizardForm);
BtnImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\logo.bmp'));
BtnImage.SetBounds(20, 315, 154, 42); {первые 2 параметра - координаты левогого верхнего угла по горизонтали и вертикали, дальше ширина и высота, до которой растянуть}
BtnImage.Parent:= WizardForm;
BtnImage.Stretch:= True;-
Johny777
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
Gnom_aka_Lexander, как системные иконки прикрутить?
можешь пожалуйста подправить код?
меня например замки не устраивают. Но картинки такие маленькие, что ничего лучше не нашёл
на юникоде тестил? У тебя работает?
можешь пожалуйста подправить код?
меня например замки не устраивают. Но картинки такие маленькие, что ничего лучше не нашёл

на юникоде тестил? У тебя работает?
-
El Sanchez
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
Цитата Mailchik:
растяжение wizard small image на деинсталляторе с сокрытием лейбелов
вместо wizard small image на деинсталляторе отображается иконка деинсталлятора
Цитата Mailchik:
кликабельное лого отображалось в деинсталляторе
выдает ошибку
растяжение wizard small image на деинсталляторе с сокрытием лейбелов
Скрипты Inno Setup. Помощь и советы [часть 5]
вместо wizard small image на деинсталляторе отображается иконка деинсталлятора
Цитата Mailchik:
кликабельное лого отображалось в деинсталляторе
Скрипты Inno Setup. Помощь и советы [часть 5]
выдает ошибку
-
ToBeLife
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
Доброго времени суток.
Не хотел отрывать вас от более продвинутых ситуаций, но буду признателен за помощь.
задача такова:
необходимо запустить батник и дождаться его полного выполнения, и только потом начиналась бы основная установка приложения.
или как это реализовать через [Run], что бы первоначально запускался именно батник.
Спасибо
Не хотел отрывать вас от более продвинутых ситуаций, но буду признателен за помощь.
задача такова:
необходимо запустить батник и дождаться его полного выполнения, и только потом начиналась бы основная установка приложения.
или как это реализовать через [Run], что бы первоначально запускался именно батник.
Спасибо
-
R.i.m.s.k.y.
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
Цитата Mailchik:
Так я же не знаю какой файл у вас в bitmap. Я лишь пример дал, как сделать то, что вы просите.
у меня формат .bmp
Цитата Mailchik:
Нужна расширенная версия от restools. Попробуйте
у меня как раз и стоит inno setup ultra full ver. Обновлено 2 Октября 2012г
Цитата habib2302:
кликабельное лого отображалось в деинсталляторе
скрипт на лого заработало!!!
Так я же не знаю какой файл у вас в bitmap. Я лишь пример дал, как сделать то, что вы просите.
Скрипты Inno Setup. Помощь и советы [часть 5]
у меня формат .bmp
Цитата Mailchik:
Нужна расширенная версия от restools. Попробуйте
Inno Ultra
Скрипты Inno Setup. Помощь и советы [часть 5]
у меня как раз и стоит inno setup ultra full ver. Обновлено 2 Октября 2012г
Цитата habib2302:
кликабельное лого отображалось в деинсталляторе
Скрипты Inno Setup. Помощь и советы [часть 5]
скрипт на лого заработало!!!
-
ToBeLife
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
Цитата Johny777:
Скажите пожалуйста чем можно заменить указатель в той или иной функции.
Пример: функция
Чем заменить:Целочисленной переменной типа Integer, Longint, Cardinal, DWORD - CreateFile(..., lpSecurityAttributes: Longint, ...): BOOL;Переменной типа, на которую указывает указатель - CreateFile(..., lpSecurityAttributes: SECURITY_ATTRIBUTES, ...): BOOL; Имеет смысл, если нужно заполнять самому структуру нужными данными. В функцию передается не указатель, а переменная lpSecurityAttributes, точнее ссылка на объект структурного типа SECURITY_ATTRIBUTES. Т.к. ссылки основаны на указателях, передача ссылки вместо указателя не ошибка.P.S. Иногда при описании параметра какой-либо функции встречается запись "A pointer to a buffer...". В таком случае нужно использовать символьный (реже - байтовый) массив определенного размера (может указываться при описании параметров функции или вычисляться непосредственно при отработке функции).
Johny777, без остановок, пауз, с отменой операции, тупо копирование:
Код:
Скажите пожалуйста чем можно заменить указатель в той или иной функции.
Скрипты Inno Setup. Помощь и советы [часть 5]
Пример: функция
CreateFile
параметр lpSecurityAttributes (описание: A pointer to a SECURITY_ATTRIBUTES structure...)Чем заменить:Целочисленной переменной типа Integer, Longint, Cardinal, DWORD - CreateFile(..., lpSecurityAttributes: Longint, ...): BOOL;Переменной типа, на которую указывает указатель - CreateFile(..., lpSecurityAttributes: SECURITY_ATTRIBUTES, ...): BOOL; Имеет смысл, если нужно заполнять самому структуру нужными данными. В функцию передается не указатель, а переменная lpSecurityAttributes, точнее ссылка на объект структурного типа SECURITY_ATTRIBUTES. Т.к. ссылки основаны на указателях, передача ссылки вместо указателя не ошибка.P.S. Иногда при описании параметра какой-либо функции встречается запись "A pointer to a buffer...". В таком случае нужно использовать символьный (реже - байтовый) массив определенного размера (может указываться при описании параметров функции или вычисляться непосредственно при отработке функции).
Johny777, без остановок, пауз, с отменой операции, тупо копирование:
читать дальше »
Код:
Код: Выделить всё
[code]
#define A = (Defined UNICODE) ? "W" : "A"
const
PROGRESS_CONTINUE = 0;
PROGRESS_CANCEL = 1;
CALLBACK_CHUNK_FINISHED = $0;
var
ProgressPage: TOutputProgressWizardPage;
CancelButton: TButton;
bCancel: BOOL;
function CopyFileEx(lpExistingFileName, lpNewFileName: String; lpProgressRoutine, lpData: Longint; var pbCancel: BOOL; dwCopyFlags: DWORD): BOOL; external 'CopyFileEx{#A}@kernel32.dll stdcall';
function PathIsDirectory(pszPath: String): BOOL; external 'PathIsDirectory{#A}@shlwapi.dll stdcall';
/////////////////////////////////////////////////////////////
function Size64(LowPart: Longint; HighPart: DWORD): Extended;
begin
Result := (HighPart + integer(LowPart < 0))*4.294967296E9 + LowPart;
end;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function CopyProgressRoutine(TotalFileSizeLo, TotalFileSizeHi, TotalBytesTransferredLo, TotalBytesTransferredHi, StreamSizeLo, StreamSizeHi, StreamBytesTransferredLo, StreamBytesTransferredHi: Longint; dwStreamNumber, dwCallbackReason: DWORD; hSourceFile, hDestinationFile: THandle; lpData: Longint): DWORD;
begin
if bCancel then Result := PROGRESS_CANCEL else Result := PROGRESS_CONTINUE;
case dwCallbackReason of
CALLBACK_CHUNK_FINISHED: begin
ProgressPage.SetText(Format('%s: %s', ['Файл', CastIntegerToString(lpData)]), Format('%s: %d %%', ['Прогресс', Round(100*Size64(TotalBytesTransferredLo, TotalBytesTransferredHi)/Size64(TotalFileSizeLo, TotalFileSizeHi))]));
ProgressPage.SetProgress(Round(100*Size64(TotalBytesTransferredLo, TotalBytesTransferredHi)/Size64(TotalFileSizeLo, TotalFileSizeHi)), 100);
end;
end;
end;
///////////////////////////////////////////////
procedure CancelButtonOnClick(Sender: TObject);
begin
bCancel := True;
end;
/////////////////////////////////
procedure CreateCopyProgressPage;
begin
ProgressPage := CreateOutputProgressPage('Копирование файлов', '');
CancelButton := TButton.Create(ProgressPage);
with CancelButton do
begin
Parent := ProgressPage.Surface;
SetBounds(ProgressPage.ProgressBar.Width - WizardForm.CancelButton.Width, ProgressPage.ProgressBar.Top + ProgressPage.ProgressBar.Height + ScaleY(10), WizardForm.CancelButton.Width, WizardForm.CancelButton.Height);
Caption := SetupMessage(msgButtonCancel);
OnClick := @CancelButtonOnClick;
end;
end;
///////////////////////////////////////////////////////////////////////////////////////////////////////
function FindFiles(const pFrom, pTo: String; const Recurse: Boolean; const szRootDir: String): Integer;
var
FR: TFindRec;
szFileName: String;
begin
if FindFirst(pFrom, FR) then
try
repeat
if (FR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0) then
begin
if not DirExists(Format('%s\%s', [pTo, ExtractRelativePath(szRootDir, ExtractFilePath(pFrom))])) then ForceDirectories(Format('%s\%s', [pTo, ExtractRelativePath(szRootDir, ExtractFilePath(pFrom))]));
szFileName := MinimizePathName(Format('%s\%s', [ExtractFileDir(pFrom), FR.Name]), WizardForm.Font, WizardForm.OuterNotebook.ClientWidth - ScaleX(50));
CopyFileEx(Format('%s\%s', [ExtractFileDir(pFrom), FR.Name]), Format('%s\%s\%s', [pTo, ExtractRelativePath(szRootDir, ExtractFilePath(pFrom)), FR.Name]), CallbackAddr('CopyProgressRoutine'), CastStringToInteger(szFileName), bCancel, 0);
Result := DLLGetLastError;
if bCancel then Exit;
end;
until not FindNext(FR);
finally
FindClose(FR);
end;
//
if not Recurse then Exit;
if FindFirst(Format('%s\*', [ExtractFileDir(pFrom)]), FR) then
try
repeat
if (FR.Attributes and FILE_ATTRIBUTE_DIRECTORY 0) and (FR.Name '.') and (FR.Name '..') then
FindFiles(Format('%s\%s\%s', [ExtractFileDir(pFrom), FR.Name, ExtractFileName(pFrom)]), pTo, Recurse, szRootDir);
until not FindNext(FR);
finally
FindClose(FR);
end;
end;
//////////////////////////////////////////////////////////////////////////
function xcopy(const pFrom, pTo: String; const Recurse: Boolean): Integer;
// pFrom - source path. wildcard allowed
// pTo - destination path
// Recurse - recursion flag
begin
if PathIsDirectory(pFrom) then
begin
if not DirExists(pFrom) then Exit;
pFrom := Format('%s\*', [pFrom]);
end else if not DirExists(ExtractFileDir(pFrom)) then Exit;
Result := FindFiles(pFrom, pTo, Recurse, ExtractFilePath(pFrom));
end;
/////////////////////////////
procedure InitializeWizard();
begin
CreateCopyProgressPage;
end;
//////////////////////////////////////////////////////
function NextButtonClick(CurPageID: Integer): Boolean;
begin
if CurPageID = wpWelcome then
begin
ProgressPage.Show;
xcopy('c:\Temp', 'd:\test', True);
//xcopy('c:\temp\te st\*.dll', 'd:\test', True);
//xcopy('c:\Temp\ffc\FileFormatConverters.7z', 'c:\Temp\FileFormatConverters.7z', False);
//xcopy('c:\temp\t est\123', 'c:\temp\t est\1234', True);
ProgressPage.Hide;
Result := True;
end;
Result := True;
end;-
ToBeLife
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
El Sanchez, спасибо, кажись догоняю:
Если значение/значения из переменной, на которую указывает указатель не нужно можно заменять в функциях/процедурах указатели на целочисленные Integer, Longint, Cardinal, DWORD... чтоб компилятор не ругался на неизвестный тип. Это делается когда из переменной или из переменной ссылающейся на структурный тип, на которую указывает указатель брать ничего не нужно
Если значение/значения нужно, то:
- если указатель на какую-то простую переменную (например type PInteger = ^Integer - указатель на целое число), то в заголовке функции можно заменить PInteger на Integer. Например:
function GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer: String; nVolumeNameSize, lpVolumeSerialNumber: PDWORD(меняем на DWORD); var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
- если указатель на переменную структуры (var MyVariable :SECURITY_ATTRIBUTES), то нужно описать SECURITY_ATTRIBUTES в разделе type и присвоить этот тип соответствующим переменным (в заголовке ф-ции и в разделе var)
короче суть в том что указатель можно заменить на переменную,
если указатель на буфер то методом проб и ошибок подставляем array [0..число] of Char или array [0..число] of Byte
Цитата El Sanchez:
без остановок, пауз, тупо копирование
Спасибо!
Если значение/значения из переменной, на которую указывает указатель не нужно можно заменять в функциях/процедурах указатели на целочисленные Integer, Longint, Cardinal, DWORD... чтоб компилятор не ругался на неизвестный тип. Это делается когда из переменной или из переменной ссылающейся на структурный тип, на которую указывает указатель брать ничего не нужно
Если значение/значения нужно, то:
- если указатель на какую-то простую переменную (например type PInteger = ^Integer - указатель на целое число), то в заголовке функции можно заменить PInteger на Integer. Например:
function GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer: String; nVolumeNameSize, lpVolumeSerialNumber: PDWORD(меняем на DWORD); var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
- если указатель на переменную структуры (var MyVariable :SECURITY_ATTRIBUTES), то нужно описать SECURITY_ATTRIBUTES в разделе type и присвоить этот тип соответствующим переменным (в заголовке ф-ции и в разделе var)
короче суть в том что указатель можно заменить на переменную,
если указатель на буфер то методом проб и ошибок подставляем array [0..число] of Char или array [0..число] of Byte
Цитата El Sanchez:
без остановок, пауз, тупо копирование
Скрипты Inno Setup. Помощь и советы [часть 5]
Спасибо!

-
Johny777
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
pritoreanic,
Код:
читать дальше »
Код:
Код: Выделить всё
[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
DirExistsWarning=no
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[CustomMessages]
russian.ComponentsDescription0=Наведите курсор мыши на компонент, чтобы прочитать его описание.
russian.ComponentsDescription1=необходимо запустить батник и дождаться его полного выполнения, и только потом начиналась бы основная установка приложения. или как это реализовать через [Run], что бы первоначально запускался именно батник. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе.
russian.ComponentsDescription2=В справке читай installation order, RUN выполняется самой последней секцией.
russian.ComponentsDescription3=Но вообще если батник мелкий лучше его в код инно перенести, а то может быть нестыковка, инно работает в кодировке СР1251, а батник - СР866. Привет ДОСу
russian.ComponentsDescription4=Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе.
[Components]
Name: a; Description: 1;
Name: b; Description: 2;
Name: c\1; Description: 3;
Name: c\2; Description: 4;
[code]
var
DescRTV: TRichEditViewer;
procedure ComponentsListOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
DescRTV.Text := CustomMessage('ComponentsDescription' + IntToStr(Index+1));
end;
procedure InitializeWizard;
begin
WizardForm.ComponentsList.Width := ScaleX(209);
WizardForm.ComponentsList.OnItemMouseMove := @ComponentsListOnItemMouseMove;
DescRTV := TRichEditViewer.Create(nil)
with DescRTV do
begin
SetBounds(ScaleX(216), WizardForm.ComponentsList.Top, ScaleX(201), WizardForm.ComponentsList.Height);
Parent := WizardForm.SelectComponentsPage;
ReadOnly := True;
ScrollBars := ssVertical;
end;
end;-
JHeavy
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
R.i.m.s.k.y., по умолчанию ты инсталл без прав админа не запустишь, а чтобы отключить нужно настраивать директиву секции [Setup] PrivilegesRequired=не админ
если запускаешь не как админ, то получаешь вот такое окно от винды
Цитата R.i.m.s.k.y.:
запускать из установщика экзешники с такими же правами
через встроенную функцию
function ExecAsOriginalUser(const Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ResultCode: Integer): Boolean;
хотя уверен достаточно и обычных
function Exec(const Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ResultCode: Integer): Boolean;
function ShellExec(const Verb, Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ErrorCode: Integer): Boolean;
или секции [RUN]
ведь если инсталл запущен и работает, то мы уже зашли под админом и по дефолту запускается все с его правами
если запускаешь не как админ, то получаешь вот такое окно от винды
читать дальше »
Цитата R.i.m.s.k.y.:
запускать из установщика экзешники с такими же правами
Скрипты Inno Setup. Помощь и советы [часть 5]
через встроенную функцию
function ExecAsOriginalUser(const Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ResultCode: Integer): Boolean;
хотя уверен достаточно и обычных
function Exec(const Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ResultCode: Integer): Boolean;
function ShellExec(const Verb, Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ErrorCode: Integer): Boolean;
или секции [RUN]
ведь если инсталл запущен и работает, то мы уже зашли под админом и по дефолту запускается все с его правами