ISDone

DLL ISDone 0.6 final

Нет прав для скачивания

tihiy_don

Старожил
@robinanis, По поводу пароля на архивы:
Код:
if not ISArcExtract(1, 0, ExpandConstant('{src}\1.arc'), ExpandConstant('{app}'), '', False, '123456', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}'), False) then Break;
По заполнению данной строки подробнее почитайте в справке по данному компоненту - там все написано.

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

robinanis

Новичок
@robinanis, По поводу пароля на архивы:
Код:
if not ISArcExtract(1, 0, ExpandConstant('{src}\1.arc'), ExpandConstant('{app}'), '', False, '123456', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}'), False) then Break;
По заполнению данной строки подробнее почитайте в справке по данному компоненту - там все написано.

Не совсем понял, что Вы хотите. Вам уже выше человек ответил, что на одном этапе нужно распаковать, а на втором сделать с ними нужные действия. Или напишите подробнее, что значит применить к превью компонентов в установщике?
я имею ввиду вот в установщике есть это окно выбора компонентов, и к каждому компоненту я привязал картинку
все эти компоненты, как иконка, маленькая и большая картинка установщика сжал и зашифровал freearc'ом в один файл, и я пытался через if not ISArcExtract(1, 0, ExpandConsta...чтобы он разархивировал файлы, и потом эти файлы применил к установщику, но видать я что-то не правильное делаю(

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


суть такая что я хочу сделать так чтобы пользователь не видел этих файлов перед лицом, он только видел установщик и зашифрованные сжатые рядом файлы, но процесс разархивации проходил через папку temp

1643807172415.png
 

Andreo Fadio

Старожил
все эти компоненты, как иконка, маленькая и большая картинка установщика сжал и зашифровал freearc'ом в один файл, и я пытался через if not ISArcExtract(1, 0, ExpandConsta...чтобы он разархивировал файлы, и потом эти файлы применил к установщику, но видать я что-то не правильное делаю(
надо сперва инициализировать саму библиотеку isdone выгрузить библиотеку unarc.dll в function InitializeSetup(): Boolean; и потом там же производить распаковку указано файла с графикой, а не просто использовать команду: if not ISArcExtract(1, 0, ExpandConsta..., так конечно ничего не получится.
Лучше уж тогда unarc.exe использовать. Добавить в установку, загрузить при инициализации установки и указать ему распаковать указанный архив в папку temp.
 

Krinkels

Он где то тут
Администратор
Но зачем тогда такие сложности? Зачем их архивировать? Почему нельзя поместить их в сам установщик, и просто извлекать во временную папку? И далее просто работать с этими картинками
code_language.pascal:
[Files]
Source: Img\1.jpg; DestDir: {tmp}; Flags: dontcopy
//.......................................

[Code]
//.......................................
ExtractTemporaryFile('1.jpg');
 

robinanis

Новичок
Но зачем тогда такие сложности? Зачем их архивировать? Почему нельзя поместить их в сам установщик, и просто извлекать во временную папку? И далее просто работать с этими картинками
code_language.pascal:
[Files]
Source: Img\1.jpg; DestDir: {tmp}; Flags: dontcopy
//.......................................

[Code]
//.......................................
ExtractTemporaryFile('1.jpg');

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

ну потому что destdir и так занят:
Source: fails\enbcm1\*; DestDir: {app}; Components: grafon1\enbcm1;

получается мне их сжимать надо будет и уже пропускать через эту команду if not ISArcExtract(1, 0, ExpandConsta...
я верно понял? если так то как мне прописывать загрузку их
так что ли?
Source: 1.arc\enbcm1\*; DestDir: {app}; Components: grafon1\enbcm1


или я что-то не так понимаю(
 

Krinkels

Он где то тут
Администратор
ISDone вполне себе работает с компонентами, и может распаковать тот или иной архив, в зависимости от выбора. Для начала вот
code_language.pascal:
[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: text; Description: Язык субтитров; Types: full; Flags: fixed
Name: text\rus; Description: Русский; Flags: exclusive;
Name: text\eng; Description: Английский; Flags: exclusive;
Name: voice; Description: Язык озвучки; Types: full; Flags: fixed
Name: voice\rus; Description: Русский; Flags: exclusive;
Name: voice\eng; Description: Английский; Flags: exclusive;

....

Comps1:=0; Comps2:=0; Comps3:=0;
TmpValue:=1;
if IsComponentSelected('text\rus') then Comps1:=Comps1+TmpValue; //компонент 1
TmpValue:=TmpValue*2;
if IsComponentSelected('text\eng') then Comps1:=Comps1+TmpValue; //компонент 2
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\rus') then Comps1:=Comps1+TmpValue; //компонент 3
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\eng') then Comps1:=Comps1+TmpValue; //компонент 4

....

ISDoneError:=true;
if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin
  repeat
    if not FileSearchInit(false) then break;
    if not ISArcExtract ( 0, 0, ExpandConstant('{src}\BasicData.arc'), ExpandConstant('{app}\'), '', false, '', '', '', notPCFonFLY) then break;
    if not ISArcExtract ( 1, 0, ExpandConstant('{src}\rustext.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break;
    if not ISArcExtract ( 2, 0, ExpandConstant('{src}\engtext.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break;
    if not ISArcExtract ( 3, 0, ExpandConstant('{src}\rusvoice.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break;
    if not ISArcExtract ( 4, 0, ExpandConstant('{src}\engvoice.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break;
    ISDoneError:=false;
  until true;
  ISDoneStop;
end;
в данном примере имеется 4 действующих компонента. Перед инициализацией бибилиотеки состояния чекбоксов компонентов загружаются в переменную Comps1.
Сначала при любом выборе компонентов распаковывается архив BasicData.arc, у которого нет к ним привязки (первый параметр равен 0);
далее уже в зависимости от выбранных пользователем чекбоксов будет распаковываться:
rustext.arc, если был выбран компонент 'text\rus';
engtext.arc, если был выбран компонент 'text\eng';
rusvoice.arc, если был выбран компонент 'voice\rus';
engvoice.arc, если был выбран компонент 'voice\eng';
Вне зависимости от выбора пользователя, прогрессбар автоматически подстраивается под выбранные компоненты, чтобы отображение было без равков и граничным состоянием было 100%. Это достигается тем, что после тестового прохода вся информация о времени выполнения каждого компонента сохраняется в файл records.inf и перед началом реальной установки уже известно какие компоненты не были выбраны и, соответственно, их время будет интерполироваться на все остальные операции, которые точно будут выполнены в процессе установки.

Пробуй. Если что то будет не понятно пиши, будем разбираться
 

tihiy_don

Старожил
@robinanis,компоненты также сжимаешь в архивы и уже распаковываешь по примеру из справки.
 

robinanis

Новичок
ISDone вполне себе работает с компонентами, и может распаковать тот или иной архив, в зависимости от выбора. Для начала вот
code_language.pascal:
[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: text; Description: Язык субтитров; Types: full; Flags: fixed
Name: text\rus; Description: Русский; Flags: exclusive;
Name: text\eng; Description: Английский; Flags: exclusive;
Name: voice; Description: Язык озвучки; Types: full; Flags: fixed
Name: voice\rus; Description: Русский; Flags: exclusive;
Name: voice\eng; Description: Английский; Flags: exclusive;

....

Comps1:=0; Comps2:=0; Comps3:=0;
TmpValue:=1;
if IsComponentSelected('text\rus') then Comps1:=Comps1+TmpValue; //компонент 1
TmpValue:=TmpValue*2;
if IsComponentSelected('text\eng') then Comps1:=Comps1+TmpValue; //компонент 2
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\rus') then Comps1:=Comps1+TmpValue; //компонент 3
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\eng') then Comps1:=Comps1+TmpValue; //компонент 4

....

ISDoneError:=true;
if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin
  repeat
    if not FileSearchInit(false) then break;
    if not ISArcExtract ( 0, 0, ExpandConstant('{src}\BasicData.arc'), ExpandConstant('{app}\'), '', false, '', '', '', notPCFonFLY) then break;
    if not ISArcExtract ( 1, 0, ExpandConstant('{src}\rustext.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break;
    if not ISArcExtract ( 2, 0, ExpandConstant('{src}\engtext.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break;
    if not ISArcExtract ( 3, 0, ExpandConstant('{src}\rusvoice.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break;
    if not ISArcExtract ( 4, 0, ExpandConstant('{src}\engvoice.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break;
    ISDoneError:=false;
  until true;
  ISDoneStop;
end;
в данном примере имеется 4 действующих компонента. Перед инициализацией бибилиотеки состояния чекбоксов компонентов загружаются в переменную Comps1.
Сначала при любом выборе компонентов распаковывается архив BasicData.arc, у которого нет к ним привязки (первый параметр равен 0);
далее уже в зависимости от выбранных пользователем чекбоксов будет распаковываться:
rustext.arc, если был выбран компонент 'text\rus';
engtext.arc, если был выбран компонент 'text\eng';
rusvoice.arc, если был выбран компонент 'voice\rus';
engvoice.arc, если был выбран компонент 'voice\eng';
Вне зависимости от выбора пользователя, прогрессбар автоматически подстраивается под выбранные компоненты, чтобы отображение было без равков и граничным состоянием было 100%. Это достигается тем, что после тестового прохода вся информация о времени выполнения каждого компонента сохраняется в файл records.inf и перед началом реальной установки уже известно какие компоненты не были выбраны и, соответственно, их время будет интерполироваться на все остальные операции, которые точно будут выполнены в процессе установки.

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

Krinkels

Он где то тут
Администратор

robinanis

Новичок
ISDone вполне себе работает с компонентами, и может распаковать тот или иной архив, в зависимости от выбора. Для начала вот
code_language.pascal:
[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: text; Description: Язык субтитров; Types: full; Flags: fixed
Name: text\rus; Description: Русский; Flags: exclusive;
Name: text\eng; Description: Английский; Flags: exclusive;
Name: voice; Description: Язык озвучки; Types: full; Flags: fixed
Name: voice\rus; Description: Русский; Flags: exclusive;
Name: voice\eng; Description: Английский; Flags: exclusive;

....

Comps1:=0; Comps2:=0; Comps3:=0;
TmpValue:=1;
if IsComponentSelected('text\rus') then Comps1:=Comps1+TmpValue; //компонент 1
TmpValue:=TmpValue*2;
if IsComponentSelected('text\eng') then Comps1:=Comps1+TmpValue; //компонент 2
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\rus') then Comps1:=Comps1+TmpValue; //компонент 3
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\eng') then Comps1:=Comps1+TmpValue; //компонент 4

....

ISDoneError:=true;
if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin
  repeat
    if not FileSearchInit(false) then break;
    if not ISArcExtract ( 0, 0, ExpandConstant('{src}\BasicData.arc'), ExpandConstant('{app}\'), '', false, '', '', '', notPCFonFLY) then break;
    if not ISArcExtract ( 1, 0, ExpandConstant('{src}\rustext.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break;
    if not ISArcExtract ( 2, 0, ExpandConstant('{src}\engtext.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break;
    if not ISArcExtract ( 3, 0, ExpandConstant('{src}\rusvoice.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break;
    if not ISArcExtract ( 4, 0, ExpandConstant('{src}\engvoice.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break;
    ISDoneError:=false;
  until true;
  ISDoneStop;
end;
в данном примере имеется 4 действующих компонента. Перед инициализацией бибилиотеки состояния чекбоксов компонентов загружаются в переменную Comps1.
Сначала при любом выборе компонентов распаковывается архив BasicData.arc, у которого нет к ним привязки (первый параметр равен 0);
далее уже в зависимости от выбранных пользователем чекбоксов будет распаковываться:
rustext.arc, если был выбран компонент 'text\rus';
engtext.arc, если был выбран компонент 'text\eng';
rusvoice.arc, если был выбран компонент 'voice\rus';
engvoice.arc, если был выбран компонент 'voice\eng';
Вне зависимости от выбора пользователя, прогрессбар автоматически подстраивается под выбранные компоненты, чтобы отображение было без равков и граничным состоянием было 100%. Это достигается тем, что после тестового прохода вся информация о времени выполнения каждого компонента сохраняется в файл records.inf и перед началом реальной установки уже известно какие компоненты не были выбраны и, соответственно, их время будет интерполироваться на все остальные операции, которые точно будут выполнены в процессе установки.

Пробуй. Если что то будет не понятно пиши, будем разбираться
Извиняюсь, за кучу вопросов...наверное уже достал)
А куда вписывать эту часть?
просто в Code
Код:
....

Comps1:=0; Comps2:=0; Comps3:=0;
TmpValue:=1;
if IsComponentSelected('text\rus') then Comps1:=Comps1+TmpValue; //компонент 1 (1 столбец)
TmpValue:=TmpValue*2;
if IsComponentSelected('text\eng') then Comps1:=Comps1+TmpValue; //компонент 2
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\rus') then Comps1:=Comps1+TmpValue; //компонент 3
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\eng') then Comps1:=Comps1+TmpValue; //компонент 4

....
в первом столбце указано Comps1
но в последующих также Comps1, оно так и должно или там менять цифру надо с каждым новым компонентом?
 

tihiy_don

Старожил
@robinanis, я вот так делал в своём репаке.
code_language.pascal:
// компоненты==================================================================//////////////
    Comps1:=0; Comps2:=0; Comps3:=0;
#ifdef Components
    TmpValue:=1;
    if IsComponentSelected('addon\map') then Comps1:=Comps1+TmpValue;      //доп. карты
    TmpValue:=TmpValue*2;
    if IsComponentSelected('addon\rus') then Comps1:=Comps1+TmpValue;      //русификация
///===========================================================================///////////////
А потом распаковываю компоненты:
Код:
//компоненты
if not ISArcExtract    ( 0, 0, ExpandConstant('{src}\Data-5.bin'), ExpandConstant('{app}\'), '', false, '1', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
if not ISArcExtract    ( 1, 0, ExpandConstant('{src}\Data-6.bin'), ExpandConstant('{app}\'), '', false, '1', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
 
Последнее редактирование:

robinanis

Новичок
еще появился вопрос
1643877687684.png
увидел такое окно.
хотел спросить, можно ли сделать, к примеру 20 серийных номеров с привязкой к ним разной комплектации, если да то как можно это реализовать? То есть к примеру 10 номеров с одной комплектацией, и 10 с другой комплектацией.


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

Krinkels

Он где то тут
Администратор
Вот пример работы с серийным номером:
code_language.pascal:
[Setup]
AppName=Serial number project
AppVersion=1.0
DefaultDirName={pf}\Serial number project

[code]
function SetFocus(hWnd: HWND): HWND;
  external 'SetFocus@user32.dll stdcall';
function OpenClipboard(hWndNewOwner: HWND): BOOL;
  external 'OpenClipboard@user32.dll stdcall';
function GetClipboardData(uFormat: UINT): THandle;
  external 'GetClipboardData@user32.dll stdcall';
function CloseClipboard: BOOL;
  external 'CloseClipboard@user32.dll stdcall';
function GlobalLock(hMem: THandle): PAnsiChar;
  external 'GlobalLock@kernel32.dll stdcall';
function GlobalUnlock(hMem: THandle): BOOL;
  external 'GlobalUnlock@kernel32.dll stdcall';

var
  SerialPage: TWizardPage;
  SerialEdits: array of TEdit;

const
  CF_TEXT = 1;
  VK_BACK = 8;
  SC_EDITCOUNT = 6;
  SC_CHARCOUNT = 5;
  SC_DELIMITER = '-';

function IsValidInput: Boolean;
var
  I: Integer;
begin
  Result := True;
  for I := 0 to GetArrayLength(SerialEdits) - 1 do
    if Length(SerialEdits[I].Text) < SC_CHARCOUNT then
    begin
      Result := False;
      Break;
    end;
end;

function GetClipboardText: string;
var
  Data: THandle;
begin
  Result := '';
  if OpenClipboard(0) then
  try
    Data := GetClipboardData(CF_TEXT);
    if Data <> 0 then
      Result := String(GlobalLock(Data));
  finally
    if Data <> 0 then
      GlobalUnlock(Data);
    CloseClipboard;
  end;
end;

function GetSerialNumber(ADelimiter: Char): string;
var
  I: Integer;
begin
  Result := '';
  for I := 0 to GetArrayLength(SerialEdits) - 1 do
    Result := Result + SerialEdits[I].Text + ADelimiter;
  Delete(Result, Length(Result), 1);
end;

function TrySetSerialNumber(const ASerialNumber: string; ADelimiter: Char): Boolean;
var
  I: Integer;
  J: Integer;
begin
  Result := False;

  if Length(ASerialNumber) = ((SC_EDITCOUNT * SC_CHARCOUNT) + (SC_EDITCOUNT - 1)) then
  begin
    for I := 1 to SC_EDITCOUNT - 1 do
      if ASerialNumber[(I * SC_CHARCOUNT) + I] <> ADelimiter then
        Exit;

    for I := 0 to GetArrayLength(SerialEdits) - 1 do
    begin
      J := (I * SC_CHARCOUNT) + I + 1;
      SerialEdits[I].Text := Copy(ASerialNumber, J, SC_CHARCOUNT);
    end;

    Result := True;
  end;
end;

function TryPasteSerialNumber: Boolean;
begin
  Result := TrySetSerialNumber(GetClipboardText, SC_DELIMITER);
end;

procedure OnSerialEditChange(Sender: TObject);
begin
  WizardForm.NextButton.Enabled := IsValidInput;
end;

procedure OnSerialEditKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  Edit: TEdit;
  EditIndex: Integer;
begin
  Edit := TEdit(Sender);
  EditIndex := Edit.TabOrder - SerialEdits[0].TabOrder;
  if (EditIndex = 0) and (Key = Ord('V')) and (Shift = [ssCtrl]) then
  begin
    if TryPasteSerialNumber then
      Key := 0;
  end
  else
  if (Key >= 32) and (Key <= 255) then
  begin
    if Length(Edit.Text) = SC_CHARCOUNT - 1 then
    begin
      if EditIndex < GetArrayLength(SerialEdits) - 1 then
        SetFocus(SerialEdits[EditIndex + 1].Handle)
      else
        SetFocus(WizardForm.NextButton.Handle);
    end;
  end
  else
  if Key = VK_BACK then
    if (EditIndex > 0) and (Edit.Text = '') and (Edit.SelStart = 0) then
      SetFocus(SerialEdits[EditIndex - 1].Handle);
end;

procedure CreateSerialNumberPage;
var
  I: Integer;
  Edit: TEdit;
  DescLabel: TLabel;
  EditWidth: Integer;
begin
  SerialPage := CreateCustomPage(wpWelcome, 'Serial number validation',
    'Enter the valid serial number');

  DescLabel := TLabel.Create(SerialPage);
  DescLabel.Top := 16;
  DescLabel.Left := 0;
  DescLabel.Parent := SerialPage.Surface;
  DescLabel.Caption := 'Enter valid serial number and continue the installation...';
  DescLabel.Font.Style := [fsBold];

  SetArrayLength(SerialEdits, SC_EDITCOUNT);
  EditWidth := (SerialPage.SurfaceWidth - ((SC_EDITCOUNT - 1) * 8)) div SC_EDITCOUNT;

  for I := 0 to SC_EDITCOUNT - 1 do
  begin
    Edit := TEdit.Create(SerialPage);
    Edit.Top := 40;
    Edit.Left := I * (EditWidth + 8);
    Edit.Width := EditWidth;
    Edit.CharCase := ecUpperCase;
    Edit.MaxLength := SC_CHARCOUNT;
    Edit.Parent := SerialPage.Surface;
    Edit.OnChange := @OnSerialEditChange;
    Edit.OnKeyDown := @OnSerialEditKeyDown;
    SerialEdits[I] := Edit;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = SerialPage.ID then
    WizardForm.NextButton.Enabled := IsValidInput; 
end;

procedure InitializeWizard;
begin
  CreateSerialNumberPage;
end;
 

robinanis

Новичок
Доброе утро, появился еще вопрос, как ограничить выбор папки с установкой.
К примеру, добавить условие, установка файлов возможна если в папке куда будет устанавливаться есть такой или иной файл.
например вот файл "d3dcompiler_47.dll". Чтоб установщик видел что файл там этот есть и устанавливал, а если нет чтоб оповещал о том что не правильная выбрана папка.
 

vint56

Ветеран
Проверенный
robinanis
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

Код:
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result:= True;
if CurPageID = wpSelectDir then begin
If not FileExists(ExpandConstant('{app}\d3dcompiler_47.dll')) then begin
MsgBox('Необходимые файлы приложения "d3dcompiler_47.dll" не найдены' #13#13 'Пожалуйста, выберите правильный путь для установки обновления.', mbError, mb_Ok);
Result:= False;
end;
end;
end;
 

robinanis

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