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

Статус
В этой теме нельзя размещать новые ответы.

Devils Night

Ветеран
Такой вопрос: насчёт #define AppID, я что-то пробовал вставить AppId={{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24} вместо AppId=TheBestAppIdEverMade, компилится нормально, но выдаёт ошибку: Exception Internal error: Failed to pause "reg" constant, где грабли?
Вообще расчитываю на #define AppID "{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24}"
Вот:
Код:
#define AppID "{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24}"
#define AppName "My Program"
#define AppExeName "MyProg.exe"
#define InExe "setup.exe"
#define UnExe "unins000.exe"

[Setup]
AppId={{#AppID}
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}


[Files]
Source: hl2.exe; DestDir: {app}\common\half-life 2; Flags: ignoreversion createallsubdirs recursesubdirs sortfilesbyextension sortfilesbyname


[  Code]
var
  Run_Button: TNewButton;
  Del_Button: TNewButton;
  AppPath, UninsPath: string;
  ResultCode: Integer;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') then
  Confirm:= False;
end;

procedure UninstallButtonClick(Sender: TObject);
begin
  Exec(UninsPath, '', '' , SW_SHOW, ewNoWait, ResultCode);
  SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);          
end;

procedure RunButtonClick(Sender: TObject);
begin
  Exec(AppPath + '\common\half-life 2\hl2.exe', '', '', SW_SHOW, ewNoWait, ResultCode);
  SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
end;

procedure InitializeWizard;
begin
  AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|}'));
  UninsPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,UninstallString|}'));
    { Run_Button }
      Run_Button := TNewButton.Create(WizardForm);
      with Run_Button do
      begin
        Name := 'Run_Button';
        Parent := WizardForm;
        Left := ScaleX(240);
        Top := ScaleY(327);
        Width := ScaleX(75);
        Height := ScaleY(23);
        Caption := 'Запустить';
        OnClick := @RunButtonClick;
        Enabled := FileExists(AppPath + '\common\half-life 2\hl2.exe');
      end;

    { Del_Button }
      Del_Button := TNewButton.Create(WizardForm);
      with Del_Button do
      begin
        Name := 'Del_Button';
        Parent := WizardForm;
        Left := ScaleX(153);
        Top := ScaleY(327);
        Width := ScaleX(75);
        Height := ScaleY(23);
        Caption := 'Удалить';
        OnClick := @UninstallButtonClick;
      end;

    if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') then
    MsgBox('Программа {#AppName} уже установлена',mbError,MB_OK);

end;

procedure CurPageChanged(CurPageID: Integer);
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') and (CurPageId=wpWelcome)
  then
    begin
      Run_Button.Visible := True;
      Del_Button.Visible := True;
      WizardForm.NextButton.Caption := 'Продолжить';
    end
  else
    begin
      Run_Button.Visible := false;
      Del_Button.Visible := false;
    end;
end;
P.S Компилится нормально, но инсталлятор не запускается.
[HR][/HR]
Katarn, По моему YURSHAT уже выкладывал несколько страниц назад, не оно?!
скачивать я пока не могу...
В принципе, много, много всего, можно скачать с сайта RESTOOLS, это факт, что я в первую очередь и сделал, ну а какой то эксклюзивчик, можно найти на этом сайте!
 
Последнее редактирование:

Katarn

Новичок
Devils Night, Нет не оно, это просто библиотека "get_hw_caps.dll" версии 1.003, она у меня есть, за сайт от RESTOOLS, благодарю посмотрю что у них есть...
Теперь на счёт твоего вопроса: 1) Вот перевод твоей ошибки: Исключительная Внутренняя ошибка. Потерпевшее неудачу, чтобы останавливаться константу "рег"!!!

2) Попробуй вот так:
#define AppID "{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24}"
#define AppName "My Program"
#define AppExeName "MyProg.exe"
#define InExe "setup.exe"
#define UnExe "unins000.exe"

[Setup]
AppId={{#AppID}
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}


[Files]
Source: hl2.exe; DestDir: {app}\common\half-life 2; Flags: ignoreversion createallsubdirs recursesubdirs sortfilesbyextension sortfilesbyname

Код:
var
  Run_Button: TNewButton;
  Del_Button: TNewButton;
  AppPath, UninsPath: string;
  ResultCode: Integer;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:= False;
end;

procedure UninstallButtonClick(Sender: TObject);
begin
  Exec(UninsPath, '', '' , SW_SHOW, ewNoWait, ResultCode);
  SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
end;

procedure RunButtonClick(Sender: TObject);
begin
  Exec(AppPath + '\common\half-life 2\hl2.exe', '', '', SW_SHOW, ewNoWait, ResultCode);
  SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
end;

procedure InitializeWizard;
begin
  AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Mi  crosoft\Windows\CurrentVersion\Uninstall\{#SetupSe  tting("AppID")}_is1,InstallLocation|}'));
  UninsPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Mi  crosoft\Windows\CurrentVersion\Uninstall\{#SetupSe  tting("AppID")}_is1,UninstallString|}'));
    begin
    { Run_Button }
      Run_Button := TNewButton.Create(WizardForm);
      with Run_Button do
      begin
        Name := 'Run_Button';
        Parent := WizardForm;
        Left := ScaleX(240);
        Top := ScaleY(327);
        Width := ScaleX(75);
        Height := ScaleY(23);
        Caption := 'Запустить';
        OnClick := @RunButtonClick;
      end;

    { Del_Button }
      Del_Button := TNewButton.Create(WizardForm);
      with Del_Button do
      begin
        Name := 'Del_Button';
        Parent := WizardForm;
        Left := ScaleX(153);
        Top := ScaleY(327);
        Width := ScaleX(75);
        Height := ScaleY(23);
        Caption := 'Удалить';
        OnClick := @UninstallButtonClick;
      end;

    if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninsta  ll\{#SetupSetting("AppID")}_is1') then
    MsgBox('Программа {#AppName} уже установлена',mbError,MB_OK);

    if FileExists(AppPath + '\common\half-life 2\hl2.exe') then
    begin
      Run_Button.Enabled:=true;
    end
    else
      Run_Button.Enabled:=false;
    end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninsta  ll\{#SetupSetting("AppID")}_is1') and (CurPageId=wpWelcome)
  then
    begin
      Run_Button.Visible := True;
      Del_Button.Visible := True;
      WizardForm.NextButton.Caption := 'Продолжить';
    end
  else
    begin
      Run_Button.Visible := false;
      Del_Button.Visible := false;
      WizardForm.Caption := ExpandConstant(SetupMessage(msgButtonNext));
    end;
end;[/SPOILER] У меня он скомпилился без ошибок...
 

Katarn

Новичок
Devils Night, Пробуй как я тебе написал, у меня он и скомпилился, и запустился и установился!!!
 

Devils Night

Ветеран
Katarn, Даже не компилит твой пример, пишет:
[ISSP] Undeclared identifer: "SetupSe" - т.е не объявлен идентификатор "SetupSe" для ISSP.
или опять же, пишет:
Exception Internal error: Failed to pause "reg" constant - т.е Внутренняя исключительная ошибка: Приостановлено на не верной константе "reg".

Если что у меня Расширенная версия компилятора (Ansi)!

Нет не оно, это просто библиотека "get_hw_caps.dll" версии 1.003, она у меня есть.
Katarn, Вот на ru-board-е есть.
 
Последнее редактирование:

Katarn

Новичок
Если что у меня Расширенная версия компилятора (Ansi)!
Если что у меня тоже расширенная версия и тоже Anci ! И при компиляции ругался на эти строки с константой (#SetupSe), с той же ошибкой что и у тебя.
AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSe tting("AppID")}_is1,InstallLocation|}'));
UninsPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSe tting("AppID")}_is1,UninstallString|}'));
Я их попросту закомментировал, когда делал компиляцию..
 
Последнее редактирование:

Devils Night

Ветеран
Я их попросту закомментировал, когда делал компиляцию.
Ну, ну, :facepalm:! Нафига :o?Ты рабочий скрипт проверял, пробовал рабочий скрипт сомпилить, потом установить инсталлятор, потом этот же инсталлятор опять запустить? Видимо нет!
В общем после установки, если ещё раз запускаешь установку, то там появляются 4-е кнопки, Удалить | Запустить | продолжить | Отмена.

Код:
//#define AppID "{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24}"
#define AppName "My Program"
#define AppExeName "MyProg.exe"
#define InExe "setup.exe"
#define UnExe "unins000.exe"

[Setup]
AppId=000
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}


[Files]
Source: hl2.exe; DestDir: {app}\common\half-life 2; Flags: ignoreversion createallsubdirs recursesubdirs sortfilesbyextension sortfilesbyname


[ Code]
var
  Run_Button: TNewButton;
  Del_Button: TNewButton;
  AppPath, UninsPath: string;
  ResultCode: Integer;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') then
  Confirm:= False;
end;

procedure UninstallButtonClick(Sender: TObject);
begin
  Exec(UninsPath, '', '' , SW_SHOW, ewNoWait, ResultCode);
  SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
end;

procedure RunButtonClick(Sender: TObject);
begin
  Exec(AppPath + '\common\half-life 2\hl2.exe', '', '', SW_SHOW, ewNoWait, ResultCode);
  SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
end;

procedure InitializeWizard;
begin
  AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|}'));
  UninsPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,UninstallString|}'));
    { Run_Button }
      Run_Button := TNewButton.Create(WizardForm);
      with Run_Button do
      begin
        Name := 'Run_Button';
        Parent := WizardForm;
        Left := ScaleX(240);
        Top := ScaleY(327);
        Width := ScaleX(75);
        Height := ScaleY(23);
        Caption := 'Запустить';
        OnClick := @RunButtonClick;
        Enabled := FileExists(AppPath + '\common\half-life 2\hl2.exe');
      end;

    { Del_Button }
      Del_Button := TNewButton.Create(WizardForm);
      with Del_Button do
      begin
        Name := 'Del_Button';
        Parent := WizardForm;
        Left := ScaleX(153);
        Top := ScaleY(327);
        Width := ScaleX(75);
        Height := ScaleY(23);
        Caption := 'Удалить';
        OnClick := @UninstallButtonClick;
      end;

    if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') then
    MsgBox('Программа {#AppName} уже установлена',mbError,MB_OK);

end;

procedure CurPageChanged(CurPageID: Integer);
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') and (CurPageId=wpWelcome)
  then
    begin
      Run_Button.Visible := True;
      Del_Button.Visible := True;
      WizardForm.NextButton.Caption := 'Продолжить';
    end
  else
    begin
      Run_Button.Visible := false;
      Del_Button.Visible := false;
    end;
end;

David.D.Rocco, Ну я вообще то понял давно! А ничего что в примере который выкладывал, вообще то их там и так нет? Пример выше, и полностью рабочий.
Но только стоит добавить: AppId={{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24} или #define AppID "{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24}", то в примере выдаёт ошибку.

David.D.Rocco, Katarn, Насчёт пробелов, это ошибка тега [Source]
 
Последнее редактирование:

dark_fen1x

Мимокрокодил
Пожалуйста подскажите как заменить форму выбора языка перед запуском инсталятора на что-нибудь подобное?
 

AlexandR

Новичок
Всем добрый вечер! Есть пару вопросов:
  1. Есть ли способ полностью скрыть(удалить) функции и иконку(16х16) в левом вверхнем углу при использовании ботвы, пробовал стандарт WizardForm.BorderStyle := bsDialog; работает, но возникает другая причина: скрываются картинки загруженные через ботву?
  2. При использовании библеотеки ISWin7.dll, кнопка у которой изменен текст или даже у созданной вообще новой кнопке, шрифт отображается прозрачно по сравнению с обычными (см.ниже), можно ли как нибудь убрать прозрачность в шрифте?
 

Snoopak96

Старожил
скрываются картинки загруженные через ботву?
Естественно скрывается, т.к. доступность кнопки наверно по стандартной сделана, т.е. скрываешь стандартную --> скроешь и свою на ботве.
можно ли как нибудь убрать прозрачность в шрифте?
После смены текста на кнопке нужно перерисовать кнопку:
WizardForm.BackButton.Refresh;

Добавлено через 2 минуты
По первому вопросу проще сделать так (если я правильно понял про что ты):

Код:
procedure CloseBtnClick(h:HWND);
begin
  WizardForm.Close;
end;
procedure InitializeWizard;
begin
  BtnSetEvent(CloseBtn,BtnClickEventID,WrapBtnCallback(@CloseBtnClick,1));
end;
 

Adil

Старожил
Всем добрый день. Сделал скрипт вот
2012-05-09 18-39-30.jpg
При нажатии на кнопку Х инсталлятор закрывается,
но во время распаковки при нажатии на кнопку Х
инсталлятор не закрывается, прогрессбар исчезает, а файлы дальше распаковывается.
Потом нажимаю на кнопку отмена, и инстал выдает ошибку.
Пробывал чета сделать но не смог. Помогите кому не трудно.
Заранее спасибо
 

Snoopak96

Старожил
nazbek010,
http://rghost.ru/37992690

AlexandR,
Это lol добавлять кнопку после инициализации стекла.



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

Devils Night

Ветеран
Вылазит ошибка: Unknown identifier 'Result', как исправить?

Код:
#define AppName "My Program"
#define InstallKill_1

[Setup]
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Messages]
rus.SetupWindowTitle={#AppName}

[Icons]
Name: "{group}\{cm:UninstallProgram,{#AppName}}"; Filename: "{uninstallexe}"

[Files]
Source: compiler:Dll Pack\ISTask.dll; DestDir: {app}; Flags: ignoreversion

[ Code]
function RunTask1(FileName: AnsiString; bFullpath: Boolean): Boolean;
  external 'RunTask@files:ISTask.dll stdcall';
function KillTask1(ExeFileName: AnsiString): Integer;
  external 'KillTask@files:ISTask.dll stdcall';

function RunTask2(FileName: AnsiString; bFullpath: Boolean): Boolean;
  external 'RunTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';
function KillTask2(ExeFileName: AnsiString): Integer;
  external 'KillTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';

function RunTask3(FileName: AnsiString; bFullpath: Boolean): Boolean;
  external 'RunTask@files:ISTask.dll stdcall';
function KillTask3(ExeFileName: AnsiString): Integer;
  external 'KillTask@files:ISTask.dll stdcall';

function RunTask4(FileName: AnsiString; bFullpath: Boolean): Boolean;
  external 'RunTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';
function KillTask4(ExeFileName: AnsiString): Integer;
  external 'KillTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';
  
  
function InitializeSetup(): Boolean;
begin
  if RunTask1('Compil32.exe', False) then
  begin
    if MsgBox('Программа Compil32.exe используется. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
    begin
      KillTask1('Compil32.exe');
      Result := True;
    end else
      Exit;
  end;
  Result := True;
end;

#ifdef InstallKill_1
begin
  if RunTask3('Compil32.exe', False) then
  begin
    if MsgBox('Программа Compil32.exe используется. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
    begin
      KillTask3('Compil32.exe');
      Result := True;
    end else
      Exit;
  end;
  Result := True;
end;
#endif


function InitializeUninstall(): Boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\ISTask.dll')) then
  FileCopy(ExpandConstant('{app}\ISTask.dll'),ExpandConstant('{tmp}\ISTask.dll'),False);
  Result:=true;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
    if RunTask2('Compil32.exe', False) then
    begin
    // прячем форму
      UninstallProgressForm.Hide;
      if MsgBox('Программа Compil32.exe используется. Закрыть и продолжить удаление?', mbConfirmation, MB_YESNO) = IDYES then
      begin
        KillTask2('Compil32.exe');
    // показываем форму
        UninstallProgressForm.Show;
      end
      else
      begin
        MsgBox('Завершите работу Compil32.exe, затем снова запустите программу удаления.', mbInformation, MB_OK);
        UnloadDll(ExpandConstant('{tmp}\ISTask.dll'));
        Abort;
      end;
    end;
end;



#ifdef InstallKill_1
begin
  if not FileExists(ExpandConstant('{tmp}\ISTask.dll')) then
  FileCopy(ExpandConstant('{app}\ISTask.dll'),ExpandConstant('{tmp}\ISTask.dll'),False);
  Result:=true;
end;

begin
  if CurUninstallStep = usUninstall then
    if RunTask4('Compil32.exe', False) then
    begin
    // прячем форму
      UninstallProgressForm.Hide;
      if MsgBox('Программа Compil32.exe используется. Закрыть и продолжить удаление?', mbConfirmation, MB_YESNO) = IDYES then
      begin
        KillTask4('Compil32.exe');
    // показываем форму
        UninstallProgressForm.Show;
      end
      else
      begin
        MsgBox('Завершите работу Compil32.exe, затем снова запустите программу удаления.', mbInformation, MB_OK);
        UnloadDll(ExpandConstant('{tmp}\ISTask.dll'));
        Abort;
      end;
    end;
end;
#endif
 

Snoopak96

Старожил
Devils Night,
А где сам заголовок-то функций?
Код:
begin
  if RunTask3('Compil32.exe', False) then
  begin
    if MsgBox('Программа Compil32.exe используется. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
    begin
      KillTask3('Compil32.exe');
      Result := True;
    end else
      Exit;
  end;
  Result := True;
end;
типа function Enabled: boolean;
 

Devils Night

Ветеран
А где сам заголовок-то функций?
Ну у меня вот:
Код:
function RunTask1(FileName: AnsiString; bFullpath: Boolean): Boolean;
  external 'RunTask@files:ISTask.dll stdcall';
function KillTask1(ExeFileName: AnsiString): Integer;
  external 'KillTask@files:ISTask.dll stdcall';

function RunTask2(FileName: AnsiString; bFullpath: Boolean): Boolean;
  external 'RunTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';
function KillTask2(ExeFileName: AnsiString): Integer;
  external 'KillTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';

function InitializeSetup(): Boolean;
begin
  if RunTask1('Compil32.exe', False) then
  begin
    if MsgBox('Программа Compil32.exe используется. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
    begin
      KillTask1('Compil32.exe');
      Result := True;
    end else
      Exit;
  end;
  Result := True;
end;

function InitializeUninstall(): Boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\ISTask.dll')) then
  FileCopy(ExpandConstant('{app}\ISTask.dll'),ExpandConstant('{tmp}\ISTask.dll'),False);
  Result:=true;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
    if RunTask2('Compil32.exe', False) then
    begin
    // прячем форму
      UninstallProgressForm.Hide;
      if MsgBox('Программа Compil32.exe используется. Закрыть и продолжить удаление?', mbConfirmation, MB_YESNO) = IDYES then
      begin
        KillTask2('Compil32.exe');
    // показываем форму
        UninstallProgressForm.Show;
      end
      else
      begin
        MsgBox('Завершите работу Compil32.exe, затем снова запустите программу удаления.', mbInformation, MB_OK);
        UnloadDll(ExpandConstant('{tmp}\ISTask.dll'));
        Abort;
      end;
    end;
end;

Код:
function RunTask3(FileName: AnsiString; bFullpath: Boolean): Boolean;
  external 'RunTask@files:ISTask.dll stdcall';
function KillTask3(ExeFileName: AnsiString): Integer;
  external 'KillTask@files:ISTask.dll stdcall';

function RunTask4(FileName: AnsiString; bFullpath: Boolean): Boolean;
  external 'RunTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';
function KillTask4(ExeFileName: AnsiString): Integer;
  external 'KillTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';

function InitializeSetup(): Boolean;
begin
  if RunTask3('Compil32.exe', False) then
  begin
    if MsgBox('Программа Compil32.exe используется. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
    begin
      KillTask3('Compil32.exe');
      Result := True;
    end else
      Exit;
  end;
  Result := True;
end;

function InitializeUninstall(): Boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\ISTask.dll')) then
  FileCopy(ExpandConstant('{app}\ISTask.dll'),ExpandConstant('{tmp}\ISTask.dll'),False);
  Result:=true;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
    if RunTask4('Compil32.exe', False) then
    begin
    // прячем форму
      UninstallProgressForm.Hide;
      if MsgBox('Программа Compil32.exe используется. Закрыть и продолжить удаление?', mbConfirmation, MB_YESNO) = IDYES then
      begin
        KillTask4('Compil32.exe');
    // показываем форму
        UninstallProgressForm.Show;
      end
      else
      begin
        MsgBox('Завершите работу Compil32.exe, затем снова запустите программу удаления.', mbInformation, MB_OK);
        UnloadDll(ExpandConstant('{tmp}\ISTask.dll'));
        Abort;
      end;
    end;
end;
Я их пытался оба совместить, видимо не правильно совместил.

Хотелось бы без дубликатов, типа

Код:
function InitializeSetup(): Boolean;
begin
  Result := InitializeSetup1(); if not Result then exit;
  Result := InitializeSetup2(); if not Result then exit;
end;

function InitializeUninstall(): Boolean;
begin
  Result := InitializeUninstall1(); if not Result then exit;
  Result := InitializeUninstall2(); if not Result then exit;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  CurUninstallStepChanged1(CurUninstallStep);
  CurUninstallStepChanged2(CurUninstallStep);
end;
совметить, возможно ли такое?
 
Последнее редактирование:

Snoopak96

Старожил
Devils Night,
Я особо не понял чего делаешь :crazy: ибо на мой взгляд они одинаковы (1+2 и 3+4) или я выпил сегодня слишком много, но нижнею бы часть написал бы так:
Код:
function InitializeSetup(): Boolean;
begin
  if InitializeSetup1 and InitializeSetup2 then Result := true else exit;
// Или так if (InitializeSetup1 = true) and (InitializeSetup2 = true) then Result := true else exit;
end;

function InitializeUninstall(): Boolean;
begin
  if InitializeUninstall1 and InitializeUninstall2 then Result := true else exit;
// Или так if (InitializeUninstall1 = true) and (InitializeUninstall2 = true) then Result := true else exit;
end;
 

Devils Night

Ветеран
Я особо не понял чего делаешь ибо на мой взгляд они одинаковы (1+2 и 3+4)
Да, они одинаковы, Скрипт 1+2, завершает при установке и удалении один процесс, например Program1.exe, скрипт 3+4, завершает при установке и удалении второй процесс, т.е например Program2.exe, т.е в итоге запущены два процесса, и при установке или удалении они должны завершаться.
 

LexBell

Борода
Супер модератор
Devils Night, советую посмотреть в сторону IssProc - там отслеживается запуск всех приложений, которые запущены из указанной в параметре папки. примеры так-же прилагаются, думаю ты разберешься :).
 
Последнее редактирование:

Devils Night

Ветеран
Devils Night, советую посмотреть в сторону IssProc.
Не не пойдёт.

но нижнею бы часть написал бы так;
не вариант вообще, в итоге пришлось исключить вторую программу, чтоб работала только одна, и можно завершить только одну.
Поясню: Если, таким образом, а именно дубликатами, не важно в каком варианте добавляется, то идёт конфликт с одним кодом, если же код поменяю местами, то с другим кодом.
И ещё, полностью не удаляется папка программы, т.к ISTask всё таки взял своё.


Другой вопрос, как этот код:

Код:
function RunTask(FileName: AnsiString; bFullpath: Boolean): Boolean;
  external 'RunTask@files:ISTask.dll stdcall';
function KillTask(ExeFileName: AnsiString): Integer;
  external 'KillTask@files:ISTask.dll stdcall';

function RunTaskU(FileName: AnsiString; bFullpath: Boolean): Boolean;
  external 'RunTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';
function KillTaskU(ExeFileName: AnsiString): Integer;
  external 'KillTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';

//**************************************************//

function InitializeSetup(): Boolean;
begin
  if RunTask('Compil32.exe', False) then
  begin
    if MsgBox('Программа Compil32.exe используется. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
    begin
      KillTask('Compil32.exe');
      Result := True;
    end else
      Exit;
  end;
  Result := True;
end;

function InitializeUninstall(): Boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\ISTask.dll')) then
  FileCopy(ExpandConstant('{app}\ISTask.dll'),ExpandConstant('{tmp}\ISTask.dll'),False);
  Result:=true;
end;



procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
    if RunTaskU('Compil32.exe', False) then
    begin
    // прячем форму
      UninstallProgressForm.Hide;
      if MsgBox('Программа Compil32.exe используется. Закрыть и продолжить удаление?', mbConfirmation, MB_YESNO) = IDYES then
      begin
        KillTaskU('Compil32.exe');
    //    UnloadDll(ExpandConstant('{tmp}\ISTask.dll'));
    // показываем форму
        UninstallProgressForm.Show;
      end
      else
      begin
        MsgBox('Завершите работу Compil32.exe, затем снова запустите программу удаления.', mbInformation, MB_OK);
        UnloadDll(ExpandConstant('{tmp}\ISTask.dll'));
        Abort;
      end;
    end;
end;

совместить красиво с этим:
Код:
function InitializeUninstall(): Boolean;
begin
if MsgBox('Перед удалением ПО отсоедините устройство', mbError, MB_YESNO) = idYes then result := true else result := false;
end;
без дублей? Если без дублей никак то не надо, а то опять конфликт будет.

P.S Ох мужики, чтож так всё усложнено то!? Блин, как же я не хочу за InstallShield браться, я его не помню вообще, раньше в нём как в родном разбирался, всё что было нужно, он умел. Но InnoSetup, это чисто для игр, факт.
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху