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

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

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

Сообщение nik1967 »

можно ли чтобы при запуске созданного установщика с ключом выполнялся определённый файл?

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

(все файлы внутри установщика)
Аватара пользователя
Gnom_aka_Lexander

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

Сообщение Gnom_aka_Lexander »

icq99999999,


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




Код:

Код: Выделить всё

[Files]
Source: "file1.exe"; Flags: dontcopy nocompression
Source: "file2.exe"; Flags: dontcopy nocompression
[code      ]
const
    RUN_PARAM = '-run';
function InitializeSetup(): Boolean;
var
    ResultCode: Integer;
begin
    if Pos(RUN_PARAM, GetCmdTail)  0 then
    begin
        ExtractTemporaryFile('file1.exe');
        Exec(AddBackslash(ExpandConstant('{tmp}')) + 'file1.exe', '', ExpandConstant('{tmp}'), SW_HIDE, ewNoWait, ResultCode);
        Result := True;
    end else
    begin
        ExtractTemporaryFile('file2.exe');
        Exec(AddBackslash(ExpandConstant('{tmp}')) + 'file2.exe', '', ExpandConstant('{tmp}'), SW_HIDE, ewNoWait, ResultCode);
    end;
end;







пример запуска: "setup.exe -run"

------------------------------------------------------

при запуске с этим параметром:

1. извлекаем file1.exe в папку в темпе

2. запускаем его оттуда без ожидания завершения его процесса

3. возвращаем из InitializeSetup() True следствием чего будет инициализация приложения установки



при запуске без параметра:

1. извлекаем file2.exe в папку в темпе

2. запускаем его оттуда без ожидания завершения его процесса

3. возвращаем из InitializeSetup() False
Аватара пользователя
jiumx60rus

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

Сообщение jiumx60rus »

Цитата Johny777:

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


а если нужно сделать следующее:

c запуска ключом:

распаковать всё в %temp%\spacep

скопировать из папки где находится программа файл comp.ini в папку %temp%\spacep\

запустить файл с параметром %temp%\spacep\1\hidcon.exe -setup.cmd

запустить файл с параметром %temp%\spacep\1\hidcon.exe -1бат.bat

после завершения hidcon.exe удалить все извлечённые файлы

при обычном запуске:

распаковать всё в %temp%\spacep

скопировать из папки где находится программа файл comp.ini в папку %temp%\spacep\

запустить файл с параметром %temp%\spacep\1\hidcon.exe -1бат.bat

после завершения hidcon.exe удалить папку %temp%\spacep\1

запустить %temp%\spacep\set.exe

после завершения процесса set.exe скопировать %temp%\spacep\comp.ini и положить рядом с программой

удалить все извлечённые файлы.

весь процесс должен быть полностью скрыт от глаз пользователя
Аватара пользователя
audiofeel

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

Сообщение audiofeel »

saurn, И это снова я. В срипте Example_NewCheckListBox радиобуттоны и чекбоксы находятся на компонентслисте, а мне хотелось бы чтобы они были свободными, как в скрипте Прототип (только там задачи), т.к. я на них хочу повесить OneClick (звук wav).
Аватара пользователя
mat_y@vk

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

Сообщение mat_y@vk »

Nightwishh,
Цитата Nightwishh:



т.к. я на них хочу повесить OneClick (звук wav).
Скрипты Inno Setup. Помощь и советы [часть 6]




а в чём проблема? так не пойдёт?


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




Код:

Код: Выделить всё

procedure ComponentsListOnClickCheck(Sender: TObject);
begin
    // проигрывание звука
end;
procedure InitializeWizard();
begin
    WizardForm.ComponentsList.OnClickCheck := @ComponentsListOnClickCheck;
end;







=================================================================================

icq99999999,


Цитата icq99999999:



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




а всё это сколько?

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

Не знаю сколько файлов лежит в папке spacep, поэтому сделал так: пакуешь папку в 7z архив и кладёшь рядом с экзешником инсталла


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




Код:

Код: Выделить всё

[Files]
Source: "7-zip32.dll"; Flags: dontcopy nocompression
[code    ]
#define A = (Defined UNICODE) ? "W" : "A"
#define Use_Debug
const
    SPACE_CHAR = #32;
    SZ_OK = 0;
    RUN_PARAM = '-run';
    ARCHIVE_NAME = 'spacep.7z';
    INI_NAME = 'comp.ini';
function SevenZip(const _hwnd: HWND; _szCmdLine: PAnsiChar; _szOutput: PAnsiChar; const _dwSize: DWORD): Integer; external 'SevenZip@files:7-zip32.dll stdcall';
function CopyFile(lpExistingFileName, lpNewFileName: String; bFailIfExists: BOOL): BOOL; external 'CopyFile{#A}@kernel32.dll stdcall';
function SimpleExtractSevenZip(const ArchivePath, DestPath: AnsiString): Boolean;
var
    SevenZipCmd: AnsiString;
begin
    SevenZipCmd := Format( 'x "%s" "%s" -y -hide', [ ArchivePath, AddBackslash(RemoveBackslash(DestPath)) ] );
    CharToOemBuff(SevenZipCmd);
    Result := SevenZip(0, SevenZipCmd, '', 0) = SZ_OK;
end;
function InitializeSetup(): Boolean;
var
    ResultCode: Integer;
    TempPath, OuterPath: String;
begin
    Result := False;
    OuterPath := AddBackslash( ExpandConstant('{src}') );
    TempPath := AddBackslash( ExpandConstant('{tmp}') );
    if Pos(RUN_PARAM, GetCmdTail)  0 then // c запуска ключом:
    begin
        #ifdef Use_Debug
            MsgBox('распаковать всё в %temp%\spacep', mbInformation, MB_OK);
        #endif
        if not SimpleExtractSevenZip(OuterPath + ARCHIVE_NAME, TempPath) then MsgBox(SysErrorMessage(DLLGetLastError), mbError, MB_OK);
        #ifdef Use_Debug
            MsgBox('скопировать из папки где находится программа файл comp.ini в папку %temp%\spacep\', mbInformation, MB_OK);
        #endif
        CopyFile(OuterPath + INI_NAME, TempPath + 'spacep\' + INI_NAME, False);
        #ifdef Use_Debug
            MsgBox('запустить файл с параметром %temp%\spacep\1\hidcon.exe -setup.cmd', mbInformation, MB_OK);
        #endif
        Exec(TempPath + 'spacep\1\' + 'hidcon.exe', '-setup.cmd', TempPath + 'spacep\1\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
        #ifdef Use_Debug
            MsgBox('запустить файл с параметром %temp%\spacep\1\hidcon.exe -1бат.bat', mbInformation, MB_OK);
        #endif
        Exec(TempPath + 'spacep\1\' + 'hidcon.exe', '-1бат.bat', TempPath + 'spacep\1\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
        #ifdef Use_Debug
            MsgBox('...папка в темпе удалится сама', mbInformation, MB_OK);
        #endif
    end else // при обычном запуске:
    begin
        #ifdef Use_Debug
            MsgBox('распаковать всё в %temp%\spacep', mbInformation, MB_OK);
        #endif
        if not SimpleExtractSevenZip(OuterPath + ARCHIVE_NAME, TempPath) then MsgBox(SysErrorMessage(DLLGetLastError), mbError, MB_OK);
        #ifdef Use_Debug
            MsgBox('скопировать из папки где находится программа файл comp.ini в папку %temp%\spacep\', mbInformation, MB_OK);
        #endif
        CopyFile(OuterPath + INI_NAME, TempPath + 'spacep\' + INI_NAME, False);
        #ifdef Use_Debug
            MsgBox('запустить файл с параметром %temp%\spacep\1\hidcon.exe -1бат.bat', mbInformation, MB_OK);
        #endif
        Exec(TempPath + 'spacep\1\' + 'hidcon.exe', '-1бат.bat', TempPath + 'spacep\1\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
        #ifdef Use_Debug
            MsgBox('после завершения hidcon.exe удалить папку %temp%\spacep\1', mbInformation, MB_OK);
        #endif
        DelTree(TempPath + 'spacep\1\', True, True, True);
        #ifdef Use_Debug
            MsgBox('запустить %temp%\spacep\set.exe', mbInformation, MB_OK);
        #endif
        Exec(TempPath + 'spacep\' + 'set.exe', '-1бат.bat', TempPath + 'spacep\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
        #ifdef Use_Debug
            MsgBox('после завершения процесса set.exe скопировать %temp%\spacep\comp.ini и положить рядом с программой', mbInformation, MB_OK);
            MsgBox('а что, если инсталл на диске?', mbError, MB_OK);
        #endif
        CopyFile(TempPath + 'spacep\' + INI_NAME, OuterPath + INI_NAME, False);
        #ifdef Use_Debug
            MsgBox('...папка в темпе удалится сама', mbInformation, MB_OK);
        #endif
    end;
end;







Исходник с файлами:
Аватара пользователя
mat_y@vk

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

Сообщение mat_y@vk »

Цитата Johny777:

а всё это сколько?
Скрипты Inno Setup. Помощь и советы [часть 6]


под всё я имел ввиду содержимое инстала, а поэтому использовать стороннюю утилиту 7z не нужно, вот только как 7z отключить?

след вопрос:

а можно ли после копирования проверить есть ли файл comp.ini рядом с прогой, если файла нет то копировать его из %temp%\spacep\ в C:\AppData\

а потом скопировать файл "comp.ini" из директории с прогой в %temp%\spacep\ если файла нет то копировать его из C:\AppData\ в %temp%\spacep\

можно ли убрать появляющейся(при запуске) на понели задач окошко в котором написано установка

можно ли отключить при компиляции изображение WizModernImage.bmp

можно ли чтобы при запуске с ключом файл находящейся внутри инстала распаковывался в %windir%\temp\ а при обычном запуске не распаковывался
Аватара пользователя
sergey3695

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

Сообщение sergey3695 »

audiofeel, кидай сам скрипт (желательно с файлами. можешь зашифровать архив или в лс). мне трудно так ответить. ну, можешь для лейбла с процентами поставить .BringToFront (не факт что поможет).

Или именнно в этих строках поиграйся с последним параметром в ImgLoad / В каком-то случае,да получится. По идеи поставь флаги False,но могу ошибится.
Аватара пользователя
mat_y@vk

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

Сообщение mat_y@vk »

Nightwishh через bass вроде можно,но не знаб работает ли без ботвы,так как там есть пример тот что тебе нужен
Аватара пользователя
Noname22

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

Сообщение Noname22 »

icq99999999,
Цитата icq99999999:



вот только как 7z отключить?
Скрипты Inno Setup. Помощь и советы [часть 6]




да не быть мне кэпом! переписать код конечно Изображение


Цитата icq99999999:



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




переписал, изучай:




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




Код:

Код: Выделить всё

[Setup]
AppName=Demo
AppVerName=1.1
OutputDir=Output
CreateAppDir=no
[Files]
Source: spacep\*; DestDir:{tmp}\spacep; Flags: recursesubdirs createallsubdirs
[code  ]
#define A = (Defined UNICODE) ? "W" : "A"
#define Use_Debug
const
    RUN_PARAM = '-run';
    INI_NAME = 'comp.ini';
    GCL_STYLE = -26;
    CS_NOCLOSE = $200;
    WM_LBUTTONDOWN = $0201;
    WM_LBUTTONUP = $0202;
function CopyFile(lpExistingFileName, lpNewFileName: String; bFailIfExists: BOOL): BOOL; external 'CopyFile{#A}@kernel32.dll stdcall';
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@User32.dll stdcall';
function SetClassLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): DWORD; external 'SetClassLong{#A}@User32.dll stdcall';
function GetClassLong(hWnd: HWND; nIndex: Integer): DWORD; external 'GetClassLong{#A}@User32.dll stdcall';
function RunWithParam(): Boolean;
begin
    Result := Pos(RUN_PARAM, GetCmdTail)  0;
end;
procedure CurStepChanged(CurStep: TSetupStep);
var
    ResultCode: Integer;
    TempPath, OuterPath: String;
begin
    if CurStep = ssPostInstall then
    begin
        OuterPath := AddBackslash( ExpandConstant('{src}') );
        TempPath := AddBackslash( ExpandConstant('{tmp}') );
        if RunWithParam() then // c запуска ключом:
        begin
            CopyFile(OuterPath + INI_NAME, TempPath + 'spacep\' + INI_NAME, False);
            Exec(TempPath + 'spacep\1\' + 'hidcon.exe', '-setup.cmd', TempPath + 'spacep\1\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
            Exec(TempPath + 'spacep\1\' + 'hidcon.exe', '-1бат.bat', TempPath + 'spacep\1\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
        end else // при обычном запуске:
        begin
            CopyFile(OuterPath + INI_NAME, TempPath + 'spacep\' + INI_NAME, False);
            Exec(TempPath + 'spacep\1\' + 'hidcon.exe', '-1бат.bat', TempPath + 'spacep\1\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
            DelTree(TempPath + 'spacep\1\', True, True, True);
            Exec(TempPath + 'spacep\' + 'set.exe', '-1бат.bat', TempPath + 'spacep\', SW_SHOW, ewWaitUntilTerminated, ResultCode);
            if not CopyFile(TempPath + 'spacep\' + INI_NAME, OuterPath + INI_NAME, False) then
            begin
                CopyFile(TempPath + 'spacep\' + INI_NAME, ExtractFilePath(ExpandConstant('{localappdata}')) + INI_NAME, False);
                if not CopyFile(OuterPath + INI_NAME, TempPath + 'spacep\' + INI_NAME, False) then
                CopyFile(ExtractFilePath(ExpandConstant('{localappdata}')) + INI_NAME, TempPath + 'spacep\' + INI_NAME, False);
            end;
        end;
    end;
end;
procedure InitializeWizard();
begin
    ShowWindow(Application.Handle, SW_HIDE); // прячем кнопку в панели задач
    SetClassLong(WizardForm.Handle, GCL_STYLE, GetClassLong(WizardForm.Handle, GCL_STYLE) or CS_NOCLOSE); // без Alt+F4
    // прячем форму
    WizardForm.BorderStyle := bsNone;
    WizardForm.SetBounds(Screen.Width-777, Screen.Height-777, 0, 0);
end;
procedure CurPageChanged(CurPageID: Integer);
begin
    if CurPageID = wpReady then
    begin
        PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONDOWN, 0, 0);
        PostMessage(WizardForm.NextButton.Handle, WM_LBUTTONUP, 0, 0);
    end;
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
    case PageID of
        wpWelcome, wpSelectDir, wpFinished {, другие твои страницы}: Result := True;
    end;
end;






Цитата icq99999999:



а можно ли после копирования проверить есть ли файл comp.ini рядом с прогой, если файла нет то копировать его из %temp%\spacep\ в C:\AppData\

а потом скопировать файл "comp.ini" из директории с прогой в %temp%\spacep\ если файла нет то копировать его из C:\AppData\ в %temp%\spacep\

можно ли убрать появляющейся(при запуске) на понели задач окошко в котором написано установка
Скрипты Inno Setup. Помощь и советы [часть 6]




это всё в коде выше, вот только я не уверен насчёт C:\AppData\. Может имелось в виду то что тебе выдаёт месседжбокс в коде выше, в первой строке процедуры InitializeWizard();


Цитата icq99999999:



проверить есть ли файл comp.ini рядом с прогой
Скрипты Inno Setup. Помощь и советы [часть 6]




проверяется функцией FileExists, но ясделал проще. Просто если CopyFile вернёт False делаем что надо


Цитата icq99999999:



можно ли отключить при компиляции изображение WizModernImage.bmp
Скрипты Inno Setup. Помощь и советы [часть 6]




Я не совсем понимаю что ты имеешь в виду. Нельзя управлять теневым исходным кодом инно отсюда. Чтоб этой картинки не было в принципе, нужно переписать исходники инно.

Можно спрятать: впиши в InitializeWizard это WizardForm.WizardBitmapImage.Hide;

Можно пропустить страницу приветствия: [Setup] DisableWelcomePage=yes


Цитата icq99999999:



можно ли чтобы при запуске с ключом файл находящейся внутри инстала распаковывался в %windir%\temp\ а при обычном запуске не распаковывался
Скрипты Inno Setup. Помощь и советы [часть 6]




Можно:

1. если файл должен попасть в темп во время установки то так:

[Files]

Source: имя_файла; DestDir:{tmp}\; Check: RunWithParam();

2. если где-то ещё то как в примере отсюда
Скрипты Inno Setup. Помощь и советы [часть 6]
с соответствующей проверкой

if RunWithParam() then ExtractTemporaryFile('имя_файла')



=================================================================================



Всем

Вот пример воспроизведения Wav файлов из памяти - быстрый доступ, быстрее чем с жёсткого диска. Это отдельный пример из кода ниже. Может кому пригодится:


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




Код:

Код: Выделить всё

[Setup]
...
RawDataResource=SndA:bugreporter_succeeded.wav |SndB:buttonclickreleaseo.WAV
[code  ]
#define A = (Defined UNICODE) ? "W" : "A"
type
    HINST = THandle;
    HMODULE = HINST;
    Pointer = Longint;
    HRSRC = THandle;
    HGLOBAL = THandle;
const
    SND_ASYNC           = $0001;
    SND_NODEFAULT       = $0002;
    SND_MEMORY          = $0004;
    RT_RCDATA           = 10;
function sndPlaySound(lpszSoundName: Pointer; uFlags: UINT): BOOL; external 'sndPlaySound{#A}@Winmm.dll stdcall';
function LoadResource(hModule: HINST; hResInfo: HRSRC): HGLOBAL; external 'LoadResource@kernel32.dll stdcall';
function FindResource(hModule: HMODULE; lpName: String; lpType: Longint): HRSRC; external 'FindResource{#A}@kernel32.dll stdcall';
function LockResource(hResData: HGLOBAL): Pointer; external 'LockResource@kernel32.dll stdcall';
var
    hResourceSound: HRSRC;
    pSoundMemory: Pointer;
procedure InitializeWizard();
begin
    hResourceSound := FindResource(HInstance, '_IS_SNDA', RT_RCDATA);
    pSoundMemory := LockResource(LoadResource(HInstance, hResourceSound));
    sndPlaySound(pSoundMemory, SND_MEMORY or SND_NODEFAULT or SND_ASYNC);
end;







===================================================================================================



Nightwishh


Цитата Nightwishh:



Как мне сделать звук при наведении и при нажатии у компонентов, без ботвы?
Скрипты Inno Setup. Помощь и советы [часть 6]




накатал пример при наведении и нажатии, пойдёт?


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




Код:

Код: Выделить всё

[Setup]
...
RawDataResource=SndA:bugreporter_succeeded.wav |SndB:buttonclickreleaseo.WAV
[Components]
Name: "main"; Description: "Main Files";
Name: "main\a"; Description: "A Files";
Name: "main\b"; Description: "B Files";
[code  ]
#define A = (Defined UNICODE) ? "W" : "A"
type
    HINST = THandle;
    HMODULE = HINST;
    Pointer = Longint;
    HRSRC = THandle;
    HGLOBAL = THandle;
const
    SND_ASYNC           = $0001;
    SND_NODEFAULT       = $0002;
    SND_MEMORY          = $0004;
    RT_RCDATA           = 10;
function sndPlaySound(lpszSoundName: Pointer; uFlags: UINT): BOOL; external 'sndPlaySound{#A}@Winmm.dll stdcall';
function LoadResource(hModule: HINST; hResInfo: HRSRC): HGLOBAL; external 'LoadResource@kernel32.dll stdcall';
function FindResource(hModule: HMODULE; lpName: String; lpType: Longint): HRSRC; external 'FindResource{#A}@kernel32.dll stdcall';
function LockResource(hResData: HGLOBAL): Pointer; external 'LockResource@kernel32.dll stdcall';
var
    pSoundMemory_A, pSoundMemory_B: Pointer;
function GetResourceSoundAddr(const ResourceName: String): Pointer;
var
    hResourceSound: HRSRC;
begin
    hResourceSound := FindResource(HInstance, ResourceName, RT_RCDATA);
    Result := LockResource(LoadResource(HInstance, hResourceSound));
end;
procedure ComponentsOnClickCheck(Sender: TObject);
begin
    sndPlaySound(pSoundMemory_B, SND_MEMORY or SND_NODEFAULT or SND_ASYNC);
end;
var
    LastIndex: Integer;
procedure ComponentsItemsMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
    if Index = -1 then
    begin
        LastIndex := -1;
        Exit;
    end;
    if LastIndex = -1 then
    begin
        LastIndex := Index;
        sndPlaySound(pSoundMemory_A, SND_MEMORY or SND_NODEFAULT or SND_ASYNC);
    end else
    if LastIndex = Index then Exit else
    if LastIndex  Index then
    begin
        LastIndex := Index;
        sndPlaySound(pSoundMemory_A, SND_MEMORY or SND_NODEFAULT or SND_ASYNC);
    end;
end;
procedure InitializeWizard();
begin
    LastIndex := -1;
    pSoundMemory_A := GetResourceSoundAddr('_IS_SNDA');
    pSoundMemory_B := GetResourceSoundAddr('_IS_SNDB');
    WizardForm.ComponentsList.OnItemMouseMove := @ComponentsItemsMouseMove;
    WizardForm.ComponentsList.OnClickCheck := @ComponentsOnClickCheck;
end;









исходники простого воспроизведения и звука на компонентах:
Аватара пользователя
mat_y@vk

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

Сообщение mat_y@vk »

приветствую коллеги.



Хочу обратится за помощью. Можно ли реализовать удаление содержимого каталога, в каталоге {app} без бантика?



Например в каталоге {app}\Redist удалить все что находится в каталоге Redist не трогая содержимое {App}?



В идеале хотелось бы реализовать через Checkbox, типа "хотите ли вы очистить содержимое каталога Redist" и при отмеченном checkbox что бы происходила очистка.
Ответить

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