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

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

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

Сообщение Optitron »

Цитата Optitron:



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






Код:

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

[Components]
Name: a; Description: Папка 1
Name: b; Description: Папка 2
Name: c; Description: C:\Windows\Папка
Name: d; Description: C:\Program Files\Папка
Name: e; Description: C:\Папка
[Files]
Source: Папка\*; DestDir: {app}\Папка1; Flags: ignoreversion recursesubdirs createallsubdirs; Components: a
Source: Папка\*; DestDir: {app}\Папка2; Flags: ignoreversion recursesubdirs createallsubdirs; Components: b
Source: Папка\*; DestDir: {win}\Папка; Flags: ignoreversion recursesubdirs createallsubdirs; Components: c
Source: Папка\*; DestDir: {pf}\Папка; Flags: ignoreversion recursesubdirs createallsubdirs; Components: d
Source: Папка\*; DestDir: {sd}\Папка; Flags: ignoreversion recursesubdirs createallsubdirs; Components: e
Аватара пользователя
El Sanchez

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

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

Raf-9600,
Цитата Raf-9600:



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




вот пример. Перенёс отсюда
http://programmersforum.ru/showthread.php?p=426736


попутно читал справку, чего и тебе советую, тк возможностей много, например регулировка громкости, отображение прогресса, перемотка, итд

http://www.un4seen.com/doc/#bass/BAS...reateFile.html




короче вот код конкретно по твоему вопросу:


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




Код:

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

[Files]
Source: bass.dll; Flags: dontcopy

[Code    ]
type
    HSYNC = DWORD;
    SYNCPROC = Longint;
    Pointer = Longint;
    HSTREAM = DWORD;
const
    BASS_SYNC_END       = 2;
    BASS_UNICODE        = $80000000;
function BASS_ChannelRemoveSync(handle: DWORD; sync: HSYNC): BOOL; external 'BASS_ChannelRemoveSync@files:bass.dll stdcall';
function BASS_ChannelSetSync(handle: DWORD; type_: DWORD; param1, param2: DWORD; proc: SYNCPROC; user: Pointer): HSYNC; external 'BASS_ChannelSetSync@files:bass.dll stdcall';
function BASS_Init(device: LongInt; freq, flags: DWORD; win: HWND; clsid: Pointer): BOOL; external 'BASS_Init@files:bass.dll stdcall';
function BASS_StreamCreateFile(mem: BOOL; f: String; offset1: DWORD; offset2: DWORD; length1: DWORD; length2: DWORD; flags: DWORD): HSTREAM;
  external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_StreamFree(handle: HSTREAM): BOOL; external 'BASS_StreamFree@files:bass.dll stdcall';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): BOOL; external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_Free(): BOOL; external 'BASS_Free@files:bass.dll stdcall';
var
    Channel: HSTREAM;
    PlaySync: DWORD;
    BassInitialized: BOOL;
    StopBtn, PlayBtn: TButton;
// Процедура которая будет вызвана по окончанию проигривания файла
procedure ChannelEndSync(handle: HSYNC; Stream, data: DWORD; user: Pointer); 
begin
    // Вот здесь обрабатывайте окончание!
    // Когда Channel доиграет до конца, то будет вызвана эта процедура
    // Например освободим этот поток который проигрался
    // Сперва удалим обработку
    BASS_ChannelRemoveSync(Stream, Handle);
    // Освободим поток
    BASS_StreamFree(Stream);
    // Очистим переменные
    Channel := 0;
    PlaySync := 0;
    // Покажем пользователю что файл проигран до конца...
    //MsgBox('Файл проигран!', mbInformation, MB_OK);
    StopBtn.Enabled := False;
end;
// Просто процедура которая открывает файл и проигривает его
procedure BASS_PlayFile(const FilePath: String);
begin
    if Channel = 0 then
    begin
        // Открываем файл...
        Channel := BASS_StreamCreateFile(False, FilePath, 0, 0, 0, 0,
        #ifdef UNICODE
            BASS_UNICODE
        #else
            0
        #endif
        );
        // Начинаем его воспроизведение
        BASS_ChannelPlay(Channel, False);
        // А вот здесь используем флаг BASS_SYNC_END и указываем на нашу процедуру
        // ChannelEndSync котора будет запущена по окончанию проигривания файла
        PlaySync := BASS_ChannelSetSync(Channel, BASS_SYNC_END, 0, 0, CallbackAddr('ChannelEndSync'), 0);
    end else
    begin
        // Если файл уже играет, то отключаем его
        BASS_ChannelRemoveSync(Channel, PlaySync);
        BASS_StreamFree(Channel);
        // Открываем файл...
        Channel := BASS_StreamCreateFile(False, FilePath, 0, 0, 0, 0,
        #ifdef UNICODE
            BASS_UNICODE
        #else
            0
        #endif
        );
        // Начинаем его воспроизведение
        BASS_ChannelPlay(Channel, False);
        // А вот здесь используем флаг BASS_SYNC_END и указываем на нашу процедуру
        // ChannelEndSync котора будет запущена по окончанию проигривания файла
        PlaySync := BASS_ChannelSetSync(Channel, BASS_SYNC_END, 0, 0, CallbackAddr('ChannelEndSync'), 0);
    end;
end;
function InitBass(const _hwnd: HWND): BOOL;
begin
    Result := BassInitialized;
    if not Result then
    begin
        Result := BASS_Init(-1, 44100, 0, _hwnd, 0);
        BassInitialized := Result;
    end;
end;
procedure StopAndFree();
begin
    if PlaySync  0 then
    begin
        BASS_ChannelRemoveSync(Channel, PlaySync);
        PlaySync := 0;
    end;
    // Освободим поток
    if Channel  0 then
    begin
        BASS_StreamFree(Channel);
        Channel := 0;
    end;
end;
function DeInitBass(): BOOL;
begin
    Result := not BassInitialized;
    if not Result then
    begin
        Result := Bass_Free();
        BassInitialized := not Result;
    end;
end;
///////////////////////////////////  demo  /////////////////////////////////
procedure BtnClick(Sender: TObject);
var
    uFilePath: String;
begin
    case TButton(Sender) of
        PlayBtn:
        begin
            uFilePath := '';
            if GetOpenFileName('Choose audio file', uFilePath, ExpandConstant('{userdesktop}'), 'mp3 files (*.mp3)|*.mp3|All files (*.*)|*.*', 'mp3') then
              if uFilePath  '' then
                BASS_PlayFile(uFilePath);
            StopBtn.Enabled := True;
        end;
        StopBtn:
        begin
            StopAndFree();
            StopBtn.Enabled := False;
        end;
    end;
end;
procedure InitializeWizard();
begin
    BassInitialized := False;
    InitBass(0);
    //////////////////////////////////
    WizardForm.OuterNotebook.Hide;
    PlayBtn := TButton.Create(WizardForm);
    with PlayBtn do
    begin
        Parent := WizardForm;
        SetBounds(100, 100, 65, 25);
        Caption := 'Play';
        OnClick := @BtnClick;
    end;
    StopBtn := TButton.Create(WizardForm)
    with StopBtn do
    begin
        Parent := WizardForm;
        SetBounds(200, 100, 65, 25);
        Caption := 'Stop';
        OnClick := @BtnClick;
    end;
end;
procedure DeinitializeSetup();
begin
   DeInitBass();
end;
[/color]
Аватара пользователя
Nordek

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

Сообщение Nordek »

Всем здравствуйте!

Подскажите плиз, как можно на момент запуска деинсталлятора узнать текущую директорию, где находится этот самый деинсталлятор. GetCurrentDir почему-то возвращает не директорию расположения, а систем32
Аватара пользователя
Shkutu

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

Сообщение Shkutu »

парни,спасайте

есть готовый javascript,в котором выполняется настройки браузера и надежных узлов,так же 3 файла,которые выполняются в скрипте .bat, reg, msi,нужно ,чтобы запускался скрипт с помощью установщика,сделал задачу через sfx архив,но хотелось бы сделать красивый установщик,решил сделать через inno setup,сейчас получается,что Myprogram(установщик,который я собрал) устанавливается,после этого только запускается сам файл,зачем лишняя программа нужна,а цель моей настроить браузер и установить msi,а я хотел бы,чтобы сразу запускался мой скрипт,который я сделал через sfx и был бар прогресса

подскажите,как мне сделать такой установщик?
Аватара пользователя
FX-DENIS

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

Сообщение FX-DENIS »

Johny777, Спасибо! Никаких особых проблем не возникло. Единственная мелочь: в твоём коде проверка в процедуре BASS_PlayFile такая if Channel 0 then, а должно быть if Channel = 0 then.



Собственно вот как эта часть выглядит у меня:


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




Код:

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

// Просто процедура которая открывает файл и проигривает его
function BASS_PlayFile(const Sounds: array of String): boolean;
var
    TempSoundName, uSoundPath: String;
    i: integer;
begin
    i := GetArrayLength(Sounds);
    TempSoundName := Sounds[Random(i)];
    // Не воспроизводим один файл два раза под ряд если их хотябы два.
    if i >= 1 then
        if TempSoundName = uSoundName then
            BASS_PlayFile(Sounds)
        else
            uSoundName := TempSoundName;
    if not FileExists(AddBackslash(RemoveBackslash(ExpandConstant('{tmp}'))) + 'BASS.dll') then ExtractTemporaryFile('BASS.dll');
    uSoundPath := ExpandConstant(AddBackslash(RemoveBackslash(ExpandConstant('{tmp}'))) + uSoundName);
    if not FileExists(uSoundPath) then ExtractTemporaryFile(uSoundName);
    if Channel = 0 then
    begin
        // Открываем файл...
        Channel := BASS_StreamCreateFile(False, uSoundPath, 0, 0, 0, 0,
        #ifdef UNICODE
            BASS_UNICODE
        #else
            0
        #endif
        );
        // Начинаем его воспроизведение
        Result := BASS_ChannelPlay(Channel, False);
        // А вот здесь используем флаг BASS_SYNC_END и указываем на нашу процедуру
        // ChannelEndSync котора будет запущена по окончанию проигривания файла
        PlaySync := BASS_ChannelSetSync(Channel, BASS_SYNC_END, 0, 0, CallbackAddr('ChannelEndSync'), 0);
    end else
    begin
        // Если файл уже играет, то отключаем его
        BASS_ChannelRemoveSync(Channel, PlaySync);
        BASS_StreamFree(Channel);
        // Открываем файл...
        Channel := BASS_StreamCreateFile(False, uSoundPath, 0, 0, 0, 0,
        #ifdef UNICODE
            BASS_UNICODE
        #else
            0
        #endif
        );
        // Начинаем его воспроизведение
        Result := BASS_ChannelPlay(Channel, False);
        // А вот здесь используем флаг BASS_SYNC_END и указываем на нашу процедуру
        // ChannelEndSync котора будет запущена по окончанию проигривания файла
        PlaySync := BASS_ChannelSetSync(Channel, BASS_SYNC_END, 0, 0, CallbackAddr('ChannelEndSync'), 0);
    end;
end;
Аватара пользователя
icetanker

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

Сообщение icetanker »

Цитата Shkutu:



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




Shkutu,



Код:

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

function InitializeUninstall(): Boolean;
begin
    Result := True;
    MsgBox(ExtractFileDir(ExpandConstant('{uninstallexe}')), mbInformation, MB_OK);
end;
Аватара пользователя
Nordek

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

Сообщение Nordek »

Спрашивал на руборде

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

возможно ли

если пользователь выбрал установку этой программы, выходило сообщение

"Внимание! Прежде чем установить эту программу, необходимо установить бла бла бла... Выполнить необходимые условия?" и кнопки в этом сообщении

Да (я позже выполню) - тогда чекбокс автоматом с этой проги снимается и продолжается установка других компонентов (если они выбраны)

Нет (уже установлено) - тогда чекбокс автоматом с этой проги НЕ снимается и продолжается установка выбраной 1.exe и других компонентов (если они выбраны)



дали скрипт





Код:

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

[components] 
Name: fuck; Description: lol; 
Name: fuck2; Description: lol2; 
[_code] 
procedure CurPageChanged(CurPageID: Integer); 
var i: integer; 
begin 
if Curpageid=wpWelcome then 
  if MsgBox('fuck',mbInformation,mb_YesNo)=idyes then 
    for i:=0 to WizardForm.ComponentsList.ItemCount-1 do 
      begin 
        MsgBox(WizardForm.ComponentsList.ItemCaption[i],mbinformation,mb_ok); 
        if WizardForm.ComponentsList.ItemCaption[i]='lol' then WizardForm.ComponentsList.Checked[i]:=False else WizardForm.ComponentsList.Checked[i]:=True; 
      end; 
end;

при компоновке вываливается ошибка



Изображение



как исправить или может какой другой есть скрипт?
Аватара пользователя
Optitron

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

Сообщение Optitron »

Raf-9600,




Цитата Raf-9600:



Единственная мелочь: в твоём коде проверка в процедуре BASS_PlayFile такая if Channel 0 then, а должно быть if Channel = 0 then.
Скрипты Inno Setup. Помощь и советы [часть 6]




Не такая уж и мелочь. Благодарю! Я её проглядел.


Цитата Raf-9600:



Собственно вот как эта часть выглядит у меня. Не воспроизводим один файл два раза под ряд если их хотябы два.
Скрипты Inno Setup. Помощь и советы [часть 6]




Ну давай теперь разбирать, что ты там написал Изображение

if i >= 1 then

означает "если длина массива больше-равно 1".

Не вижу смысла. Если длина массива 1, то рандом не нужен

Если больше одного, рандом уместен

те мы уже пишем

if i = 1 then uSoundName := Sounds[0]

else

if i > 1 then ипользуем рандом, но

ты хочешь чтоб файлы не проигрывались два раза подряд и рекурсивно вызываешь BASS_PlayFile() пока значения TempSoundName и uSoundName будут разными.

Да функция GetArrayLength() и Random() работают быстро, но мы не знаем сколько раз пройдёт рекурсия пока рандом не выдаст другое значение. Те тут крайне нестабильная секция кода с точки зрения скорости. Другими словами очень желательно другое решение. В данном случае модификация рандома. Вот кокретно для решения этой задачи наваял код:

алгоритм простой - чистая математика

функция function RandRange(const LeftInt, RightInt: Integer): Integer;

где LeftInt - левая граница

RightInt - правая

условие RightInt > LeftInt хотя бы на 1

например мы хотим получить случайные числа от 2 до 7 включительно.

функция

function NotRandRand(const LeftInt, RightInt: Integer; var LastResultInt: Integer): Integer;

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

условие: переменная, которую отправляем в var LastResultInt: Integer должна быть глобальной (это съест всего лишь 4 байта памяти процесса), иначе ничего работать не будет!

как она работает думаю понятно по коду. Единственное скажу, что если последнее выпавшее число не равно левой границе и павой, то значит речь идёт о 2-х половинах

и тут мы доверим рандому case Random(2) of

например у нас числа 1...7. Вапало 5. --> в след. раз в Random(2) выпал 0 (рандом возвращает входное значение -1), то мы выполним RandRange(1, 5-1)

если выпала 1, то RandRange(5+1, 7)

короче говоря никаких повторов 222, 33, итд. Минимум через 1

вот код:


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




Код:

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

function RandRange(const LeftInt, RightInt: Integer): Integer;
begin
    Result := Random( (RightInt + 1)-LeftInt ) + LeftInt;
end;
function NotRandRand(const LeftInt, RightInt: Integer; var LastResultInt: Integer): Integer;
begin
    Result := RandRange(LeftInt, RightInt);
    if Result = LastResultInt then
    begin
        if LastResultInt = LeftInt then
          Result := RandRange(LeftInt+1, RightInt)
        else
        if LastResultInt = RightInt then
          Result := RandRange(LeftInt, RightInt-1)
        else
        case Random(2) of
            0: Result := RandRange(LeftInt, LastResultInt-1);
            1: Result := RandRange(LastResultInt+1, RightInt);
        end;
    end;
    LastResultInt := Result;
end;
procedure Test();
var
    sArray: array [0..3] of String;
    S: String;
    i, e, L, R, LastInt: Integer;
begin
    for i := 0 to 3 do
    begin
        sArray[i] := IntToStr(i+1) + ')' + #32;
        case i of
            0:
            begin
                L := 1;
                R := 9;
            end;
            1:
            begin
                L := 7;
                R := 8;
            end;
            2:
            begin
                L := 2;
                R := 16;
            end;
            3:
            begin
                L := 0;
                R := 1;
            end;
        end;
        for e := 0 to 7 do
          sArray[i] := sArray[i] + #32#32#32 + IntToStr(NotRandRand(L, R, LastInt));
        LastInt := 0;
    end;
    S := sArray[0];
    for i := 1 to 3 do
      S := S + #13#10 + sArray[i];
    MsgBox(S, mbInformation, MB_OK);
end;
procedure InitializeWizard();
begin
    Test();
end;



процедура Test(); отладочная. Вот мой результат


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






обрати внимание на 2 и 4-ю строку. Как и следовало ожидать при RightInt - LeftInt = 1 значения чередуются

вот твой участок кода (обновлённый):


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




Код:

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

var
    LastInt: Integer;
function BASS_PlayFile(const Sounds: array of String): boolean;
var
    TempSoundName, uSoundPath: String;
    Len: integer;
begin
    Len := GetArrayLength(Sounds);
    // Не воспроизводим один файл два раза под ряд если их хотябы два.
    if Len = 1 then
      uSoundName := Sounds[0];
    else
    if Len > 1 then
      uSoundName := Sounds[  NotRandRand(0, Len-1, LastInt)  ];





Хочу заметить. У меня лежит код (пока времени нет довести до ума Изображение ) настоящего рандома из микрофона ноутбука. Те шум окружающей среды. И там бывают подряд повторяющиеся значения. Те повтор для рандома это нормально, в противном случае это не рандом, а какой-то счётчик!



строка

if not FileExists(AddBackslash(RemoveBackslash(ExpandConstant('{tmp}'))) + 'BASS.dll') then ExtractTemporaryFile('BASS.dll');

не нужна (заметь у меня в коде её нет), тк BASS.dll итак извлекается для последующей её динамичной загрузки



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



ispolin, у меня компилятор на Свойство ItemCount не ругается. Использую расширенную версию(не самую новую - 5.4.3). В шапке есть ссылка на расширенную.
Аватара пользователя
icetanker

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

Сообщение icetanker »

Цитата Johny777:



В шапке есть ссылка на расширенную.
Скрипты Inno Setup. Помощь и советы [часть 6]




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



El Sanchez, Добавь пожалуйста ссылки на соответствующую версию хотя бы под спойлер "Расширенная версия Inno Setup от Restools".



Пример:


Расширенная версия Inno Setup от Restools




Рекомендуемая версия:

isetup-5.5.1.exe
- ANSI версия

ispack-5.5.1-unicode.exe
- Unicode версия



Сайт:
http://restools.hanzify.org/


Скачать:
Inno Setup Compiler
build 121216;
Inno ISCmplr Setup
build 121002;

Рекомендуется к применению из-за огромного количества компонентов, функций и процедур, удобного интерфейса, наличия отладчика и Form Designer. Собран на основе исходников Inno Setup 5.5.1.




Инструкция по установке




Инструкция по установке:Установите ispack-X.X.X.exe или ispack-X.X.X-unicode.exe (X.X.X - номер актуальной версии);Скачайте Inno Setup Compiler, распакуйте;Из одноимённой папки, в соответствии с установленной версией (Ansi или Unicode), скопируйте два файла (Compil32.exe, Templates.dat) в каталог Inno Setup (по умолчанию: C:\Program Files\Inno Setup 5\). Появится сообщение с подтверждением о замене файла, нажимаем 'Да'.

Примечание: если у вас Unicode версия, то дополнительно примените твик реестра (файл CourierNew.reg) из папки UnicodeFontLink и перезагрузите компьютер.Скачайте Inno ISCmplr Setup, распакуйте;Из одноимённой папки, в соответствии с установленной версией (InnoSetup_ANSI или InnoSetup_Unicode), из подпапки FullVCL скопируйте все файлы в каталог Inno Setup (по умолчанию: C:\Program Files\Inno Setup 5\). Появится сообщение с подтверждением о замене файла, нажимаем 'Да'.
Аватара пользователя
El Sanchez

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

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

icetanker,



Код:

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

[Setup]
AppName=Security
AppVersion=1.0
CreateAppDir=no
Uninstallable=no
CreateUninstallRegKey=no
[Languages]
Name: default; MessagesFile: compiler:Default.isl
Name: english; MessagesFile: compiler:Languages\English.isl
[Files]
Source: security.exe; DestDir: {tmp}; Flags: deleteafterinstall
[Run]
Filename: {tmp}\security.exe; Parameters: -e -aoa -y; StatusMsg: Installing Security...; Flags: runhidden
Ответить

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