Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 5]

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

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1265
Благодарности: 1025


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: El Sanchez
Дата: 16-02-2015
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:
Inno Setup [все вопросы] часть 1
Inno Setup [все вопросы] часть 2
Скрипты Inno Setup. Помощь и советы [часть 3]
Скрипты Inno Setup. Помощь и советы [часть 4]

Отправлено: 03:49, 21-05-2012

 

Ветеран


Сообщения: 517
Благодарности: 314

Профиль | Отправить PM | Цитировать


habib2302,

Можно просто вот так:

Код: Выделить весь код
[Tasks]
Name: icons; Description: Create Shortcuts:;
Name: icons\desktop; Description: On the Desktop;
Name: icons\quicklaunchicon; Description: In the Taskbar;
Name: soft; Description: Install Additional Software
Name: soft\msv; Description: Microsoft Visual C++

Отправлено: 16:41, 17-02-2013 | #1661



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для habib2302

Ветеран


Сообщения: 856
Благодарности: 102

Профиль | Отправить PM | Цитировать


saurn, так любой дурак может

-------
Помог? От "Полезное сообщение" не откажусь!!!


Отправлено: 16:46, 17-02-2013 | #1662


Ветеран


Сообщения: 517
Благодарности: 314

Профиль | Отправить PM | Цитировать


habib2302, тебе просто нужно сделать описание задачи через кастомные сообщения, или что? Если просто описание, то я это написал в первом примере, только русские названия заменить на английские. Или нужно менять описания в зависимости от выбранного языка?

Вообщем либо, так:
читать дальше »
[Tasks]
Name: icons; Description: {cm:CreateShortcuts};
Name: icons\desktop; Description: {cm:OntheDesktop};
Name: icons\quicklaunchicon; Description: {cm:IntheTaskbar};
Name: soft; Description: {cm:InstallAdditionalSoftware}
Name: soft\msv; Description: Microsoft Visual C++

[CustomMessages]
CreateShortcuts=Create Shortcuts:
OntheDesktop=On the Desktop
IntheTaskbar=In the Taskbar
InstallAdditionalSoftware=Install Additional Software:


Либо так:
читать дальше »
[Languages]
Name: ru; MessagesFile: "compiler:Languages\Russian.isl"
Name: en; MessagesFile: "compiler:Languages\English.isl"

[Tasks]
Name: icons; Description: {cm:CreateShortcuts};
Name: icons\desktop; Description: {cm:OntheDesktop};
Name: icons\quicklaunchicon; Description: {cm:IntheTaskbar};
Name: soft; Description: {cm:InstallAdditionalSoftware}
Name: soft\msv; Description: Microsoft Visual C++

[CustomMessages]
ru.CreateShortcuts=Создать Ярлыки:
ru.OntheDesktop=На Рабочем Столе
ru.IntheTaskbar=В Панели Задач
ru.InstallAdditionalSoftware=Установка Дополнительного ПО:

en.CreateShortcuts=Create Shortcuts:
en.OntheDesktop=On the Desktop
en.IntheTaskbar=In the Taskbar
en.InstallAdditionalSoftware=Install Additional Software:

Последний раз редактировалось saurn, 17-02-2013 в 17:59.


Отправлено: 17:21, 17-02-2013 | #1663


Аватара для EvilAlex

Новый участник


Сообщения: 40
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: png Без имени-2.png
(43.8 Kb, 22 просмотров)
Вложения
Тип файла: rar NewInstall.rar
(417.8 Kb, 6 просмотров)

И последний вопрос, надеюсь поможете)))

Возможно ли сделать так как на рисунке, не вертикальным столбцом который приходиться прокручивать, а в горизонтальный ряд ?
И добавить еще 1 пункт Никнейм, чтобы было поле куда вписывать, для регистрации в реестре, если конечно есть возможность))

Последний раз редактировалось EvilAlex, 18-02-2013 в 12:11.


Отправлено: 12:00, 18-02-2013 | #1664


Аватара для TERMINAL

Ветеран


Сообщения: 753
Благодарности: 28

Профиль | Отправить PM | Цитировать


Как и где можно указать иемя файла не unins000.exe, а Uninstall.exe ?

-------
Автоматизация прежде всего....


Отправлено: 14:31, 18-02-2013 | #1665


Аватара для Tco 03

Пользователь


Сообщения: 90
Благодарности: 24

Профиль | Отправить PM | Цитировать


Всем привет.
Johny777
Вы, как я понимаю, пользуетесь (или пользовались) этим кодом. Да, действительно код хорош! Не могли бы Вы, пожалуйста, подсказать, как в этом коде отделить функцию распаковки и запаковки. То есть, мне нужна только функция распаковки. Это надо, так сказать бо большому счёту для истетики чтобы в коде не было ничего лишнего. И возможно ли добавить к нему кнопку "Отмена"?

EvilAlex
Возможно так сделать, но это нужно делать отдельно, то есть нужно создавать радиобаттоны в ручную!
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.

[*Code]
var
  NewRadioButton1: TNewRadioButton;
  NewRadioButton2: TNewRadioButton;

procedure RedesignWizardForm;
begin
  NewRadioButton1 := TNewRadioButton.Create(WizardForm);
  with NewRadioButton1 do
  begin
    Name := 'NewRadioButton1';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(256);
    Top := ScaleY(248);
    Width := ScaleX(113);
    Height := ScaleY(17);
    Checked := true;
  end;

  NewRadioButton2 := TNewRadioButton.Create(WizardForm);
  with NewRadioButton2 do
  begin
    Name := 'NewRadioButton2';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(256);
    Top := ScaleY(280);
    Width := ScaleX(113);
    Height := ScaleY(17);
  end;

  NewRadioButton1.TabOrder := 2;
  NewRadioButton2.TabOrder := 3;
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;
Потом делать проверку что выбрано.

TERMINAL
Как вариант, могу предложить так:
читать дальше »
Код: Выделить весь код
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssPostInstall then
begin
  RenameFile(ExpandConstant('{app}\unins000.exe'), ExpandConstant('{app}\Uninstall.exe'));
  RenameFile(ExpandConstant('{app}\unins000.dat'), ExpandConstant('{app}\Uninstall.dat'));
end;
end;
И при неободимости в секции [Setup] пишем:
UninstallDisplayIcon={app}\Uninstall.exe

Последний раз редактировалось Tco 03, 18-02-2013 в 15:58.


Отправлено: 15:33, 18-02-2013 | #1666


Аватара для Shegorat

Новый участник


Сообщения: 15
Благодарности: 12

Профиль | Сайт | Отправить PM | Цитировать


Цитата TERMINAL:
Как и где можно указать иемя файла не unins000.exe, а Uninstall.exe ? »
Когда-то очень давно я писал такой код
читать дальше »
Код: Выделить весь код
#define CodeUninstallName "MyApp"

[Setup]
AppId={{4A546E5C-3484-4B20-80AC-1AB2DE5E4B81}
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp
UninstallFilesDir={app}\Uninstall

[ code]
procedure RenameUninstall();
var
  UninstallDat, UninstallExe,
  NewUninstallExe, NewUninstallDat,
  RegUninstallString, RegQuietUninstallString,
  AppID: String;
begin
  UninstallDat:= ExpandConstant('{uninstallexe}');
  StringChange(UninstallDat, '.exe', '.dat');
  UninstallExe:= ExpandConstant('{uninstallexe}');
  NewUninstallExe:= ExpandConstant('{app}\Uninstall\Uninstall {#CodeUninstallName}.exe')
  NewUninstallDat:= ExpandConstant('{app}\Uninstall\Uninstall {#CodeUninstallName}.dat');
    if FileExists(NewUninstallDat) or FileExists(NewUninstallExe) then
    begin
      DeleteFile(NewUninstallDat)
      DeleteFile(NewUninstallExe)
    end;
  RenameFile(UninstallExe, NewUninstallExe);
  RenameFile(UninstallDat, NewUninstallDat);
  
  AppID:= ExpandConstant('{#SetupSetting("AppID")}');
    
  RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppID + '_is1', 'UninstallString', RegUninstallString)
  RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppID + '_is1', 'QuietUninstallString', RegQuietUninstallString)
  StringChange(RegUninstallString, UninstallExe, NewUninstallExe)
  StringChange(RegQuietUninstallString, UninstallExe, NewUninstallExe)
  RegWriteStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppID + '_is1', 'UninstallString', RegUninstallString)
  RegWriteStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppID + '_is1', 'QuietUninstallString', RegQuietUninstallString)
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep=ssPostInstall then
    RenameUninstall();
end;

-------
Как много дел считались невозможными, пока они не были осуществлены.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:34, 18-02-2013 | #1667


Аватара для EvilAlex

Новый участник


Сообщения: 40
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата Tco 03:
EvilAlex
Возможно так сделать, но это нужно делать отдельно, то есть нужно создавать радиобаттоны в ручную!
читать дальше » »
А как сделать так чтобы боттоны занли что выбирает пользователь ? надо приписывать код или это автоматически ?

Отправлено: 16:42, 18-02-2013 | #1668


Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Цитата Tco 03:
чтобы в коде не было ничего лишнего »
Мне иногда страшно представить сколько лишнего(мусорного) кода содержит ассемблерный код, скомпилированный из чистого, без лишних переменных и функций скрипта тк думаю что компилятору инно далеко до например дельфи 2010
вот только сжатие. Константы все наместе, тк если будет ошибка, то поймёшь что означает по имени константы
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Files]
Source: 7-zip32.dll; Flags: ignoreversion dontcopy nocompression solidbreak sortfilesbyextension

[  code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
const
    // codes returned by SevenZipCreateArchive and SevenZipExtractArchive
    SZ_OK = 0;
    SZ_ERROR = 1;
    SZ_CANCELLED = 2;
    SZ_DLLERROR = 3;

    FNAME_MAX32 = 512;

    // these get returned as nState in the Callback function
    ARCEXTRACT_BEGIN = 0;
    ARCEXTRACT_INPROCESS = 1;
    ARCEXTRACT_END = 2;
    ARCEXTRACT_OPEN = 3;
    ARCEXTRACT_COPY = 4;

    // Errors
    ERROR_START = $8000;

    // WARNING
    ERROR_DISK_SPACE = $8005;
    ERROR_READ_ONLY = $8006;
    ERROR_USER_SKIP = $8007;
    ERROR_UNKNOWN_TYPE = $8008;
    ERROR_METHOD = $8009;
    ERROR_PASSWORD_FILE = $800A;
    ERROR_VERSION = $800B;
    ERROR_FILE_CRC = $800C;
    ERROR_FILE_OPEN = $800D;
    ERROR_MORE_FRESH = $800E;
    ERROR_NOT_EXIST = $800F;
    ERROR_ALREADY_EXIST = $8010;
    ERROR_TOO_MANY_FILES  = $8011;

    // ERROR
    ERROR_MAKEDIRECTORY = $8012;
    ERROR_CANNOT_WRITE = $8013;
    ERROR_HUFFMAN_CODE = $8014;
    ERROR_COMMENT_HEADER = $8015;
    ERROR_HEADER_CRC = $8016;
    ERROR_HEADER_BROKEN = $8017;
    ERROR_ARC_FILE_OPEN = $8018;
    ERROR_NOT_ARC_FILE = $8019;
    ERROR_CANNOT_READ  = $801A;
    ERROR_FILE_STYLE = $801B;
    ERROR_COMMAND_NAME = $801C;
    ERROR_MORE_HEAP_MEMORY = $801D;
    ERROR_ENOUGH_MEMORY = $801E;
    ERROR_ALREADY_RUNNING = $801F;
    ERROR_USER_CANCEL = $8020;
    ERROR_HARC_ISNOT_OPENED = $8021;
    ERROR_NOT_SEARCH_MODE = $8022;
    ERROR_NOT_SUPPORT = $8023;
    ERROR_TIME_STAMP = $8024;
    ERROR_TMP_OPEN = $8025;
    ERROR_LONG_FILE_NAME = $8026;
    ERROR_ARC_READ_ONLY = $8027;
    ERROR_SAME_NAME_FILE = $8028;
    ERROR_NOT_FIND_ARC_FILE = $8029;
    ERROR_RESPONSE_READ = $802A;
    ERROR_NOT_FILENAME = $802B;
    ERROR_TMP_COPY = $802C;
    ERROR_EOF = $802D;
    ERROR_ADD_TO_LARC = $802E;
    ERROR_TMP_BACK_SPACE = $802F;
    ERROR_SHARING = $8030;
    ERROR_NOT_FIND_FILE = $8031;
    ERROR_LOG_FILE = $8032;
    ERROR_NO_DEVICE = $8033;
    ERROR_GET_ATTRIBUTES = $8034;
    ERROR_SET_ATTRIBUTES = $8035;
    ERROR_GET_INFORMATION = $8036;
    ERROR_GET_POINT = $8037;
    ERROR_SET_POINT = $8038;
    ERROR_CONVERT_TIME = $8039;
    ERROR_GET_TIME = $803A;
    ERROR_SET_TIME = $803B;
    ERROR_CLOSE_FILE = $803C;
    ERROR_HEAP_MEMORY = $803D;
    ERROR_HANDLE = $803E;
    ERROR_TIME_STAMP_RANGE = $803F;
    ERROR_MAKE_ARCHIVE = $8040;
    ERROR_NOT_CONFIRM_NAME = $8041;
    ERROR_UNEXPECTED_EOF = $8042;
    ERROR_INVALID_END_MARK = $8043;
    ERROR_INVOLVED_LZH = $8044;
    ERROR_NO_END_MARK = $8045;
    ERROR_HDR_INVALID_SIZE = $8046;
    ERROR_UNKNOWN_LEVEL = $8047;
    ERROR_BROKEN_DATA = $8048;
    ERROR_7ZIP_START = $8100;
    ERROR_WARNING = $8101;
    ERROR_FATAL = $8102;
    ERROR_DURING_DECOMPRESSION = $8103;
    ERROR_DIR_FILE_WITH_64BIT_SIZE = $8104;
    ERROR_FILE_CHANGED_DURING_OPERATION = $8105;

    FA_RDONLY = $01;
    FA_HIDDEN = $02;
    FA_SYSTEM = $04;
    FA_LABEL = $08;
    FA_DIREC = $10;
    FA_ARCH = $20;
    FA_ENCRYPTED = $40;

    ARCHIVETYPE_ZIP = 1;
    ARCHIVETYPE_7Z = 2;

    WM_USER = $400;
    PBM_SETPOS = (WM_USER + 2);


type
    HARC = Longint;

    EXTRACTINGINFO = record
        dwFileSize: DWORD;                                  // Size of all the housing files. When entire size 0xFFFFFFFF (-1) it is above, 0xFFFFFFFF (-1) it houses.
        dwWriteSize: DWORD;                                 // The entire size which processed with compression thawing processing. When dwFileSize 0xFFFFFFFF (-1) is, entire processing ratio (permill) it houses.
        szSourceFileName: array [0..FNAME_MAX32] of Byte;   // The housing file name which processes.
        dummy1: array [0..2] of Byte;
        szDestFileName: array [0..FNAME_MAX32] of Byte;     // The path name which actually is written.
        dummy: array [0..2] of Byte;
    end;

    // Callback func should return FALSE to cancel the archiving process, else TRUE
    ARCHIVERPROC = function(_hwnd: HWND; _uMsg: UINT; _nState: UINT; _lpEis: Longint): BOOL;

function SevenZip(const _hwnd: HWND; _szCmdLine: PAnsiChar; _szOutput: AnsiString; const _dwSize: DWORD): Integer; external 'SevenZip@files:7-zip32.dll stdcall';
function SevenZipSetOwnerWindowEx(_hwnd: HWND; _lpArcProc: Longint): BOOL; external 'SevenZipSetOwnerWindowEx@files:7-zip32.dll stdcall';
function SevenZipKillOwnerWindowEx(_hwnd: HWND): BOOL; external 'SevenZipKillOwnerWindowEx@files:7-zip32.dll stdcall';
function RtlMoveMemory(var Destination: EXTRACTINGINFO; const Source: Longint; len: Integer): Integer; external 'RtlMoveMemory@kernel32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';


const
    CP_ACP    = 0;             { default to ANSI code page }
    CP_OEMCP  = 1;             { default to OEM  code page }

function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpWideCharStr: PAnsiChar; cchWideChar: Integer): Longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: PAnsiChar; cchWideChar: Integer; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpDefaultChar: Integer; lpUsedDefaultChar: Integer): Longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

function StringToWideString(const aStr: string; codePage: Word): string;
var
    len: Integer;
begin
    len := MultiByteToWideChar(codePage, 0, aStr, -1, '', 0);
    if len > 0 then
    begin
        SetLength(Result, (len*2)-2);
        MultiByteToWideChar(codePage, 0, aStr, -1, Result, Length(Result));
    end;
end;

function WideStringToString(const wStr: string; codePage: Word): string;
var
    len: Integer;
begin
    len := WideCharToMultiByte(codePage, 0, wStr, -1, '', 0, 0, 0);
    if len > 0 then
    begin
        SetLength(Result, len-1);
        WideCharToMultiByte(codePage, 0, wStr, -1, Result, Length(Result), 0, 0);
    end;
end;

function AnsiToDos(const SourceStr: string): string;
begin
    Result := WideStringToString(StringToWideString(SourceStr, CP_ACP), CP_OEMCP);
end;



var
    szStatus: TNewStaticText;
    ei: EXTRACTINGINFO;
    ProgressPage: TOutputProgressWizardPage;
    hProgress, hMsg1Label, hMsg2Label: HWND;
    Cancel: boolean;
    DestPath: String;
    MyPrgBar: TNewProgressBar;

function ByteArrayToString(cArray: array of Byte): String;
begin
    Result := '';
    while cArray[Length(Result)] <> 0 do Insert(Chr(cArray[Length(Result)]), Result, Length(Result)+1);
end;

function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], SizeOf(pszBuf));
    except end;
end;

function ArchiverCallbackProc(_hwnd: HWND; _uMsg, _nState: UINT; _lpEis: Longint): BOOL;
var
    dwCurrentSize: Single;
begin
    Result := True;
    case _nState of
        ARCEXTRACT_BEGIN: SetWindowText(hMsg1Label, 'Status: scanning');
        ARCEXTRACT_INPROCESS:
        begin
           // if Cancel then Exit;
            RtlMoveMemory(ei, _lpEis, SizeOf(ei));
            dwCurrentSize := ei.dwWriteSize;
            PostMessage(hProgress, PBM_SETPOS, Round(65535*(dwCurrentSize/ei.dwFileSize)), 0);
            SetWindowText(hMsg1Label, 'Status: compressing');
            SetWindowText(hMsg2Label, FormatFloat('Progress: 0.#0 %', (dwCurrentSize*100)/ei.dwFileSize));
            SetWindowText(_hwnd, 'File: ' + ByteArrayToString(ei.szSourceFileName) + #13#10 +
            'Total size: ' + BytesToSize(ei.dwFileSize) + #13#10 +
            'Current size: ' + BytesToSize(ei.dwWriteSize));
            Result := not Cancel;
        end;
        ARCEXTRACT_END: Result := False;
        ARCEXTRACT_OPEN: SetWindowText(hMsg1Label, 'Status: open archive');
    end;
end;

procedure Cancel7ZipWork(Sender: TObject);
begin
    Cancel := True;
end;

/////////////////////
procedure CreateSevenZipProgressPage;
begin
    ProgressPage := CreateOutputProgressPage('7-zip', '');
    szStatus := TNewStaticText.Create(ProgressPage);
    with szStatus do
    begin
        Parent := ProgressPage.Surface;
        WordWrap := True;
        SetBounds(ScaleX(0), ProgressPage.ProgressBar.Top + ScaleY(30), ProgressPage.Surface.Width, ScaleY(300));
    end;
    MyPrgBar := TNewProgressBar.Create(nil)
    with MyPrgBar do
    begin
        Parent := ProgressPage.Surface;
        SetBounds(ScaleX(0), ProgressPage.ProgressBar.Top + ScaleY(140), ProgressPage.Surface.Width, ScaleY(27));
    end;
    with TButton.Create(nil) do
    begin
        Parent := ProgressPage.Surface;
        Caption := 'Cancel';
        SetBounds(ScaleX(0), ProgressPage.ProgressBar.Top + ScaleY(90), ScaleX(75), ScaleY(25));
        OnClick := @Cancel7ZipWork;
    end;
end;


//////////////////////////////////////////////////////
function SevenZipCreateArchive(hWnd: HWND; ArchiveFilename, BaseDirectory: String; FileList : TArrayOfString; CompressionLevel: Integer; CreateSolidArchive: Boolean; RecurseFolders: Boolean; Password, Sfx: String; ShowProgress: Boolean; Callback: Longint): Integer;
var
    S7ResultOutput, s7cmd, cwd: AnsiString;
    i: Integer;
begin
    Result := SZ_ERROR;
    if not SetCurrentDir(BaseDirectory) then Exit;
    //
    cwd := GetCurrentDir;
    
    if Callback <> 0 then ShowProgress := False;
    try
        if GetArrayLength(FileList) > 0 then
        begin
            s7cmd := 'a "' + AnsiToDos(ArchiveFilename) + '" "' + RemoveQuotes(FileList[0]) + '"';
            for i := 1 to GetArrayLength(FileList)-1 do
            begin
                s7cmd := s7cmd + ' -i';
                if RecurseFolders then s7cmd := s7cmd + 'r';
                s7cmd := s7cmd + '!"' + RemoveQuotes(FileList[i]) + '"';
            end;
        end;
        s7cmd := s7cmd + ' -mx' + IntToStr(CompressionLevel);
        if RecurseFolders then s7Cmd := s7cmd + ' -r';
        if Password <> '' then s7Cmd := s7Cmd + ' -p' + Password;
        if CreateSolidArchive then s7cmd := s7cmd + ' -ms=on' else s7cmd := s7cmd + ' -ms=off';
        if not ShowProgress then s7cmd := s7cmd + ' -hide';
        if Length(Sfx) > 0 then s7cmd := s7cmd + ' -sfx' + Sfx;
        try
            s7ResultOutput := StringOfChar(#0, 10240);
            if Callback <> 0 then
            begin
                //get handles for 7-zip callback thread
                hProgress := ProgressPage.ProgressBar.Handle;
                hMsg1Label := ProgressPage.Msg1Label.Handle;
                hMsg2Label := ProgressPage.Msg2Label.Handle;
                //show progress page
                ProgressPage.Show;
                ProgressPage.ProgressBar.Show;
                ProgressPage.Description := 'Compress';
                //set callback
                SevenZipSetOwnerWindowEx(hWnd, Callback);
            end;
            Result := SevenZip(hWnd, s7cmd, s7ResultOutput, Length(s7ResultOutput)-1);
        finally
            if Callback <> 0 then
            begin
                ProgressPage.Hide;
                SevenZipKillOwnerWindowEx(hWnd);
            end;
            //MsgBox(S7ResultOutput, mbInformation, MB_OK);
        except
            Result := SZ_DLLERROR;
        end;
    finally
        SetCurrentDir(cwd);
    end;
end;

procedure InitializeWizard();
begin
    Cancel := True;
    CreateSevenZipProgressPage;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
    if CurPageID = wpWelcome then
    begin
        Cancel := False;
        DestPath := 'c:\setup'
        // compress with callback
        SevenZipCreateArchive(szStatus.Handle, 'C:\123.7z', 'c:\setup', ['common\*'], 1, True, False, '', '', False, CallbackAddr('ArchiverCallbackProc'));
        // compress without callback
        //SevenZipCreateArchive(szStatus.Handle, 'd:\123.7z', 'd:\', 'SkypeSetupFull.exe', 1, True, False, '', '', True, 0);
        Result := True;
    end;
end;

Цитата Tco 03:
TERMINAL
Как вариант, могу предложить так: »
его нельзя переименовывать так просто тк путь к экзешнику лежит в реестре и по нему, пути, вызывается удаление
TERMINAL, нужно так:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
AppId=proto_15
 
[  Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep=ssPostInstall then
  begin
    if not RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'QuietUninstallString', '"' + ExpandConstant('{app}\Uninstall.exe') + '"' + #32 + '/SILENT') then Exit;
    if RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', '"' + ExpandConstant('{app}\Uninstall.exe') + '"') then
    RenameFile(ExpandConstant('{app}\unins000.exe'), ExpandConstant('{app}\Uninstall.exe'));
    if RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallDataFile', '"' + ExpandConstant('{app}\Uninstall.dat') + '"') then
    RenameFile(ExpandConstant('{app}\unins000.dat'), ExpandConstant('{app}\Uninstall.dat'));
  end;
end;


UPD
Shegorat, пардон, не увидел

Последний раз редактировалось Johny777, 18-02-2013 в 17:04.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:57, 18-02-2013 | #1669


Аватара для Tco 03

Пользователь


Сообщения: 90
Благодарности: 24

Профиль | Отправить PM | Цитировать


Johny777
Цитата Johny777:
его нельзя переименовывать так просто тк путь к экзешнику лежит в реестре и по нему, пути, вызывается удаление »
По мне так зачем это вообще нужно делать. Сразу же при повторной установке рядом создаётся файл unins000.exe Тут типа нужно делать проверку об установлееной программе или ещё что..., а так, никакой эстетики Мысли в слух: Кому придёт в голову сразу же повторно устанавливать прогу...

EvilAlex
Цитата EvilAlex:
А как сделать так чтобы боттоны занли что выбирает пользователь ? надо приписывать код или это автоматически ? »
Радиобаттонами я не пользуюсь...
Вот пример проверки чекбоксов:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.

[Files]
Source: 1.zip; DestDir: {app}\File1.exe; Check: NewCheckBox1Result;
Source: 2.zip; DestDir: {app}\File2.exe; Check: NewCheckBox2Result;

[  Code]
var
  NewCheckBox1: TNewCheckBox;
  NewCheckBox2: TNewCheckBox;
  
function NewCheckBox1Result: boolean;
begin
  Result:=NewCheckBox1.Checked;
end;

function NewCheckBox2Result: boolean;
begin
  Result:=NewCheckBox2.Checked;
end;

procedure NewCheckBox1Click(Sender: TObject);
begin
  if NewCheckBox1.Checked then begin
    NewCheckBox2.Checked:= false;
    NewCheckBox2.Enabled:= false;
  end
  else if not NewCheckBox1.Checked then begin
    NewCheckBox2.Enabled:= True;
  end;
end;

procedure NewCheckBox2Click(Sender: TObject);
begin
  if NewCheckBox2.Checked then begin
    NewCheckBox1.Checked:= false;
    NewCheckBox1.Enabled:= false;
  end
  else if not NewCheckBox2.Checked then begin
    NewCheckBox1.Enabled:= True;
  end;
end;

procedure RedesignWizardForm;
begin
  NewCheckBox1 := TNewCheckBox.Create(WizardForm);
  with NewCheckBox1 do
  begin
    Name := 'NewCheckBox1';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(208);
    Top := ScaleY(208);
    Width := ScaleX(97);
    Height := ScaleY(17);
    OnClick := @NewCheckBox1Click;
  end;

  NewCheckBox2 := TNewCheckBox.Create(WizardForm);
  with NewCheckBox2 do
  begin
    Name := 'NewCheckBox2';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(208);
    Top := ScaleY(232);
    Width := ScaleX(97);
    Height := ScaleY(17);
    OnClick := @NewCheckBox2Click;
  end;

  NewCheckBox1.TabOrder := 2;
  NewCheckBox2.TabOrder := 3;
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;

Вот также пример из Help-а, чекбоксы работают как радиобаттоны:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.7
DefaultDirName={pf}\My Program
OutputDir=.

[  Code]
var
Check: array [0..2] of TCheckBox;

procedure Check0(Sender: TObject);
begin
if Check[0].Checked then
begin
Check[1].Checked := False;
Check[2].Checked := False;
end;

if (Check[0].Checked = False) and (Check[1].Checked = False)
and (Check[2].Checked = False) then Check[0].Checked := True;
end;

procedure Check1(Sender: TObject);
begin
if Check[1].Checked then
begin
Check[0].Checked := False;
Check[2].Checked := False;
end;

if (Check[0].Checked = False) and (Check[1].Checked = False)
and (Check[2].Checked = False) then Check[1].Checked := True;
end;

procedure Check2(Sender: TObject);
begin
if Check[2].Checked then
begin
Check[0].Checked := False;
Check[1].Checked := False;
end;

if (Check[0].Checked = False) and (Check[1].Checked = False)
and (Check[2].Checked = False) then Check[2].Checked := True;
end;

procedure InitializeWizard();
begin
Check[0] := TCheckBox.Create(WizardForm);
with Check[0] do
begin
Parent := WizardForm.SelectDirPage;
Checked := True;
Top := ScaleY(100);
OnClick := @Check0;
Caption := 'Чекбокс №1';
end;

Check[1] := TCheckBox.Create(WizardForm);
with Check[1] do
begin
Parent := WizardForm.SelectDirPage;
Top := ScaleY(120);
OnClick := @Check1;
Caption := 'Чекбокс №2';
end;

Check[2] := TCheckBox.Create(WizardForm);
with Check[2] do
begin
Parent := WizardForm.SelectDirPage;
Top := ScaleY(140);
OnClick := @Check2;
Caption := 'Чекбокс №3';
end;
end;

Последний раз редактировалось Tco 03, 19-02-2013 в 00:35.


Отправлено: 17:37, 18-02-2013 | #1670



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 5]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 4] El Sanchez Автоматическая установка приложений 2099 22-05-2012 23:16
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58
[архив] Скрипты Inno Setup. Помощь и советы [часть 2] Serega Автоматическая установка приложений 2651 08-11-2010 18:34
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59
Inno Setup tradeukraine Вебмастеру 3 13-06-2006 20:39




 
Переход