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

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

Автор: chelobey
Дата сообщения: 31.12.2008 12:03
Может быть дед мороз или какой другой "дед" коддинга одарит решением моей проблемы .

С новым годом.
Автор: Diawer
Дата сообщения: 31.12.2008 18:46
Всех с Новым 2009 годом!
Автор: JuNoS
Дата сообщения: 01.01.2009 19:38
Мне нужен скрипт: вверх как в NSIS. Помогите найти...
И еще как установить службу виндовс, пробывал с реестром но не получилось.
Автор: Don_Juan
Дата сообщения: 01.01.2009 22:37
SotM

http://forum.ru-board.com/topic.cgi?forum=5&topic=29117&start=21&limit=1&m=1#1

А можно в этом коде ввода ключа сделать прозрачными ячейки. А вставил картинку на задний план и надо сделать прозрачными ячейки. Сможешь помочь? Или может быть, кто еще сможет?
Автор: ZONE51
Дата сообщения: 02.01.2009 17:45
Народ всех с Новым годом. Скажите пожалуйста как в шттщ ыуегз можно принцдительно программно прекратить установку и откатить предыдущие действия? То есть идет проверка если офис установлен то все хорошо иначе все пракратить. Заранее спасибо
Автор: sanmon
Дата сообщения: 03.01.2009 00:58
Всех inno-гуру и inno-чайников с Новым годом!
Подскажите, кто знает, как все-таки срастить inno и precomp. Уточняю вопрос: распаковывается пережатый precomp файл, тут же запускается precomp, происходит рекомпрессия файла, первоначальный прекомповский файл за ненадобностью удаляется, inno распаковывает следующий файл - алгоритм повторяется. Как все это физически воплотить? Уверен, что это возможно, но кодинга, увы не знаю, с Inno знаком достаточно поверхностно, буду очень благодарен за ответ (и не я один!)

P.S. Может замудрил с вопросом, спрошу проще - как во время инсталляции останавливать inno (во время копирования файлов на винт), запускать некую программу и после снова продолжать работу inno?
Автор: valeron87
Дата сообщения: 03.01.2009 16:34
sanmon
Можно организовать. Только для примера приведенного ниже необходимо названия "прекомпрессированных" файлов привести к виду "имя_файла.расширение.pcf"
[more]
[no]
[Files]
Source: "precomp\*"; DestDir: "{tmp}"; Flags: ignoreversion overwritereadonly
Source: "Data\*"; DestDir: "{app}"; Flags: overwritereadonly recursesubdirs ignoreversion createallsubdirs sortfilesbyextension; AfterInstall: RecompressPCF

[Code]
procedure RecompressPCF;
var
Tmp, Text,
InputFile, OutputFile: string;
n, ResultCode: Integer;
begin
if ExtractFileExt(CurrentFileName)='.pcf' then
begin
InputFile:=ExpandConstant(CurrentFileName);
n:=Length(InputFile);
while InputFile[n]<>'.' do
n:=n-1;
OutputFile:=Copy(InputFile, 1, n-1);
Text:=WizardForm.StatusLabel.Caption;
WizardForm.StatusLabel.Caption:='Рекомпрессия извлеченного файла...';
WizardForm.FileNameLabel.Caption:=OutputFile;
Tmp:=ExpandConstant('{tmp}\');
Exec(Tmp+'precomp.exe', '-d -o"'+OutputFile+'" "'+InputFile+'"', Tmp, SW_HIDE, ewWaitUntilTerminated, ResultCode);
DeleteFile(InputFile);
WizardForm.StatusLabel.Caption:=Text;
end;
end;[/more]
Автор: sanmon
Дата сообщения: 03.01.2009 18:02
valeron87, СПАСИБО БОЛЬШОЕ-ПРЕБОЛЬШОЕ! Буду равзбираться! А откуда знания почерпнуть по кодингу в Inno, если не секрет?
Автор: Artem_Butenko
Дата сообщения: 04.01.2009 05:43
Ребята, в последнее время стала очень актуальна тема создания портабельных версий приложений. Задача такова: создать на Inno Setup инсталлятор для запуска портабельных приложений. Казалось бы, задача тривиальная, но как быть если программа регистрируется в системном реестре? Ведь после закрытия программы желательно автоматически удалить с HDD не только ее файлы, но и данные о регистрации. В идеале "инсталлятор" портабельных программ должен удовлетворять следующим условиям: 1) запускаться в "тихом" режиме, копируя файлы программы во временный каталог; 2) после копирования файлов вносить данные о регистрации в системный реестр; 3) не закрываясь (находясь в процессах) запускать исполнительный файл портабельной программы; 4) дожидаться окончания работы исполнительного файла портабельной программы, и автоматически удалять все ее файлы с HDD и данные регистрации из системного реестра. Пункты 1 и 2 нареканий не вызывают, а вот как реализовать алгоритм описанный в пунктах 3 и 4 (средствами Inno Setup) я честно не знаю! Если у Вас есть время и желание, пожалуйста, помогите разобраться в этом вопросе.
Автор: paul_smART
Дата сообщения: 04.01.2009 07:38
Artem_Butenko
приветствую
ей богу - нет необходимости дважды выдумывать велосипед
так как портабл проги обычно хрянят в себе все необходимое для запуска
на то они и портабл-версии... т.е. при создании портабл версии делается
два снэпшота системы "до" установки и "после" разница собирается в чемодан-ехе портабл-версии и при запуске системе "подсовывается все необходимое"
проверено так что не нужно велик думать када есть мопед
другое дело если инсталлер сделать для портабл - так тут все более чем тривиально
ярлыки прописать на десктоп да папку назначения указать
надеюсь пояснил доходчиво... с уважением :о)
Автор: Artem_Butenko
Дата сообщения: 04.01.2009 12:41
paul_smART -- смысл в выше описанных действиях есть. Такое обычно реализуют в NSIS, а вот за Inno Setup, как-то обидно. Еще раз очень прошу, пожалуйста, помогите реализовать пункты 3 и 4. Если Вы знаете, как реализовать подобное, буду очень признателен за Вашу помощь!
Автор: support_star
Дата сообщения: 04.01.2009 14:50
А как изменить цвет заголовка активного окна инсталятора. В поиске не удалось найти, может в документации где об этом написано? В любом случае буду благодарен за ответ в посте.
Автор: JuNoS
Дата сообщения: 04.01.2009 17:59
Мне нужен скрипт: вверх как в NSIS. Помогите найти...
И еще как установить службу виндовс, пробывал с реестром но не получилось.
Автор: RaP1D
Дата сообщения: 04.01.2009 19:36
Помогите сделать такую простую весч:
- Путь указывался исходя из ветки реестра.

К примеру, есть HKLM\Software\Myapp, а в ней string Path, содержащий путь D:\App.
Следовательно, при запуске инсталятора директория по умолчанию ставилась D:\App...

И еще, как сделать, чтоб, допустим, если нет того ключа реестра высвечивало Программа не установлена... и инсталятор вырубался.

P.S. : вышеописанное я встречал пару раз в патчах к играм (допустим Stalker), но при декомпиляции в скриптах ничего не обнаружил...
Автор: JuNoS
Дата сообщения: 04.01.2009 20:43
Вот! Если в реестре нет то берется
DefaultDirName={reg:HKLM\Software\Myapp,Path|{pf}\default_dir_name}
Автор: Artem_Butenko
Дата сообщения: 04.01.2009 22:39
Уважаемые ценители Inno Setup, я все с той же сумашедшей идеей создания оболочки для временной установки портабельных программ. Появились новые идеи. Постараюсь описать их подробнее: а) инсталлятор работая в абсолютно "тихом" режиме, копирует файлы программы во временный каталог; б) после того, как все файлы пакета будут распакованы, инсталлятор (не закрываясь) последовательно запускает файлы Install.reg, затем Startup.exe, и дожидается пока пользователь сам закроет запущенный файл Startup.exe (главный исполнительный файл портабельной программы); в) после этого, инсталлятор должен запустить файл Uninstall.reg и удалить все файлы портабельной программы из временного каталога. Как я понимаю способ временной регистрации программы через секцию [Registry] невозможен. Единственный вариант - это запуск файлов Install.reg и Uninstall.reg. Другой вопрос в том, как "защитить" тихий инсталл от комбинации Alt+Tab, чтобы при случайном нажатии окно "тихого" инсталла не отображалось на панели задач?
Автор: Dermuin
Дата сообщения: 04.01.2009 23:11
Хотел переделать скин Blue из коллекции скриптов но не получилось, подскажите как сделать фон у текста прозрачным.

Автор: LordVeider
Дата сообщения: 05.01.2009 01:05

Цитата:
как сделать, чтоб, допустим, если нет того ключа реестра высвечивало Программа не установлена... и инсталятор вырубался

Код: [code]
function InitializeSetup(): Boolean;
begin
if not RegValueExists(HKLM, 'SOFTWARE\имя_ветки', 'имя_параметра')
then
begin
MsgBox('Путь установки не обнаружен. Установка невозможна.', mbError, mb_Ok);
Exit;
end;
end;
Автор: Victor_Dobrov
Дата сообщения: 05.01.2009 01:38
JuNoS

Цитата:
Мне нужен скрипт: вверх как в NSIS.

Вот архив NSIS_ImageHeader в комплекте с неплохой картинкой.
При установленном NSIS другие файлы можно взять здесь - С:\Program Files\NSIS\Contrib\Graphics\Header

Цитата:
как установить службу виндовс, пробывал с реестром но не получилось.

Скрипт из [more=IS Extensions Knowledge Base.]
[Setup]
AppName=ServiceTools
AppVerName=ServiceTools
CreateAppDir=false

[_ISTool]
EnableISX=true

[Code]
type
    SERVICE_STATUS = record
    dwServiceType                : cardinal;
    dwCurrentState                : cardinal;
    dwControlsAccepted            : cardinal;
    dwWin32ExitCode                : cardinal;
    dwServiceSpecificExitCode    : cardinal;
    dwCheckPoint                : cardinal;
    dwWaitHint                    : cardinal;
    end;
    HANDLE = cardinal;

const
    SERVICE_QUERY_CONFIG        = $1;
    SERVICE_CHANGE_CONFIG        = $2;
    SERVICE_QUERY_STATUS        = $4;
    SERVICE_START                = $10;
    SERVICE_STOP                = $20;
    SERVICE_ALL_ACCESS            = $f01ff;
    SC_MANAGER_ALL_ACCESS        = $f003f;
    SERVICE_WIN32_OWN_PROCESS    = $10;
    SERVICE_WIN32_SHARE_PROCESS    = $20;
    SERVICE_WIN32                = $30;
    SERVICE_INTERACTIVE_PROCESS = $100;
    SERVICE_BOOT_START = $0;
    SERVICE_SYSTEM_START = $1;
    SERVICE_AUTO_START = $2;
    SERVICE_DEMAND_START = $3;
    SERVICE_DISABLED = $4;
    SERVICE_DELETE = $10000;
    SERVICE_CONTROL_STOP        = $1;
    SERVICE_CONTROL_PAUSE        = $2;
    SERVICE_CONTROL_CONTINUE    = $3;
    SERVICE_CONTROL_INTERROGATE = $4;
    SERVICE_STOPPED                = $1;
    SERVICE_START_PENDING = $2;
    SERVICE_STOP_PENDING = $3;
    SERVICE_RUNNING = $4;
    SERVICE_CONTINUE_PENDING = $5;
    SERVICE_PAUSE_PENDING = $6;
    SERVICE_PAUSED = $7;

// #######################################################################################
// nt based service utilities
// #######################################################################################
function OpenSCManager(lpMachineName, lpDatabaseName: string; dwDesiredAccess :cardinal): HANDLE; external 'OpenSCManagerA@advapi32.dll stdcall';
function OpenService(hSCManager :HANDLE;lpServiceName: string; dwDesiredAccess :cardinal): HANDLE; external 'OpenServiceA@advapi32.dll stdcall';
function CloseServiceHandle(hSCObject :HANDLE): boolean; external 'CloseServiceHandle@advapi32.dll stdcall';
function CreateService(hSCManager :HANDLE;lpServiceName, lpDisplayName: string;dwDesiredAccess,dwServiceType,dwStartType,dwErrorControl: cardinal;lpBinaryPathName,lpLoadOrderGroup: String; lpdwTagId : cardinal;lpDependencies,lpServiceStartName,lpPassword :string): cardinal; external 'CreateServiceA@advapi32.dll stdcall';
function DeleteService(hService :HANDLE): boolean; external 'DeleteService@advapi32.dll stdcall';
function StartNTService(hService :HANDLE;dwNumServiceArgs : cardinal;lpServiceArgVectors : cardinal) : boolean; external 'StartServiceA@advapi32.dll stdcall';
function ControlService(hService :HANDLE; dwControl :cardinal;var ServiceStatus :SERVICE_STATUS) : boolean; external 'ControlService@advapi32.dll stdcall';
function QueryServiceStatus(hService :HANDLE;var ServiceStatus :SERVICE_STATUS) : boolean; external 'QueryServiceStatus@advapi32.dll stdcall';
function QueryServiceStatusEx(hService :HANDLE;ServiceStatus :SERVICE_STATUS) : boolean; external 'QueryServiceStatus@advapi32.dll stdcall';

function OpenServiceManager() : HANDLE;
begin
    if UsingWinNT() = true then begin
        Result := OpenSCManager('','ServicesActive',SC_MANAGER_ALL_ACCESS);
        if Result = 0 then
            MsgBox('the servicemanager is not available', mbError, MB_OK)
    end
    else begin
            MsgBox('only nt based systems support services', mbError, MB_OK)
            Result := 0;
    end
end;

function IsServiceInstalled(ServiceName: string) : boolean;
var
    hSCM    : HANDLE;
    hService: HANDLE;
begin
    hSCM := OpenServiceManager();
    Result := false;
    if hSCM <> 0 then begin
        hService := OpenService(hSCM,ServiceName,SERVICE_QUERY_CONFIG);
if hService <> 0 then begin
Result := true;
CloseServiceHandle(hService)
        end;
CloseServiceHandle(hSCM)
    end
end;

function InstallService(FileName, ServiceName, DisplayName, Description : string;ServiceType,StartType :cardinal) : boolean;
var
    hSCM    : HANDLE;
    hService: HANDLE;
begin
    hSCM := OpenServiceManager();
    Result := false;
    if hSCM <> 0 then begin
        hService := CreateService(hSCM,ServiceName,DisplayName,SERVICE_ALL_ACCESS,ServiceType,StartType,0,FileName,'',0,'','','');
        if hService <> 0 then begin
            Result := true;
            // Win2K & WinXP supports aditional description text for services
            if Description<> '' then
                RegWriteStringValue(HKLM,'System\CurrentControlSet\Services' + ServiceName,'Description',Description);
            CloseServiceHandle(hService)
        end;
CloseServiceHandle(hSCM)
    end
end;

function RemoveService(ServiceName: string) : boolean;
var
    hSCM    : HANDLE;
    hService: HANDLE;
begin
    hSCM := OpenServiceManager();
    Result := false;
    if hSCM <> 0 then begin
        hService := OpenService(hSCM,ServiceName,SERVICE_DELETE);
if hService <> 0 then begin
Result := DeleteService(hService);
CloseServiceHandle(hService)
        end;
CloseServiceHandle(hSCM)
    end
end;

function StartService(ServiceName: string) : boolean;
var
    hSCM    : HANDLE;
    hService: HANDLE;
begin
    hSCM := OpenServiceManager();
    Result := false;
    if hSCM <> 0 then begin
        hService := OpenService(hSCM,ServiceName,SERVICE_START);
if hService <> 0 then begin
    Result := StartNTService(hService,0,0);
CloseServiceHandle(hService)
        end;
CloseServiceHandle(hSCM)
    end;
end;

function StopService(ServiceName: string) : boolean;
var
    hSCM    : HANDLE;
    hService: HANDLE;
    Status    : SERVICE_STATUS;
begin
    hSCM := OpenServiceManager();
    Result := false;
    if hSCM <> 0 then begin
        hService := OpenService(hSCM,ServiceName,SERVICE_STOP);
if hService <> 0 then begin
    Result := ControlService(hService,SERVICE_CONTROL_STOP,Status);
CloseServiceHandle(hService)
        end;
CloseServiceHandle(hSCM)
    end;
end;

function IsServiceRunning(ServiceName: string) : boolean;
var
    hSCM    : HANDLE;
    hService: HANDLE;
    Status    : SERVICE_STATUS;
begin
    hSCM := OpenServiceManager();
    Result := false;
    if hSCM <> 0 then begin
        hService := OpenService(hSCM,ServiceName,SERVICE_QUERY_STATUS);
    if hService <> 0 then begin
            if QueryServiceStatus(hService,Status) then begin
                Result :=(Status.dwCurrentState = SERVICE_RUNNING)
    end;
CloseServiceHandle(hService)
         end;
CloseServiceHandle(hSCM)
    end
end;

// #######################################################################################
// create an entry in the services file
// #######################################################################################
function SetupService(service, port, comment: string) : boolean;
var
    filename    : string;
    s            : string;
    lines        : TArrayOfString;
    n            : longint;
    i            : longint;
    errcode        : integer;
    servnamlen    : integer;
    error        : boolean;
begin
    if UsingWinNT() = true then
        filename := ExpandConstant('{sys}\drivers\etc\services')
    else
        filename := ExpandConstant('{win}\services');

    if LoadStringsFromFile(filename,lines) = true then begin
        Result        := true;
        n            := GetArrayLength(lines) - 1;
        servnamlen    := Length(service);
        error        := false;

        for i:=0 to n do begin
            if Copy(lines[i],1,1) <> '#' then begin
                s := Copy(lines[i],1,servnamlen);
                if CompareText(s,service) = 0 then
                    exit; // found service-entry

                if Pos(port,lines[i]) > 0 then begin
                    error := true;
                    lines[i] := '#' + lines[i] + ' # disabled because collision with ' + service + ' service';
                end;
            end
            else if CompareText(Copy(lines[i],2,servnamlen),service) = 0 then begin
                // service-entry was disabled
                Delete(lines[i],1,1);
                Result := SaveStringsToFile(filename,lines,false);
                exit;
            end;
        end;

        if error = true then begin
            // save disabled entries
            if SaveStringsToFile(filename,lines,false) = false then begin
                Result := false;
                exit;
            end;
        end;

        // create new service entry
        s := service + ' ' + port + ' # ' + comment + #13#10;
        if SaveStringToFile(filename,s,true) = false then begin
            Result := false;
            exit;
        end;

        if error = true then begin
            MsgBox('the ' + service + ' port was already used. The old service is disabled now. You should check the services file manually now.',mbInformation,MB_OK);
            Exec('notepad.exe',filename,GetCurrentDir(),SW_SHOWNORMAL,ewNoWait,errcode);
        end;
    end
    else
        Result := false;
end;

// #######################################################################################
// version functions
// #######################################################################################
function CheckVersion(Filename : string;hh,hl,lh,ll : integer) : boolean;
var
    VersionMS    : cardinal;
    VersionLS    : cardinal;
    CheckMS        : cardinal;
    CheckLS        : cardinal;
begin
    if GetVersionNumbers(Filename,VersionMS,VersionLS) = false then
        Result := false
    else begin
        CheckMS := (hh shl $10) or hl;
        CheckLS := (lh shl $10) or ll;
        Result := (VersionMS > CheckMS) or ((VersionMS = CheckMS) and (VersionLS >= CheckLS));
    end;
end;

// Some examples for version checking
function NeedShellFolderUpdate() : boolean;
begin
    Result := CheckVersion('ShFolder.dll',5,50,4027,300) = false;
end;

function NeedVCRedistUpdate() : boolean;
begin
    Result := (CheckVersion('mfc42.dll',6,0,8665,0) = false)
        or (CheckVersion('msvcrt.dll',6,0,8797,0) = false)
        or (CheckVersion('comctl32.dll',5,80,2614,3600) = false);
end;

function NeedHTMLHelpUpdate() : boolean;
begin
    Result := CheckVersion('hh.exe',4,72,0,0) = false;
end;

function NeedWinsockUpdate() : boolean;
begin
    Result := (UsingWinNT() = false) and (CheckVersion('mswsock.dll',4,10,0,1656) = false);
end;

function NeedDCOMUpdate() : boolean;
begin
    Result := (UsingWinNT() = false) and (CheckVersion('oleaut32.dll',2,30,0,0) = false);
end;

// function IsServiceInstalled(ServiceName: string) : boolean;
// function IsServiceRunning(ServiceName: string) : boolean;
// function InstallService(FileName, ServiceName, DisplayName, Description : string;ServiceType,StartType :cardinal) : boolean;
// function RemoveService(ServiceName: string) : boolean;
// function StartService(ServiceName: string) : boolean;
// function StopService(ServiceName: string) : boolean;

// function SetupService(service, port, comment: string) : boolean;
// function CheckVersion(Filename : string;hh,hl,lh,ll : integer) : boolean;


function InitializeSetup(): boolean;
begin
    if IsServiceInstalled('myservice') = false then begin
        if InstallService('c:\winnt\system32\myservice.exe','myservice','my service','my service is doing usefull things',SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START) = true then begin
            StartService('myservice');
            StopService('myservice');
            // after stopping a service you should wait some seconds before removing
            RemoveService('myservice');
            // otherwise removing can fail
        end
    end
    else if IsServiceRunning('myservice') then
        MsgBox('myservice is running',mbInformation, MB_OK);

    Result := false
end;[/more] Возможности: создание, удаление, проверка, запуск и остановка служб.

Artem_Butenko

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

Я допускаю, что приложив немалые усилия, в урезанном паскале Inno можно сделать очень многое, но всё же тебе стоит переключиться на программы, специально предназначенные для создания портабельных приложений. Например, VMware ThinApp.
Автор: san007
Дата сообщения: 05.01.2009 01:50
Подскажите пожалуйста код для того, чтобы инстал проверял букву диска с установленной виндой и ставил прогу только если системным диском является С.
В противном же случае чтобы выдавало окошко типа "У вас Windows установлена не на диск С. Установка программы невозможна и была отменена."
Автор: Artem_Butenko
Дата сообщения: 05.01.2009 02:06
Victor_Dobrov -- спасибо Вам за ценный совет, и, немного не в тему, подскажите патчер, умеющий извлекать путь патчинга (установки) из ключа системного реестра. Заранее очень благодарен!
Автор: JuNoS
Дата сообщения: 05.01.2009 10:33
Victor_Dobrov

Спасибо!
Автор: Dermuin
Дата сообщения: 05.01.2009 11:37
Ну ктонить помогите!
Автор: LordVeider
Дата сообщения: 05.01.2009 13:29
san007

Цитата:
Подскажите пожалуйста код для того, чтобы инстал проверял букву диска с установленной виндой и ставил прогу только если системным диском является С.
В противном же случае чтобы выдавало окошко типа "У вас Windows установлена не на диск С. Установка программы невозможна и была отменена."

Код: [code]
function InitializeSetup(): Boolean;
begin
if ExpandConstant('{sd}')<>'C:'
then
begin
MsgBox('Windows установлена не на диск С. Установка программы невозможна.', mbError, mb_Ok);
Exit;
end;
end;
Автор: Diawer
Дата сообщения: 05.01.2009 13:32
Что необходимо добавить в [more= скрипте][Setup]
AppName=My Program
AppVerName=My Program [Version]
DefaultDirName={pf}\My Program

[_Code]
var
Form: TSetupForm;
ExtraFilesList: TMemo;
CancelButton, DelButton: TButton;
UpImage, DownImage, Image: TBitmapImage;
UpPanel, DownPanel: TPanel;
NameLabel, DescriptionLabel, BeforeListBoxLabel: TLabel;
DownTextLabel: TLabel;

procedure FillListBox(const fromDir, fileMask: string; Level: Byte);
var
FSR, DSR: TFindRec;
FindResult: Boolean;
APath: String;
MainLen: Integer;
i: Integer;
begin
MainLen:= Length(ExpandConstant('{app}'));
APath := AddBackslash(fromDir);
FindResult := FindFirst(APath + fileMask, FSR);
try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
{files} i:= ExtraFilesList.Lines.Add(Copy(APath + FSR.Name, MainLen+2, Length(APath + FSR.Name)));
end;
FindResult := FindNext(FSR);
end;
FindResult := FindFirst(APath + '*.*', DSR);
while FindResult do
begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then
begin
{Recursion} FillListBox(APath + DSR.Name, fileMask, Level+1);
end;
FindResult := FindNext(DSR);
end;
finally
FindClose(FSR);
FindClose(DSR);
end;
end;

procedure DeleteFiles();
begin
DelTree(ExpandConstant('{app}'), True, True, True);
end;

procedure BrowseRemainedFiles();
begin
Form := CreateCustomForm;
Form.ClientWidth := ScaleX(504);
Form.ClientHeight := ScaleY(358);
Form.Caption := 'Paradise - InstallShield Wizard';
Form.Center;

UpImage := TBitmapImage.Create(Form);
UpImage.Top := ScaleY(0);
UpImage.Left := ScaleX(0);
UpImage.Width := Form.ClientWidth;
UpImage.Height := ScaleY(59);
UpImage.BackColor := clWhite;
UpImage.Parent := Form;

DownImage := TBitmapImage.Create(Form);
DownImage.Top := ScaleY(61);
DownImage.Left := ScaleX(0);
DownImage.Width := Form.ClientWidth;
DownImage.Height := Form.ClientHeight - DownImage.Top;
DownImage.BackColor := $EEE9EB;
DownImage.Parent := Form;

UpPanel := TPanel.Create(Form);
UpPanel.Top := ScaleY(59);
UpPanel.Width := Form.ClientWidth;
UpPanel.Height := ScaleY(2);
UpPanel.BevelOuter := bvLowered;
UpPanel.Parent := Form;

NameLabel := TLabel.Create(Form);
NameLabel.Top := ScaleY(5);
NameLabel.Left := ScaleX(16);
NameLabel.Font.Style := [fsBold];
NameLabel.Caption := 'Внимание!';
NameLabel.Color := clWhite;
NameLabel.Parent := Form;

DescriptionLabel := TLabel.Create(Form);
DescriptionLabel.Top := ScaleY(24);
DescriptionLabel.Left := ScaleX(25);
DescriptionLabel.Caption := 'Папка установки содержит посторонние файлы. Удалить их?';
DescriptionLabel.Color := clWhite;
DescriptionLabel.Parent := Form;

BeforeListBoxLabel := TLabel.Create(Form);
BeforeListBoxLabel.Top := ScaleY(68);
BeforeListBoxLabel.Left := ScaleX(25);
BeforeListBoxLabel.Caption := 'Если Вы уверены, что хотите удалить папку установки со всеми указанными файлами,'#13
'нажмите Да.'
BeforeListBoxLabel.Color := $EEE9EB;
BeforeListBoxLabel.Parent := Form;

DownPanel := TPanel.Create(Form);
DownPanel.Left := ScaleX(65);
DownPanel.Top := ScaleY(308);
DownPanel.Width := ScaleX(435);
DownPanel.Height := ScaleY(2);
DownPanel.BevelOuter := bvLowered;
DownPanel.Parent := Form;

DownTextLabel := TLabel.Create(Form);
DownTextLabel.Top := ScaleY(302);
DownTextLabel.Caption := ' InstallShield';
DownTextLabel.Font.Color := $99A8AC;
DownTextLabel.Color := $EEE9EB;
DownTextLabel.Parent := Form;

ExtraFilesList := TMemo.Create(Form);
ExtraFilesList.Left := ScaleX(25);
ExtraFilesList.Top := ScaleY(108);
ExtraFilesList.Width := Form.ClientWidth - ScaleX(50);
ExtraFilesList.Height := ScaleY(180);
ExtraFilesList.Color := $EEE9EB;
ExtraFilesList.Parent := Form;

CancelButton := TButton.Create(Form);
CancelButton.Parent := Form;
CancelButton.Width := ScaleX(75);
CancelButton.Height := ScaleY(23);
CancelButton.Left := Form.ClientWidth - CancelButton.Width - ScaleX(20);
CancelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
CancelButton.Caption := 'Нет';
CancelButton.ModalResult := mrCancel;
CancelButton.Cancel := True;

DelButton := TButton.Create(Form);
DelButton.Parent := Form;
DelButton.Width := ScaleX(75);
DelButton.Height := ScaleY(23);
DelButton.Left := CancelButton.Left - DelButton.Width - ScaleX(10);
DelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
DelButton.Caption := 'Да';
DelButton.ModalResult := mrOk;

Form.ActiveControl := CancelButton;

FillListBox(ExpandConstant('{app}'), '*', 1);

if ExtraFilesList.Lines.Count = 0 then
DeleteFiles()
else
if Form.ShowModal() = mrOk then DeleteFiles();
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if DirExists(ExpandConstant('{app}')) and (CurUninstallStep = usPostUninstall) then
BrowseRemainedFiles();
end;[/more] “показывающем оставшиеся после удалении файлы с вопросом на удаление” – (взято из коллекции скриптов в папке \DelSaveFiles\ DelSaveFilesRO_Memo.iss от Victor_Dobrov), что бы вверху писался полный путь установленной программы – в верху, в том же окне, где и список оставшихся после удаления файлов - в первой строке, типа “C:\Program files\My program:”. К примеру, как в пой же папке в \DelSaveFiles\DelSaveFilesRO.iss – только там с чекбоксами и деревом.
Автор: Artem_Butenko
Дата сообщения: 05.01.2009 15:26
omals -- ранее вы предлагали [more=скрипт][_Setup]
DefaultDirName={code:MyDirName}

[_Code]
var
IsSkipDirPage: boolean; // глобальная переменна. значение которой будет True, если страницу выбора директории нужно пропустить.

function MyDirName(S:String): String;
var
InsPath: String; // путь установки
er: boolean;
myFile:String;
begin
IsSkipDirPage := False; // по умолчание предполагаем, что страница выбора директории будет
InsPath:=ExpandConstant('{pf}\Моя компания\Мой продукт'); //если ключа и нужного файла не найдем, то ставим какой-то путь по умолчаний

er := RegQueryStringValue(HKLM, '\мой ключ в реестре\', 'InstallPath', InsPath);
if er and InsPath<>'' then //если ключ существует и там что-то записано
begin
IsSkipDirPage:=True; // запомним, что станицу выбора директории нужно пропустить
// будем ставить по старому пути , который сейчас в InsPath
end
else
begin
myFile := ExpandConstant('{src}\myfile.md5'); // тот файл шо должен лежать рядом с инсталятором
if (FileExists(myFile)) and (GetMD5OfFile(myFile)='нужное мне значени MD5') then
begin
IsSkipDirPage:=True; // запомним, что станицу выбора директории нужно пропустить
InsPath := ExpandConstant('{src}'); // будем ставить в ту же папку где находится инсталятор
end;
end;
Result := InsPath;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if (CurPageID=wpSelectDir) and IsSkipDirPage then //если страница выбора директории и ее нужно пропустить
WizardForm.NextButton.OnClick(WizardForm.NextButton); // пропустили -- типа нажали Next
end;[/more] позволяющий организовать некоторое подобие dUP'a в Inno Setup. Я пытаюсь [more=реализовать этот скрипт на практике][_Setup]
AppName=7Z-Sfx
AppVerName=7Z-Sfx 1.0
DefaultDirName={code:MyDirName}
DefaultGroupName=7Z-Sfx
OutputBaseFilename=Setup
Compression=lzma
SolidCompression=yes

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

[_Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[_Files]
Source: "C:\Program Files\7-Zip\7z.sfx"; DestDir: "{app}"; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[_Code]
var
IsSkipDirPage: boolean; // глобальная переменна. значение которой будет True, если страницу выбора директории нужно пропустить.

function MyDirName(S:String): String;
var
InsPath: String; // путь установки
er: boolean;
myFile:String;
begin
IsSkipDirPage := False; // по умолчание предполагаем, что страница выбора директории будет
InsPath:=ExpandConstant('{pf}\Моя компания\Мой продукт'); //если ключа и нужного файла не найдем, то ставим какой-то путь по умолчаний

er := RegQueryStringValue(HKLM, 'SOFTWARE\7-Zip\Path', 'InstallPath', InsPath);
if er and InsPath<>'C:\Program Files\7-Zip' then //если ключ существует и там что-то записано
begin
IsSkipDirPage:=True; // запомним, что станицу выбора директории нужно пропустить
// будем ставить по старому пути , который сейчас в InsPath
end
else
begin
myFile := ExpandConstant('{src}\7z.sfx'); // тот файл шо должен лежать рядом с инсталятором
if (FileExists(myFile)) and (GetMD5OfFile(myFile)='F454C35085538A38259BFEFCEA224DDC') then
begin
IsSkipDirPage:=True; // запомним, что станицу выбора директории нужно пропустить
InsPath := ExpandConstant('{src}'); // будем ставить в ту же папку где находится инсталятор
end;
end;
Result := InsPath;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if (CurPageID=wpSelectDir) and IsSkipDirPage then //если страница выбора директории и ее нужно пропустить
WizardForm.NextButton.OnClick(WizardForm.NextButton); // пропустили -- типа нажали Next
end;[/more], однако у меня компиллятор ругается на 34 строку в моем скрипте. Отдельно привожу содержание ключа реестра, из которого извлекается путь установки (см. данный [more=*.reg-файл]Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip]
"Path"="C:\\Program Files\\7-Zip"

[/more]). Пожалуйста, помогите разобраться в данном вопросе, буду весьма признателен!
Автор: LordVeider
Дата сообщения: 05.01.2009 16:27
Artem_Butenko

Цитата:
компиллятор ругается на 34 строку
Ошибка обработки оператора AND.
Второе условие нужно взять в скобки.
Код: if er and (InsPath<>'C:\Program Files\7-Zip') then //если ключ существует и там что-то записано
Автор: omals
Дата сообщения: 05.01.2009 18:16
Artem_Butenko
как и сказал LordVeider
нужно if er and (InsPath<>'C:\Program Files\7-Zip') then
сорь забыл о порядке выполнения

LordVeider ну зачем уж так "оптимизировать" то?

Автор: Artem_Butenko
Дата сообщения: 05.01.2009 19:37
omals
LordVeider

Спасибо Вам ребята за помощь, только вот я еще не совсем понял некоторые звенья скрипта. Да, согласен, это неплохая заготовка для создания инсталлятора - патчера. Но, очень хочется видеть реализацию следующих возможностей в данном скрипте (при условии, что инсталлятор м.б. выполнен в "тихом" варианте, или страница выбора директории установки также м.б. отключена):
А) если рядом с исполнительным файлом инсталлятора находится некоторый файл (инсталлятор должен проверить его имя и md5-хэш), то распаковка файлов происходит в корневой каталог, в котором и находится инсталлятор;
Б) если некоторый внешний файл отсутствует или не удовлетворяет проверке md5-хэша, и директория установки не определена из ключа системного реестра, то должно появляться диалоговое окно "Обзор папок", в котором пользователь может выбрать каталог назначения и при нажатии "Ok", инсталлятор распакует файлы в выбранную директорию.
Большая просьба не отсылайте меня изучать dUP, ведь на Inno Setup можно сделать многое (например, автораны, эмулировать инсталляторы EA), вот и у меня сокровенная мечта, сделать оболочку патчера на Inno Setup, но к сожалению самостоятельно разобрать условия описанные в пунктах А) и Б) я не смогу, поэтому искренне надеюсь на Вашу помощь.
Автор: support_star
Дата сообщения: 05.01.2009 20:06
А где можно почитать про изменение внешнего вида мастера? Конкретно интересует как наложить текстуры (причем 3 штуки, что бы при наведении и нажатии на кнопку они менялись) на кнопки "Закрыть" и "Свернуть". Так же интересно узнать как убрать эти кнопки. и Еще интересует как изменить цвет заголовка активного окна инсталятора.

Последний вопрос я уже задовал совсем недавно, но ответа так и не последовало((
Буду благодарен за предоставление любой полезной информации по этим вопросам.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071

Предыдущая тема: в очередной раз босудим антивиры?


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