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

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

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

Сообщение ToBeLife »

Shkutu,


Цитата Shkutu:



А вот такая проблемка. Есть код (дополняю деинсталлятор) ... Но Abort почему-то срабатывает, только если на кнопку "отмена" нажать дважды. Подскажите, плиз, можно ли с этим что-то сделать?
Скрипты Inno Setup. Помощь и советы [часть 6]




я по твоему запросу игрался с кодом. всегда вылетает исключение. К слову, вовсе необязательно присваивать UninstallProgressForm.CancelButton.ModalResult := mrAbort; при нажатии. Это можно сделать и до показывания окна в модальном режиме, например так:


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




Код:

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

procedure InitializeUninstallProgressForm();
begin
...
UninstallProgressForm.CancelButton.ModalResult := mrAbort;
...
if ShowModal = mrAbort then Abort;
end;





могу посоветивать одно (считаю это действительно самым простым): вызывать своё окно вместо стандартного

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




вот упрощённая версия:


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




Код:

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

function CreateUninstallForm: Integer;
var
    UninstallForm: TSetupForm;
    UninstallButton, ExitButton: TButton;
begin
    UninstallForm := CreateCustomForm;
    with UninstallForm do
    begin
        BorderStyle := bsSingle;
        BorderIcons := [biSystemMenu,biMinimize];
        Position := poScreenCenter;
        Caption := 'Uninstall';
        ClientWidth := ScaleX(634);
        ClientHeight := ScaleY(586);
        //uninstall button
        UninstallButton := TButton.Create(nil);
        with UninstallButton do
        begin
            Parent := UninstallForm;
            SetBounds(ScaleX(500), ScaleY(527), ScaleX(69), ScaleY(23));
            Cursor := crHand;
            Caption := SetupMessage(msgButtonYes);
            ModalResult := mrOk;
        end;
        //exit button
        ExitButton := TButton.Create(nil);
        with ExitButton do
        begin
            Parent := UninstallForm;
            SetBounds(UninstallButton.Left - UninstallButton.Width - ScaleX(16), UninstallButton.Top, UninstallButton.Width, UninstallButton.Height);
            Caption := SetupMessage(msgButtonNo);
            Cursor := crHand;
            ModalResult := mrCancel;
        end;
        Result := ShowModal;
        Free;
    end;
end;
function Unstall(): Boolean;
begin
    Result := False;
//    if   условия выполнены, то возвращаем True, что ведёт к полному удалению
//     ... 
//    then Result := True;
end;
function InitializeUninstall(): Boolean;
var
    ResultCode: Integer;
begin
    Result := False;
    if not UninstallSilent then
    begin
        Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT', '', SW_SHOW, ewNoWait, ResultCode);
        Exit;
    end;
    if CreateUninstallForm = mrOk then Result := Unstall();
end;
Аватара пользователя
Dinvin4ester

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

Сообщение Dinvin4ester »

Ребята есть скрипт -
http://sendfile.su/886094
. Писал ранее , мне ответили , но у меня не получилось . В чем проблема- не получается прописать выборочную установку . Надо чтобы напротив установки ПО по умолчанию ставилась галка,т.е. была выборочная установка и полная.
Аватара пользователя
ATTACUE

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

Сообщение ATTACUE »

Johny777, спасибо, буду пробовать.

Кстати, исключение при Abort - это если из среды запускать. Если .ехе сам по себе - то вырубается молча вроде бы, без всяких эксепшнов.

Mat_y, чтобы не перемещать, а копировать, можно использовать CopyFile



Код:

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

function CopyFile(const srcFile, destFile: PChar, FailIfExists: boolean): Integer; external 'CopyFileA@kernel32.dll stdcall';


Цитата Mat_y:



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




А совпадающих имен точно нет?
Аватара пользователя
Optitron

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

Сообщение Optitron »

Цитата Mat_y:



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




Mat_y, пробуйте.


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






Код:

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

#define A = (Defined UNICODE) ? "W" : "A"
const
    FO_MOVE = $1;
    FO_COPY = $2;
    FOF_SILENT = $0004;
    FOF_NOCONFIRMATION = $0010;
    FOF_NOCONFIRMMKDIR = $0200;
    FOF_NOERRORUI = $0400;
type
    SHFILEOPSTRUCT = record
        hwnd: HWND;
        wFunc: UINT;
        pFrom: String;
        pTo: String;
        fFlags: Longint;
        fAnyOperationsAborted: BOOL;
        hNameMappings: Longint;
        lpszProgressTitle: String;
    end;
function SHFileOperation(var lpFileOp: SHFILEOPSTRUCT): Integer; external 'SHFileOperation{#A}@shell32.dll stdcall';
/////////////////////////////////////////////////////////////////////
function xcopy(const pFrom, pTo: String; const wFunc: UINT): Integer;
var
    shfos: SHFILEOPSTRUCT;
begin
    shfos.wFunc := wFunc;
    shfos.pFrom := Format('%s'#0, [pFrom]);
    shfos.pTo := Format('%s'#0, [pTo]);
    shfos.fFlags := FOF_SILENT or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR or FOF_NOERRORUI;
    Result := SHFileOperation(shfos);
end;
/////////////////////////////
procedure InitializeWizard();
begin
    xcopy('C:\test', 'D:\backup', FO_MOVE);
end;
Аватара пользователя
ATTACUE

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

Сообщение ATTACUE »

Цитата Shkutu:



А совпадающих имен точно нет?
Скрипты Inno Setup. Помощь и советы [часть 6]




Есть... но он не только их не перемещает. Попадет на совпадение папки или файла и понеслась... можно как-то его заставить заменять одинаковые файлы.
Аватара пользователя
alexxxdar@vk

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

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

ATTACUE,



Спасибо за помощь! Что-то я прочитал документ который ты мне скинул, нашел пару функций которые мне нужно, но нифига не получается... Копирую нужные коды в раздел

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

   прописываю свои пути и ничего не работает, или вообще ошибки выбивает при компиляции, кароче я в этом ничего не понимаю...
Аватара пользователя
ATTACUE

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

Сообщение ATTACUE »

alexxxdar@vk,

Большинство ошибок при компиляции - очевидны, посмотри на них.

Возможно просто отсутствует знак ";"

или продублирован идентификатор

или какая-то функция не прописана в начале секции

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

.

Если используешь сторонние или ранее написанные скрипты как модули - ошибки могут быть и в них,

и в этом случае в ошибке прописывается - какой модуль и путь до него.

Попробуй немного разобраться с кодом в примерах. Знаю - это сложно, но возможно тогда ты увидишь и поймешь свои ошибки.

В настройках Inno Setup включи отображение номеров строк - проще будет ориентироваться по коду.

А еще лучше - используй Inno Setup [url=http://innoultra.ru/]отсюда[/url].

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

Посмотри [url=http://rghost.ru/users/Arsen19/releases/Russkaya-spravka-k-Inno-Setup]этот документ[/url] или [url=http://innoultra.ru/?page_id=18]на этой странице[/url] тоже есть интересные примеры (например Бекап файлов).

Уверен - они тебе не раз помогут.

К сожалению больше ни чем конструктивным помочь я не смогу.
Аватара пользователя
alexxxdar@vk

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

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

Цитата Mat_y:



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




Используя MoveFile(const srcFile, destFile: PChar): Integer - нет. Эта функция, если destFile файл существует, работать не будет. Из вариантов - копирование вместо перемещения



Код:

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

function CopyFile(const srcFile, destFile: PansiChar, FailIfExists: boolean): Integer; 
 external 'CopyFileA@kernel32.dll stdcall'; //если FailIfExists=false, то файл перезапишется

.

Или перемещение вот-так



Код:

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

function MoveFileEx(const srcFile, destFile: PansiChar, dwFlags: DWORD): Integer;
 external 'MoveFileExA@kernel32.dll stdcall'; // если dwFlags=1 (MOVEFILE_REPLACE_EXISTING), то файл тоже перезапишется

Подробнее про все эти функции можно читать например на msdn
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx


Но по-моему эти функции могут не работать, если исходный и конечный файлы находятся на разных дисках.

Или просто используй то, что ребята насоветовали Изображение
Аватара пользователя
nik1967

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

Сообщение nik1967 »

alexxxdar@vk, слишком много бегинов и эндов. Куда столько?
можно проще :)



Код:

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

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then begin
    if DirExists(ExpandConstant('{app}\res_mods')) then begin
      DelTree(ExpandConstant('{app}\res_mods'), True, True, True);
      CopyDir(ExpandConstant('{app}\res\audio'),ExpandConstant('{app}\res_mods\0.8.9'));
      CopyDir(ExpandConstant('{app}\res\text'),ExpandConstant('{app}\res_mods\0.8.9'));
    end;
  end;
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usPostUninstall then begin
    DelTree(ExpandConstant('{app}\res_mods\0.8.9\audio'), True, True, True);
    DelTree(ExpandConstant('{app}\res_mods\0.8.9\text'), True, True, True);
  end;
end;
Аватара пользователя
alexxxdar@vk

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

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

Цитата Shkutu:



Из вариантов - копирование вместо перемещения

Код:

function CopyFile(const srcFile, destFile: PansiChar, FailIfExists: boolean): Integer;

external 'CopyFileA@kernel32.dll stdcall'; //если FailIfExists=false, то файл перезапишется

.

Или перемещение вот-так

Код:

function MoveFileEx(const srcFile, destFile: PansiChar, dwFlags: DWORD): Integer;

external 'MoveFileExA@kernel32.dll stdcall'; // если dwFlags=1 (MOVEFILE_REPLACE_EXISTING), то файл тоже перезапишется
Скрипты Inno Setup. Помощь и советы [часть 6]




Я попробовал оба варианта... все равно натыкается на существующий фаил и стопорится.
Ответить

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