Скрипты Inno Setup. Помощь и советы [часть 5]

Ответить
 • Просмотры: 38
Аватара пользователя
Gnom_aka_Lexander

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Gnom_aka_Lexander »

поэтому я и отказался делать на инно, что очень сложно сделать так, чтоб и в анси и в юникоде работало и сделал в длл-ке.
Аватара пользователя
Gnom_aka_Lexander

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Gnom_aka_Lexander »

как сделать растяжение wizard small image на деинсталляторе с сокрытием лейбелов и как сделать,чтобы кликабельное лого отображалось в деинсталляторе

вот скрипт на отображение лого в инсталляторе




читать дальше »






[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]

Сообщение Johny777 »

Gnom_aka_Lexander, как системные иконки прикрутить?

можешь пожалуйста подправить код?

меня например замки не устраивают. Но картинки такие маленькие, что ничего лучше не нашёл Изображение

на юникоде тестил? У тебя работает?
Аватара пользователя
El Sanchez

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение El Sanchez »

Цитата Mailchik:



растяжение wizard small image на деинсталляторе с сокрытием лейбелов
Скрипты Inno Setup. Помощь и советы [часть 5]




вместо wizard small image на деинсталляторе отображается иконка деинсталлятора




Цитата Mailchik:



кликабельное лого отображалось в деинсталляторе
Скрипты Inno Setup. Помощь и советы [часть 5]




выдает ошибку

Аватара пользователя
ToBeLife

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение ToBeLife »

Доброго времени суток.

Не хотел отрывать вас от более продвинутых ситуаций, но буду признателен за помощь.



задача такова:

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

или как это реализовать через [Run], что бы первоначально запускался именно батник.



Спасибо
Аватара пользователя
R.i.m.s.k.y.

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение R.i.m.s.k.y. »

Цитата Mailchik:



Так я же не знаю какой файл у вас в 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]

Сообщение ToBeLife »

Цитата 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]

Сообщение ToBeLife »

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]

Сообщение Johny777 »

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]

Сообщение JHeavy »

R.i.m.s.k.y., по умолчанию ты инсталл без прав админа не запустишь, а чтобы отключить нужно настраивать директиву секции [Setup] PrivilegesRequired=не админ

если запускаешь не как админ, то получаешь вот такое окно от винды


читать дальше »







Цитата 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]

ведь если инсталл запущен и работает, то мы уже зашли под админом и по дефолту запускается все с его правами
Ответить

Вернуться в «Автоматическая установка приложений»