Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Автоматическая установка приложений (http://forum.oszone.net/forumdisplay.php?f=61)
-   -   Скрипты Inno Setup. Помощь и советы [часть 9] (http://forum.oszone.net/showthread.php?t=334142)

El Sanchez 04-04-2018 16:09 2807008

Скрипты Inno Setup. Помощь и советы [часть 9]
 
Вложений: 4
Внимание! Данная тема предназначена только для обсуждения написания скриптов!
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:

Показать/скрыть: Ссылки на примеры скриптов:

Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;

  • RegExporter - Бесплатная утилита для экспорта реестра и конвертации файлов *.reg и *.ini в инсталляционные скрипты Inno Setup и NSIS.
    Последняя версия: 1.3.0 [17.01.2015] - Скачать;



Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:

Скрипты Inno Setup. Помощь и советы [часть 6] | Файл 152035
Скрипты Inno Setup. Помощь и советы [часть 7] | Файл 152036
Скрипты Inno Setup. Помощь и советы [часть 8] | Файл 152037

ABBAT 04-04-2018 21:00 2807060

Привет всем. Как можно определить системный диск ({sd}) ssd или hdd.
Что-то вроде этого:
Код:

    if ssd then
        ....
    else
        ....
  end

El Sanchez,
Цитата:

прилипание мастер формы к краям экрана
Отличный скрипт. Спасибо.

Хмм... нашёл пока на AutoIt3 (в.3.3.14.2) подогнал под себя, вроде работает. Может кому пригодится для установки Windows.
Код:

#NoTrayIcon
$Gui = @SW_HIDE

; Some constants
Const $DT_DRIVETYPE = 1
Const $DT_SSDSTATUS = 2
Const $DT_BUSTYPE = 3

; Drive letter to check
Const $DriveLetter = @homedrive;

$ssd = DriveGetType($DriveLetter, $DT_SSDSTATUS)
If $ssd <> "" Then
    Run(@ComSpec & ' /C ssd.bat', '', @SW_HIDE) ;@SW_SHOW
    Else
  Exit
EndIf

Хотелось бы на Inno но... на безрыбье .... )

TheLeon 05-04-2018 20:38 2807267

habib2302,
Цитата:

Из кода удалите строку WizardForm.TypesCombo.Visible := False;. В строке WizardForm.ComponentsList.Top := ScaleX(15); замените на 26 и добавьте эту строку в InitializeWizard WizardForm.TypesCombo.Top := ScaleY(0);
Спасибо, выбор типа установки работает, правда, возникла другая проблема: половину вкладки выбора закрывает задний фон, хотя сделал всё, как вы сказали. Это придётся мне уменьшать размер списка компонентов и превью компонента?
Файл 152052

habib2302 05-04-2018 20:51 2807271

Цитата:

Цитата TheLeon
Это придётся мне уменьшать размер списка компонентов и превью компонента? »

да.

TheLeon 06-04-2018 16:10 2807427

Вложений: 3
habib2302, ещё раз здравствуй, возникла проблема с надписью "Сделано кем-то..." и т.д., с каждым переходом на следующую страницу накладывается слой этого же текста..
Секция CODE
пусто


А также второй вопрос: сделал, как вы сказали, сместил список компонентов и их превью, но все равно половину вкладки выбора типа установки перекрывает. Скорее всего это место было для инструкции, пример: "выберите из списка нужный компонент....", если это так, то можно ли это убрать? Заранее спасибо.

habib2302 06-04-2018 16:49 2807438

Цитата:

Цитата TheLeon
А также второй вопрос: сделал, как вы сказали, сместил список компонентов и их превью, но все равно половину вкладки выбора типа установки перекрывает. Скорее всего это место было для инструкции, пример: "выберите из списка нужный компонент....", если это так, то можно ли это убрать? Заранее спасибо. »

добавьте в InitializeWizard эту строку WizardForm.SelectComponentsLabel.Hide
Цитата:

Цитата TheLeon
возникла проблема с надписью "Сделано кем-то..." и т.д., с каждым переходом на следующую страницу накладывается слой этого же текста.. »

у вас же в примере все понятно расписано.
Код:

Label1 := TLabel.Create(WizardForm);
with Label1 do
begin
Parent := WizardForm;
Caption := 'Сделано в фирме TheLeon';
SetBounds(ScaleX(16),ScaleY(330),ScaleX(132),ScaleY(13));
end;

должен быть в процедуре InitializeWizard, а у вас он каким то образом оказался в функции NextButtonClick и
Код:

Image1 := TBitmapImage.Create(WizardForm);
with Image1 do
begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(0),ScaleY(110),ScaleX(417),ScaleY(140));
ExtractTemporaryFile('BMP.bmp');
Bitmap.LoadFromFile(ExpandConstant('{tmp}\BMP.bmp'));
end;

и
Код:

  WizardForm.SelectDirBitmapImage.Hide;
  WizardForm.DiskSpaceLabel.Hide;
  WizardForm.SelectDirLabel.SetBounds(ScaleX(0),ScaleY(9),ScaleX(417),ScaleY(14));

тоже должен быть в процедуре InitializeWizard

TheLeon 06-04-2018 18:43 2807458

Вложений: 1
habib2302, обращаюсь ещё раз, всё сделал, но текст не передвинулся, опять накосячил где-то? (см.скрин 1)

P.S: за остальное же спасибо, слепой, что с меня взять...
Секция CODE
пусто

habib2302 06-04-2018 19:16 2807470

Цитата:

Цитата TheLeon
всё сделал, но текст не передвинулся, опять накосячил где-то? »

по поводу текста вы у меня не спрашивали.
вот добавьте это в InitializeWizard
Код:

WizardForm.DirBrowseButton.SetBounds(ScaleX(342),ScaleY(36),ScaleX(75),ScaleY(23));
WizardForm.DirEdit.SetBounds(ScaleX(0),ScaleY(37),ScaleX(332),ScaleY(21));
WizardForm.SelectDirBrowseLabel.SetBounds(ScaleX(0),ScaleY(0),ScaleX(417),ScaleY(27));


TheLeon 07-04-2018 12:39 2807551

Ребят, нужна помощь! Пытался-пытался, не соображаю, как добавить, чтобы при наведении показывалось превью, именно в мой код.

P.S: смотрел статью, опять же пытался - ничего не получилось.
Секция Code

Пусто

habib2302 07-04-2018 19:35 2807627

TheLeon, вот другой вариант. потому что скрипт из этой статьи в виде всплывающего уведомления
Код:

[Setup]
AppName=Моя программа
AppVersion=1.5
AppPublisher=YURSHAT
AppPublisherURL=http://krinkels.org/
DefaultDirName={pf}\Моя программа

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

[CustomMessages]
RU.CompName1=Компонент 1
RU.CompName2=Компонент 2

[Files]
Source: "compiler:WizModernImage.bmp"; DestName: "CompDescImg1.bmp"; Flags: dontcopy
Source: "compiler:WizModernImage-IS.bmp"; DestName: "CompDescImg2.bmp"; Flags: dontcopy

[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: comp1; Description: "{cm:CompName1}"; Types: full
Name: comp2; Description: "{cm:CompName2}"; Types: full

[Code]

type
    TComponentDesc = record
    Description: String;
    ImageName: String;
    Index: Integer;
end;

var
  CompDescs: array of TComponentDesc;
  CompDescPanel, CompDescImgPanel: TPanel;
  CompIndex, LastIndex: Integer;
  CompDescImg: TBitmapImage;

procedure ShowCompDescription(Sender: TObject; X, Y, Index: Integer; Area: TItemArea);
var
  i: Integer;
begin
  if Index = LastIndex then Exit;
  CompIndex := -1;
  for i := 0 to GetArrayLength(CompDescs) -1 do
  begin
    if (CompDescs[i].Index = Index) then
    begin
      CompIndex := i;
      Break;
    end;
  end;
  if (CompIndex >= 0) and (Area = iaItem) then
  begin
    if not FileExists(ExpandConstant('{tmp}\') + CompDescs[CompIndex].ImageName) then
      ExtractTemporaryFile(CompDescs[CompIndex].ImageName);
    CompDescImg.Bitmap.LoadFromFile(ExpandConstant('{tmp}\') + CompDescs[CompIndex].ImageName);
    CompDescImg.Show;
  end;
  LastIndex := Index;
end;

procedure CompListMouseLeave(Sender: TObject);
begin
  CompDescImg.Hide;
  LastIndex := -1;
end;

procedure AddCompDescription(AIndex: Integer; ADescription: String; AImageName: String);
var
  i: Integer;
begin
  i := GetArrayLength(CompDescs);
  SetArrayLength(CompDescs, i + 1);
  CompDescs[i].Description := ADescription;
  CompDescs[i].ImageName := AImageName;
  CompDescs[i].Index := AIndex - 1
end;

procedure InitializeWizard();
begin
  WizardForm.SelectComponentsLabel.Hide;
  WizardForm.TypesCombo.Hide;
  WizardForm.ComponentsList.SetBounds(ScaleX(0), ScaleY(0), ScaleX(184), ScaleY(205));
  WizardForm.ComponentsList.OnItemMouseMove:= @ShowCompDescription;
  WizardForm.ComponentsList.OnMouseLeave := @CompListMouseLeave;

  CompDescImgPanel := TPanel.Create(WizardForm);
  with CompDescImgPanel do
  begin
    Parent := WizardForm.SelectComponentsPage;
    SetBounds(ScaleX(192), ScaleY(0), ScaleX(225), ScaleY(205));
    BevelInner := bvLowered;
  end;

  CompDescImg := TBitmapImage.Create(WizardForm);
  with CompDescImg do
  begin
    Parent := CompDescImgPanel;
    SetBounds(ScaleX(5), ScaleY(5), CompDescImgPanel.Width - ScaleX(10), CompDescImgPanel.Height - ScaleY(10));
    Stretch := True;
    Hide;
  end;

  AddCompDescription(1, (''), 'CompDescImg1.bmp');
  AddCompDescription(2, (''), 'CompDescImg2.bmp');
end;


TheLeon 07-04-2018 21:26 2807663

Вложений: 1
habib2302, да, возник вопрос, а можно ли отключить на первом пункте меню изображение, чтобы писалось "Наведите курсор.."?(см.скрин)

Секция code
пусто

habib2302 07-04-2018 21:54 2807665

TheLeon, дайте мне полный скрипт вместе с картинками

habib2302 08-04-2018 00:08 2807678

Цитата:

Цитата TheLeon
да, возник вопрос, а можно ли отключить на первом пункте меню изображение, чтобы писалось "Наведите курсор.."?(см.скрин) »

нет. т.к. в TBitmapImage нельзя добавлять текст. для текста специально предназначена TLabel. Вот полный вариант скрипта
Код:

[Setup]
AppName=Моя программа
AppVersion=1.5
AppPublisher=YURSHAT
AppPublisherURL=http://krinkels.org/
DefaultDirName={pf}\Моя программа

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

[CustomMessages]
RU.CompName1=Компонент 1
RU.CompName2=Компонент 2
RU.ComponentsInfo=Наведите курсор мыши на компонент, чтобы прочитать его описание.
RU.ComponentsImgInfo=Наведите курсор мыши на компонент, чтобы посмотреть его превью.
RU.CompDesc1=Описание первого компонента
RU.CompDesc2=Описание второго компонента

[Files]
Source: "compiler:WizModernImage.bmp"; DestName: "CompDescImg1.bmp"; Flags: dontcopy
Source: "compiler:WizModernImage-IS.bmp"; DestName: "CompDescImg2.bmp"; Flags: dontcopy

[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: comp1; Description: "{cm:CompName1}"; Types: full
Name: comp2; Description: "{cm:CompName2}"; Types: full

[Code]
type
  TComponentDesc = record
    Description: String;
    ImageName: String;
    Index: Integer;
  end;

var
  CompDescs: array of TComponentDesc;
  CompDescPanel, CompDescImgPanel: TPanel;
  CompDescText: array[1..2] of TLabel;
  CompIndex, LastIndex: Integer;
  CompDescImg: TBitmapImage;

procedure ShowCompDescription(Sender: TObject; X, Y, Index: Integer; Area: TItemArea);
var
  i: Integer;
begin
  if Index = LastIndex then Exit;
  CompIndex := -1;
  for i := 0 to GetArrayLength(CompDescs) -1 do
  begin
    if (CompDescs[i].Index = Index) then
    begin
      CompIndex := i;
      Break;
    end;
  end;
  if (CompIndex >= 0) and (Area = iaItem) then
  begin
    if not FileExists(ExpandConstant('{tmp}\') + CompDescs[CompIndex].ImageName) then
      ExtractTemporaryFile(CompDescs[CompIndex].ImageName);
    CompDescImg.Bitmap.LoadFromFile(ExpandConstant('{tmp}\') + CompDescs[CompIndex].ImageName);
    CompDescImg.Show;

    CompDescText[2].Caption := CompDescs[CompIndex].Description;
    CompDescText[2].Enabled := True;
  end else
  begin
    CompDescText[2].Caption := CustomMessage('ComponentsInfo');
    CompDescText[2].Enabled := False;
    CompDescImg.Hide;
  end;
  LastIndex := Index;
end;

procedure CompListMouseLeave(Sender: TObject);
begin
  CompDescImg.Hide;
  CompDescText[2].Caption := CustomMessage('ComponentsInfo');
  CompDescText[2].Enabled := False;
  LastIndex := -1;
end;

procedure AddCompDescription(AIndex: Integer; ADescription: String; AImageName: String);
var
  i: Integer;
begin
  i := GetArrayLength(CompDescs);
  SetArrayLength(CompDescs, i + 1);
  CompDescs[i].Description := ADescription;
  CompDescs[i].ImageName := AImageName;
  CompDescs[i].Index := AIndex - 1
end;

procedure InitializeWizard();
begin
  WizardForm.SelectComponentsLabel.Hide;
  WizardForm.TypesCombo.Hide;
  WizardForm.ComponentsList.SetBounds(ScaleX(0), ScaleY(0), ScaleX(184), ScaleY(205));
  WizardForm.ComponentsList.OnItemMouseMove:= @ShowCompDescription;
  WizardForm.ComponentsList.OnMouseLeave := @CompListMouseLeave;

  CompDescImgPanel := TPanel.Create(WizardForm);
  with CompDescImgPanel do
  begin
    Parent := WizardForm.SelectComponentsPage;
    SetBounds(ScaleX(192), ScaleY(0), ScaleX(225), ScaleY(120));
    BevelInner := bvLowered;
  end;

  CompDescText[1] := TLabel.Create(WizardForm);
  with CompDescText[1] do
  begin
    Parent := CompDescImgPanel;
    SetBounds(ScaleX(5), ScaleY(5), CompDescImgPanel.Width - ScaleX(10), CompDescImgPanel.Height - ScaleY(10));
    AutoSize := False;
    WordWrap := True;
    Enabled := False;
    Caption := CustomMessage('ComponentsImgInfo');
  end;

  CompDescImg := TBitmapImage.Create(WizardForm);
  with CompDescImg do
  begin
    Parent := CompDescImgPanel;
    SetBounds(ScaleX(5), ScaleY(5), CompDescImgPanel.Width - ScaleX(10), CompDescImgPanel.Height - ScaleY(10));
    Stretch := True;
    Hide;
  end;

  CompDescPanel := TPanel.Create(WizardForm);
  with CompDescPanel do
  begin
    Parent := WizardForm.SelectComponentsPage;
    SetBounds(ScaleX(192), ScaleY(125), ScaleX(225), ScaleY(80));
    BevelInner := bvLowered;
  end;

  CompDescText[2] := TLabel.Create(WizardForm);
  with CompDescText[2] do
  begin
    Parent := CompDescPanel;
    SetBounds(ScaleX(5), ScaleY(5), CompDescPanel.Width - ScaleX(10), CompDescPanel.Height - ScaleY(10));
    AutoSize := False;
    WordWrap := True;
    Enabled := False;
    Caption := CustomMessage('ComponentsInfo');
  end;

  AddCompDescription(1, CustomMessage('CompDesc1'), 'CompDescImg1.bmp');
  AddCompDescription(2, CustomMessage('CompDesc2'), 'CompDescImg2.bmp');
end;


TheLeon 08-04-2018 12:04 2807726

Вложений: 1
habib2302, тут с описанием компонента, то, что мне не нужно. Да, хотел спросить, можно ли сделать кликабельный баннер и кликабельный текст "сделано в фирме..." (при клике открывался браузер), коды которых вы мне давали?

Секция CODE
пусто

habib2302 08-04-2018 14:17 2807734

Цитата:

Цитата TheLeon
кликабельный текст "сделано в фирме..." (при клике открывался браузер) »

Код:

var
  Label1: TLabel;

procedure Label1Click(Sender: TObject);
var ErrorCode: Integer;
begin
ShellExec('open','http://www.innosetup.com','', '', SW_SHOW, ewNoWait, ErrorCode)
end;

procedure InitializeWizard();
begin
  Label1 := TLabel.Create(WizardForm);
  with Label1 do
  begin
    Parent  := WizardForm;
    Caption := 'Developed by Leon and OSzone.net';
    SetBounds(ScaleX(15),ScaleY(338),ScaleX(132),ScaleY(130));
    Font.Size := 7;
    OnClick:=@Label1Click;
    Font.Color:=clBlue;
    Enabled:=True;
    Cursor:=crHand;
  end;
end;

Цитата:

Цитата TheLeon
кликабельный баннер »

Код:

var
  Image1: TBitmapImage;

procedure Image1Click(Sender: TObject);
var ErrorCode: Integer;
begin
ShellExec('open','http://www.innosetup.com','', '', SW_SHOW, ewNoWait, ErrorCode)
end;

procedure InitializeWizard();
begin
  Image1 := TBitmapImage.Create(WizardForm);
  with Image1 do
  begin
    Parent  := WizardForm.SelectDirPage;
    SetBounds(ScaleX(0),ScaleY(70),ScaleX(416),ScaleY(170));
    ExtractTemporaryFile('BMP.bmp');
    Bitmap.LoadFromFile(ExpandConstant('{tmp}\BMP.bmp'));
    OnClick:=@Image1Click;
    Enabled:=True;
    Cursor:=crHand;
  end;
end;


El Sanchez 08-04-2018 15:28 2807742

Цитата:

Цитата ABBAT
Как можно определить системный диск ({sd}) ssd или hdd. »

ABBAT, пробуйте.
Скрытый текст

Код:

[Setup]
AppName=test
AppVerName=test
CreateAppDir=no
DefaultDirName={tmp}
Uninstallable=no
CreateUninstallRegKey=no

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl

[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
 
GENERIC_READ = $80000000;
  GENERIC_WRITE = $40000000;
  FILE_SHARE_READ = $1;
  FILE_SHARE_WRITE = $2;
  OPEN_EXISTING = 3;
  INVALID_HANDLE_VALUE = -1;
  IOCTL_ATA_PASS_THROUGH = $0004D02C;
  ATA_FLAGS_DRDY_REQUIRED = $0001;
  ATA_FLAGS_DATA_IN = $0002;
  ID_CMD = $EC;

type
 
TATAPassThroughEx = record
   
Length: WORD;
    AtaFlags: WORD;
    PathId: Byte;
    TargetId: Byte;
    Lun: Byte;
    ReservedAsUchar: Byte;
    DataTransferLength: DWORD;
    TimeOutValue: DWORD;
    ReservedAsUlong: DWORD;
    DataBufferOffset: DWORD;
    PreviousTaskFile: array [0..7] of Byte;
    CurrentTaskFile: array [0..7] of Byte;
  end;

  TATAIdentifyDeviceQuery = record
   
Header: TATAPassThroughEx;
    Data: array [0..255] of WORD;
  end;

// Device Management Functions
function DeviceIoControlATAIdentifyDeviceQuery(hDevice: THandle; dwIoControlCode: DWORD; var lpInBuffer: TATAIdentifyDeviceQuery; nInBufferSize: DWORD; out lpOutBuffer: TATAIdentifyDeviceQuery; nOutBufferSize: DWORD; out lpBytesReturned: DWORD; lpOverlapped: DWORD): BOOL; external 'DeviceIoControl@kernel32.dll stdcall';

// File Management Functions
function CreateFile(lpFileName: string; dwDesiredAccess, dwShareMode: DWORD; lpSecurityAttributes: Longint; dwCreationDisposition, dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle; external 'CreateFile{#A}@kernel32.dll stdcall';

// Handle and Object Functions
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';

/////////////////////////////////////////////////////////
function IsDriveSSD(const ADriveLetter: string): Boolean;
var
 
BytesReturned: DWORD;
  DeviceHandle: THandle;
  ATAIdentifyDeviceQuery: TATAIdentifyDeviceQuery;
begin
 
Result := False;
  try
   
DeviceHandle := CreateFile(Format('\\.\%s', [ADriveLetter]), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    if DeviceHandle = INVALID_HANDLE_VALUE then
     
RaiseException(SysErrorMessage(DLLGetLastError));

    ATAIdentifyDeviceQuery.Header.Length := SizeOf(ATAIdentifyDeviceQuery.Header);
    ATAIdentifyDeviceQuery.Header.AtaFlags := ATA_FLAGS_DATA_IN or ATA_FLAGS_DRDY_REQUIRED;
    ATAIdentifyDeviceQuery.Header.DataTransferLength := SizeOf(ATAIdentifyDeviceQuery.Data);
    ATAIdentifyDeviceQuery.Header.TimeOutValue := 3;
    ATAIdentifyDeviceQuery.Header.DataBufferOffset := SizeOf(ATAIdentifyDeviceQuery.Header);
    ATAIdentifyDeviceQuery.Header.CurrentTaskFile[6{ = Command/Status register }] := ID_CMD; // ATA IDENTIFY DEVICE command

   
if not DeviceIoControlATAIdentifyDeviceQuery(DeviceHandle, IOCTL_ATA_PASS_THROUGH, ATAIdentifyDeviceQuery, SizeOf(ATAIdentifyDeviceQuery), ATAIdentifyDeviceQuery, SizeOf(ATAIdentifyDeviceQuery), BytesReturned, 0) then
    begin
     
Log(Format('DeviceIoControl failed: %s', [SysErrorMessage(DLLGetLastError)]));
      Exit;
    end;
    Result := ATAIdentifyDeviceQuery.Data[{ Word }217{: Nominal media rotation rate }] = 1;
  finally
    if
DeviceHandle > 0 then
     
CloseHandle(DeviceHandle);
  end;
end;

///////////////////////////
procedure InitializeWizard;
begin
  if
IsDriveSSD(ExpandConstant('{sd}')) then
   
MsgBox('SSD', mbInformation, MB_OK)
  else
   
MsgBox('No SSD', mbInformation, MB_OK);
end;


ABBAT 08-04-2018 21:58 2807801

El Sanchez,
Цитата:

пробуйте
Спасибо большое. Отлично работает.

TheLeon 10-04-2018 19:09 2808169

El Sanchez, здравствуйте, сможете ли помочь с задуманным?

1.Можно ли сделать шапку, похожую на данную, также текст, слева иконка(любого формата), а справа иконка "Вопроса", при наведении на которую, вылезает подсказка? (см.скрин 1)
2.Можно ли сделать анимированный баннер(или слайд-шоу)? (см.скрин 2)
3.Можно ли при наведении, именно на первый пункт, показывало в превью изображения "Наведите курсор..."? (см.скрин 3)
4.Можно ли сделать подобный стиль для кнопок(не меня размеры, просто стиль)? (см.скрин 4)

Скрин 1: https://a.radikal.ru/a05/1804/e9/0e14377bc14b.jpg
Скрин 2: https://d.radikal.ru/d28/1804/c9/5c42c37af7fe.png
Скрин 3: https://d.radikal.ru/d43/1804/92/c9c776c58eaa.png
Скрин 4: https://d.radikal.ru/d26/1804/fa/eaa9c86a90f9.jpg

.ISS
пусто

El Sanchez 11-04-2018 18:12 2808328

Цитата:

Цитата TheLeon
1.Можно ли сделать шапку, похожую на данную, также текст, слева иконка(любого формата), а справа иконка "Вопроса", при наведении на которую, вылезает подсказка? (см.скрин 1) »

TheLeon, пример
Скрытый текст

Код:

[Setup]
AppName=test
AppVerName=test
DefaultDirName={tmp}
Uninstallable=no
CreateUninstallRegKey=no
LicenseFile=compiler:license.txt

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl

[Messages]
ru.WizardLicense=Сканирование...

[Code]
//////////////////////////
procedure ChangeMainPanel;
var
 
HelpBitmap: TBitmapImage;
begin
 
WizardForm.PageDescriptionLabel.Hide;

  with WizardForm.WizardSmallBitmapImage do
  begin
   
Left := ScaleX(10);
    Top := (Parent.Height - Height) div 2;
  end;

  HelpBitmap := TBitmapImage.Create(WizardForm.MainPanel);
  with HelpBitmap do
  begin
   
Parent := WizardForm.MainPanel;
    Bitmap.LoadFromFile('{#CompilerPath }\WizModernSmallImage-IS.bmp');
    AutoSize := True;
    Left := Parent.Width - Width - ScaleX(10);
    Top := (Parent.Height - Height) div 2;
    ShowHint := True;
    Hint := 'Sample text';
  end;

  with WizardForm.PageNameLabel do
  begin
   
Font.Color := clGray;
    Font.Size := 14;
    Font.Style := [];
    AdjustHeight;
    Left := WizardForm.WizardSmallBitmapImage.Left + WizardForm.WizardSmallBitmapImage.Width + ScaleX(10);
    Top := (Parent.Height - Height) div 2;
    Width := HelpBitmap.Left - Left - ScaleX(10);
  end;
end;

///////////////////////////
procedure InitializeWizard;
begin
 
ChangeMainPanel;
end;


Цитата:

Цитата TheLeon
2.Можно ли сделать анимированный баннер(или слайд-шоу)? (см.скрин 2) »

TheLeon, пример
Скрытый текст

Код:

[Setup]
AppName=test
AppVerName=test
DefaultDirName={tmp}
Uninstallable=no
CreateUninstallRegKey=no

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl

[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
 
WS_CHILD = $40000000;
  WS_VISIBLE = $10000000;
  WS_DISABLED = $08000000;

// ATL Functions
function AtlAxWinInit: BOOL; external 'AtlAxWinInit@atl.dll stdcall';
function AtlAxCreateControl(lpszName: string; hWnd: HWND; pStream, ppUnkContainer: Longint): HResult; external 'AtlAxCreateControl@atl.dll stdcall';

// Window Functions
function GetSysColor(nIndex: Integer): DWORD; external 'GetSysColor@user32.dll stdcall';
function CreateWindowEx(dwExStyle: DWORD; lpClassName, lpWindowName: string; dwStyle: DWORD; x, y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance, lpParam: Longint): HWND; external 'CreateWindowEx{#A}@user32.dll stdcall';
function DestroyWindow(hWnd: HWND): BOOL; external 'DestroyWindow@user32.dll stdcall';

var
 
GIFWndHandle: HWND;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function ShowAnimatedGIF(AWndParent: HWND; ALeft, ATop, AWidth, AHeight: Integer; AUrl: string; AColor: TColor): HWND;
(*
Parameters:
  AWndParent...: A handle to the parent window
  ALeft........: The initial horizontal position of the window
  ATop.........: The initial vertical position of the window
  AWidth.......: The width of the window
  AHeight......: The height of the window
  AUrl.........: The URL or full path of the GIF file
  AColor.......: Color background
Return value:
  A handle to ActiveX control host window
*)
var
 
HTMLStr: string;
  ResultCode: HResult;
begin
  if not
AtlAxWinInit then Exit;
  Result := CreateWindowEx(0, 'AtlAxWin', '', WS_CHILD or WS_VISIBLE or WS_DISABLED, ALeft, ATop, AWidth, AHeight, AWndParent, 0, 0, 0);
  if Result = 0 then
   
RaiseException(SysErrorMessage(DLLGetLastError));

  if AColor < 0 then
   
AColor := GetSysColor(AColor and $0000FF);
  HTMLStr := Format('about:<html><body leftmargin="0" topmargin="0" scroll="no" bgcolor="#%.2x%.2x%.2x"><p align="center"><img src="%s" height="100%%"></img></p></body></html>', [AColor and $0000FF, AColor and $00FF00 shr 8, AColor and $FF0000 shr 16, AUrl]);

  ResultCode := AtlAxCreateControl(HTMLStr, Result, 0, 0);
  if ResultCode <> 0 then
   
RaiseException(SysErrorMessage(ResultCode));
end;

///////////////////////////
procedure InitializeWizard;
begin
 
GIFWndHandle := ShowAnimatedGIF(WizardForm.SelectDirPage.Handle,
    0, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + ScaleY(5), WizardForm.SelectDirPage.Width, WizardForm.DiskSpaceLabel.Top - WizardForm.DirEdit.Top - WizardForm.DirEdit.Height - ScaleY(5),
    'https://media.giphy.com/media/9y0qXExCElAgU/giphy.gif', WizardForm.SelectDirPage.Color);
end;

////////////////////////////
procedure DeinitializeSetup;
begin
  if
GIFWndHandle <> 0 then
   
DestroyWindow(GIFWndHandle);
end;


Цитата:

Цитата TheLeon
3.Можно ли при наведении, именно на первый пункт, показывало в превью изображения "Наведите курсор..."? (см.скрин 3) »

TheLeon, в ShowCompDescription после CompDescImg.Show; дописываете:
Скрытый текст

Код:

if Index = 0 then
 
CompDescText.Caption := 'Наведите курсор...'
else
 
CompDescText.Caption := '';


Цитата:

Цитата TheLeon
4.Можно ли сделать подобный стиль для кнопок(не меня размеры, просто стиль)? (см.скрин 4) »

TheLeon, ISSkin, ISSkinEx, vcl-styles-plugins, SkinSharp.

ROMKA-1977 24-04-2018 21:14 2810531

Здраствуйте, ув. форумчане. Подскажите пож. Возникла следующая проблема:
1. Создана кастомная страница
Код:

var
  Page: TWizardPage;

procedure InitializeWizard();
begin
 Page := CreateCustomPage(wpWelcome, 'ISCustomPage1_Caption', 'ISCustomPage1_Description');
end;

2. Необходимо создать панель расположенную на WizardForm но так чтобы она отображалась только при отображении кастомной страницы.
Код:

var
  Test_pnl: TPanel;

procedure InitializeWizard();
begin
  Test_pnl:= TPanel.Create(WizardForm);
  with Test_pnl do
  begin
    Top:= ScaleY(60);
    Width:= ScaleX(497);
    Height:= ScaleY(253);
    BevelOuter:= bvNone;
    Color := clLime;
    Parent:= WizardForm;
  end;
end;

Со стандартными страницами всё ясно на как быть в таком случае ?

nik1967 25-04-2018 08:06 2810567

ROMKA-1977,
Скрытый текст

Код:

[Setup]
AppName = MyApp
AppVerName = MyApp
DefaultDirname = {pf}\MyApp
OutputDir=.

[code]
var
  Page: TWizardPage;
  Test_pnl: TPanel;

procedure InitializeWizard();
begin
 
Page:= CreateCustomPage(wpWelcome, 'ISCustomPage1_Caption', 'ISCustomPage1_Description');

  Test_pnl:= TPanel.Create(WizardForm);
  with Test_pnl do begin
   
Top:= ScaleY(60);
    Width:= ScaleX(497);
    Height:= ScaleY(253);
    BevelOuter:= bvNone;
    Color:= clLime;
    ParentBackground:= false;
    Parent:= Page.Surface;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  case
CurPageID of
   
Page.ID: MsgBox('Hello.', mbInformation, MB_OK);
  end;
end;


ROMKA-1977 25-04-2018 13:28 2810630

Вложений: 1
nik1967, в вашем примере панель отображается на кастомной странице. Мне же необходимо создать её на WizardForm но так чтобы она отображалась при кастомной странице, примерно так:
http://forum.oszone.net/attachment.p...1&d=1524651856
Вслучае стандартных страниц я указывал так :

procedure CurPageChanged(CurPageID: Integer);
begin
Test_pnl.Hide;
case CurPageID of
wpInfoBefore: Test_pnl.Show;
end;
end;

Из справки Inno Setup: Значения PageID для определенных ранее страниц мастера
wpWelcome, wpLicense, wpPassword, wpInfoBefore, wpUserInfo, wpSelectDir, wpSelectComponents, wpSelectProgramGroup, wpSelectTasks, wpReady, wpPreparing, wpInstalling, wpInfoAfter, wpFinished

Как же вывести панель на WizardForm только при отображении кастомной страницы ?

nik1967 25-04-2018 13:50 2810637

ROMKA-1977,
Скрытый текст

Код:

[Setup]
AppName = MyApp
AppVerName = MyApp
DefaultDirname = {pf}\MyApp
OutputDir=.

[code]
var
  Page: TWizardPage;
  Test_pnl: TPanel;

procedure InitializeWizard();
begin
 
Page:= CreateCustomPage(wpWelcome, 'ISCustomPage1_Caption', 'ISCustomPage1_Description');

  Test_pnl:= TPanel.Create(WizardForm);
  with Test_pnl do begin
   
Top:= ScaleY(60);
    Width:= ScaleX(497);
    Height:= ScaleY(253);
    BevelOuter:= bvNone;
    Color:= clLime;
    ParentBackground:= false;
    Parent:= WizardForm;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
 
Test_pnl.Hide;
  case CurPageID of
   
Page.ID: Test_pnl.Show;
  end;
end;


TheLeon 09-05-2018 18:17 2812823

Здравствуйте, уважаемые форумчане OSZone.net.
-
1. Опять нужна ваша помощь в моих безумных идеях. Проще говоря: происходит долгий запуск установщика дополнений на игру, затем, перейдя на страницу выбора компонента(картинки на каждый компонент присутствуют), начинаются дикие тормоза установщика. Я думаю, что скорее всего, это большое кол-во и объём файлов установщика(весит 335 МБ). Если ли какие-нибудь решения по этой ситуации?
-
2. Проблема с установкой дополнений на игру, которая расположена в Program Files, прогресс бар в самом установщике показывает, что идёт установка, но, перейдя в папку игры, после окончания, ничего не изменилось/не добавилось.

Сам скрипт(.iss)

[Setup]
AppName=Vehicles for SpinTires™
AppVersion=1.0
AllowNoIcons=yes
AppPublisher=Leon
DefaultDirName=C:\Program Files (x86)\Spintires
DisableProgramGroupPage=auto
DisableReadyPage=yes
DirExistsWarning=no
DisableWelcomePage=yes
DisableFinishedPage=no
OutputBaseFilename=Vehicles for Spintires
OutputDir=C:\Users\Unknown\Documents\Inno Setup\Examples
LicenseFile=licence.rtf
SetupIconFile=images\SetupIcon.ico
WizardSmallImageFile=images\WizardSmallImage.bmp
WizardImageFile=images\WizardImage.bmp
PrivilegesRequired=admin
Compression=zip/9
InternalCompressLevel=ultra
CompressionThreads=2
SolidCompression=True
CreateUninstallRegKey=no
Uninstallable=no

[Languages]
Name: "RU"; MessagesFile: "Russian.isl"

[Types]
Name: full; Description: Полная установка;
Name: iscustom; Description: Выборочная установка;

[Components]
Name: CAR1; Description: {code:CompHelper|Bentley Continental Supersports}; Types: full;
Name: CAR2; Description: {code:CompHelper|BMW X5 M}; Types: full;
Name: CAR3; Description: {code:CompHelper|Chevrolet Silverado 2500}; Types: full;
Name: CAR4; Description: {code:CompHelper|Fiat Ducato (250)}; Types: full;
Name: CAR5; Description: {code:CompHelper|Ford Raptor Pre-Runner}; Types: full;
Name: CAR6; Description: {code:CompHelper|Hummer H3}; Types: full;
Name: CAR7; Description: {code:CompHelper|Jeep Grand Cherokee}; Types: full;
Name: CAR8; Description: {code:CompHelper|LADA Vesta (ВАЗ-2180)}; Types: full;
Name: CAR9; Description: {code:CompHelper|MAN TGX}; Types: full;
Name: CAR10; Description: {code:CompHelper|Mercedes-Benz G65 AMG}; Types: full;
Name: CAR11; Description: {code:CompHelper|Nissan Pathfinder (R51)}; Types: full;
Name: CAR12; Description: {code:CompHelper|Range Rover Evoque LRX}; Types: full;
Name: CAR13; Description: {code:CompHelper|Range Rover Vogue (L405)}; Types: full;
Name: CAR14; Description: {code:CompHelper|Subaru Impreza STI}; Types: full;
Name: CAR15; Description: {code:CompHelper|Toyota Hilux Tonka Concept 2017}; Types: full;
Name: CAR16; Description: {code:CompHelper|Volkswagen Touareg}; Types: full;
Name: CAR17; Description: {code:CompHelper|Volvo FM}; Types: full;
Name: CAR18; Description: {code:CompHelper|Volvo XC90}; Types: full;
Name: CAR19; Description: {code:CompHelper|ВАЗ 2103 Жигули}; Types: full;
Name: CAR20; Description: {code:CompHelper|ВАЗ-21213 Нива}; Types: full;

[Dirs]
Name: "{app}\Vehicles"; Permissions: everyone-full

[Files]
;------------------------------Bentley Continental Supersports------------------------------
Source: "Files\Bentley Continental Supersports\*"; DestDir: "{app}\Vehicles"; Flags: ignoreversion; Components: CAR1;
Source: "Files\Bentley Continental Supersports\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR1;
Source: "Files\Bentley Continental Supersports\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR1;
Source: "Files\Bentley Continental Supersports\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR1;
Source: "Files\Bentley Continental Supersports\sounds\engine\bentley_porsche\*"; DestDir: "{app}\Vehicles\sounds\engine\bentley_porsche"; Flags: ignoreversion; Components: CAR1;

;------------------------------------------BMW X5 M-----------------------------------------
Source: "Files\BMW X5 M\*"; DestDir: "{app}\Vehicles"; Flags: ignoreversion; Components: CAR2;
Source: "Files\BMW X5 M\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR2;
Source: "Files\BMW X5 M\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR2;
Source: "Files\BMW X5 M\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR2;
Source: "Files\BMW X5 M\sounds\*"; DestDir: "{app}\Vehicles\sounds"; Flags: ignoreversion; Components: CAR2;

;---------------------------------Chevrolet Silverado 2500----------------------------------
Source: "Files\Chevrolet Silverado 2500\*"; DestDir: "{app}\Vehicles"; Flags: ignoreversion; Components: CAR3;
Source: "Files\Chevrolet Silverado 2500\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR3;
Source: "Files\Chevrolet Silverado 2500\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR3;
Source: "Files\Chevrolet Silverado 2500\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR3;
Source: "Files\Chevrolet Silverado 2500\sounds\engine\*"; DestDir: "{app}\Vehicles\sounds\engine"; Flags: ignoreversion; Components: CAR3;
Source: "Files\Chevrolet Silverado 2500\textures\trucks\*"; DestDir: "{app}\Vehicles\textures\trucks"; Flags: ignoreversion; Components: CAR3;

;-------------------------------------Fiat Ducato (250)-------------------------------------
Source: "Files\Fiat Ducato (250)\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR4;
Source: "Files\Fiat Ducato (250)\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR4;
Source: "Files\Fiat Ducato (250)\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR4;
Source: "Files\Fiat Ducato (250)\meshes\trucks\*"; DestDir: "{app}\Vehicles\meshes\trucks"; Flags: ignoreversion; Components: CAR4;
Source: "Files\Fiat Ducato (250)\meshes\wheels\*"; DestDir: "{app}\Vehicles\meshes\wheels"; Flags: ignoreversion; Components: CAR4;
Source: "Files\Fiat Ducato (250)\sounds\mentura\*"; DestDir: "{app}\Vehicles\sounds\mentura"; Flags: ignoreversion; Components: CAR4;
Source: "Files\Fiat Ducato (250)\textures\trucks\police\*"; DestDir: "{app}\Vehicles\textures\trucks\police"; Flags: ignoreversion; Components: CAR4;

;----------------------------------Ford Raptor Pre-Runner-----------------------------------
Source: "Files\Ford Raptor Pre-Runner\*"; DestDir: "{app}\Vehicles"; Flags: ignoreversion; Components: CAR5;
Source: "Files\Ford Raptor Pre-Runner\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR5;
Source: "Files\Ford Raptor Pre-Runner\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR5;
Source: "Files\Ford Raptor Pre-Runner\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR5;
Source: "Files\Ford Raptor Pre-Runner\sounds\engine\SID-V8\*"; DestDir: "{app}\Vehicles\sounds\engine\SID-V8"; Flags: ignoreversion; Components: CAR5;

;-----------------------------------------Hummer H3-----------------------------------------
Source: "Files\Hummer H3\*"; DestDir: "{app}\Vehicles"; Flags: ignoreversion; Components: CAR6;
Source: "Files\Hummer H3\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR6;
Source: "Files\Hummer H3\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR6;
Source: "Files\Hummer H3\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR6;
Source: "Files\Hummer H3\sounds\engine\*"; DestDir: "{app}\Vehicles\sounds\engine"; Flags: ignoreversion; Components: CAR6;

;------------------------------------Jeep Grand Cherokee------------------------------------
Source: "Files\Jeep Grand Cherokee\*"; DestDir: "{app}\Vehicles"; Flags: ignoreversion; Components: CAR7;
Source: "Files\Jeep Grand Cherokee\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR7;
Source: "Files\Jeep Grand Cherokee\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR7;
Source: "Files\Jeep Grand Cherokee\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR7;
Source: "Files\Jeep Grand Cherokee\sounds\engine\V8\*"; DestDir: "{app}\Vehicles\sounds\engine\V8"; Flags: ignoreversion; Components: CAR7;

;-----------------------------------LADA Vesta (ВАЗ-2180)-----------------------------------
Source: "Files\LADA Vesta (ВАЗ-2180)\*"; DestDir: "{app}\Vehicles"; Flags: ignoreversion; Components: CAR8;
Source: "Files\LADA Vesta (ВАЗ-2180)\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR8;
Source: "Files\LADA Vesta (ВАЗ-2180)\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR8;
Source: "Files\LADA Vesta (ВАЗ-2180)\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR8;
Source: "Files\LADA Vesta (ВАЗ-2180)\sounds\laaadaaa_veeesttas\*"; DestDir: "{app}\Vehicles\sounds\laaadaaa_veeesttas"; Flags: ignoreversion; Components: CAR8;
Source: "Files\LADA Vesta (ВАЗ-2180)\sounds\laaadaaa_veeesttas\niZZmsa\*"; DestDir: "{app}\Vehicles\sounds\laaadaaa_veeesttas\niZZmsa"; Flags: ignoreversion; Components: CAR8;

;-------------------------------------------MAN TGX-----------------------------------------
Source: "Files\MAN TGX\*"; DestDir: "{app}\Vehicles"; Flags: ignoreversion; Components: CAR9;
Source: "Files\MAN TGX\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR9;
Source: "Files\MAN TGX\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR9;
Source: "Files\MAN TGX\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR9;
Source: "Files\MAN TGX\sounds\*"; DestDir: "{app}\Vehicles\sounds"; Flags: ignoreversion; Components: CAR9;

;-----------------------------------Mercedes-Benz G65 AMG-----------------------------------
Source: "Files\Mercedes-Benz G65 AMG\*"; DestDir: "{app}\Vehicles"; Flags: ignoreversion; Components: CAR11;
Source: "Files\Mercedes-Benz G65 AMG\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR10;
Source: "Files\Mercedes-Benz G65 AMG\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR10;
Source: "Files\Mercedes-Benz G65 AMG\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR10;
Source: "Files\Mercedes-Benz G65 AMG\meshes\trucks\*"; DestDir: "{app}\Vehicles\meshes\trucks"; Flags: ignoreversion; Components: CAR10;
Source: "Files\Mercedes-Benz G65 AMG\meshes\wheels\*"; DestDir: "{app}\Vehicles\meshes\wheels"; Flags: ignoreversion; Components: CAR10;
Source: "Files\Mercedes-Benz G65 AMG\sounds\*"; DestDir: "{app}\Vehicles\sounds"; Flags: ignoreversion; Components: CAR11;
Source: "Files\Mercedes-Benz G65 AMG\textures\merc_g65\*"; DestDir: "{app}\Vehicles\textures\merc_g65"; Flags: ignoreversion; Components: CAR10;

;-----------------------------------Nissan Pathfinder (R51)---------------------------------
Source: "Files\Nissan Pathfinder (R51)\*"; DestDir: "{app}\Vehicles"; Flags: ignoreversion; Components: CAR11;
Source: "Files\Nissan Pathfinder (R51)\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR11;
Source: "Files\Nissan Pathfinder (R51)\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR11;
Source: "Files\Nissan Pathfinder (R51)\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR11;
Source: "Files\Nissan Pathfinder (R51)\sounds\engine\V1\*"; DestDir: "{app}\Vehicles\sounds\engine\V1"; Flags: ignoreversion; Components: CAR11;
Source: "Files\Nissan Pathfinder (R51)\sounds\env\*"; DestDir: "{app}\Vehicles\sounds\env"; Flags: ignoreversion; Components: CAR11;

;-----------------------------------Range Rover Evoque LRX----------------------------------
Source: "Files\Range Rover Evoque LRX\*"; DestDir: "{app}\Vehicles"; Flags: ignoreversion; Components: CAR12;
Source: "Files\Range Rover Evoque LRX\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR12;
Source: "Files\Range Rover Evoque LRX\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR12;
Source: "Files\Range Rover Evoque LRX\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR12;
Source: "Files\Range Rover Evoque LRX\sounds\engine\*"; DestDir: "{app}\Vehicles\sounds\engine"; Flags: ignoreversion; Components: CAR12;

;---------------------------------Range Rover Vogue (L405)----------------------------------
Source: "Files\Range Rover Vogue (L405)\*"; DestDir: "{app}\Vehicles"; Flags: ignoreversion; Components: CAR13;
Source: "Files\Range Rover Vogue (L405)\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR13;
Source: "Files\Range Rover Vogue (L405)\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR13;
Source: "Files\Range Rover Vogue (L405)\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR13;
Source: "Files\Range Rover Vogue (L405)\sounds\*"; DestDir: "{app}\Vehicles\sounds"; Flags: ignoreversion; Components: CAR13;

;------------------------------------Subaru Impreza STI-------------------------------------
Source: "Files\Subaru Impreza STI\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR14;
Source: "Files\Subaru Impreza STI\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR14;
Source: "Files\Subaru Impreza STI\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR14;
Source: "Files\Subaru Impreza STI\meshes\trucks\*"; DestDir: "{app}\Vehicles\meshes\trucks"; Flags: ignoreversion; Components: CAR14;
Source: "Files\Subaru Impreza STI\meshes\wheels\*"; DestDir: "{app}\Vehicles\meshes\wheels"; Flags: ignoreversion; Components: CAR14;
Source: "Files\Subaru Impreza STI\sounds\enginesti\*"; DestDir: "{app}\Vehicles\sounds\enginesti"; Flags: ignoreversion; Components: CAR14;
Source: "Files\Subaru Impreza STI\textures\*"; DestDir: "{app}\Vehicles\textures"; Flags: ignoreversion; Components: CAR14;
Source: "Files\Subaru Impreza STI\textures\sti\*"; DestDir: "{app}\Vehicles\textures\sti"; Flags: ignoreversion; Components: CAR14;
Source: "Files\Subaru Impreza STI\textures\sub\*"; DestDir: "{app}\Vehicles\textures\sub"; Flags: ignoreversion; Components: CAR14;
Source: "Files\Subaru Impreza STI\textures\wh1\*"; DestDir: "{app}\Vehicles\textures\wh1"; Flags: ignoreversion; Components: CAR14;

;------------------------------Toyota Hilux Tonka Concept 2017------------------------------
Source: "Files\Toyota Hilux Tonka Concept 2017\*"; DestDir: "{app}\Vehicles"; Flags: ignoreversion; Components: CAR15;
Source: "Files\Toyota Hilux Tonka Concept 2017\_templates\*"; DestDir: "{app}\Vehicles\_templates"; Flags: ignoreversion; Components: CAR15;
Source: "Files\Toyota Hilux Tonka Concept 2017\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR15;
Source: "Files\Toyota Hilux Tonka Concept 2017\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR15;
Source: "Files\Toyota Hilux Tonka Concept 2017\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR15;
Source: "Files\Toyota Hilux Tonka Concept 2017\sounds\*"; DestDir: "{app}\Vehicles\sounds"; Flags: ignoreversion; Components: CAR15;
Source: "Files\Toyota Hilux Tonka Concept 2017\sounds\engine\*"; DestDir: "{app}\Vehicles\sounds\engine"; Flags: ignoreversion; Components: CAR15;
Source: "Files\Toyota Hilux Tonka Concept 2017\sounds\env\*"; DestDir: "{app}\Vehicles\sounds\env"; Flags: ignoreversion; Components: CAR15;
Source: "Files\Toyota Hilux Tonka Concept 2017\sounds\truck\*"; DestDir: "{app}\Vehicles\sounds\truck"; Flags: ignoreversion; Components: CAR15;
Source: "Files\Toyota Hilux Tonka Concept 2017\sounds\engine\V1\*"; DestDir: "{app}\Vehicles\sounds\engine\V1"; Flags: ignoreversion; Components: CAR15;

;------------------------------------Volkswagen Touareg-------------------------------------
Source: "Files\Volkswagen Touareg\*"; DestDir: "{app}\Vehicles"; Flags: ignoreversion; Components: CAR16;
Source: "Files\Volkswagen Touareg\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR16;
Source: "Files\Volkswagen Touareg\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR16;
Source: "Files\Volkswagen Touareg\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR16;
Source: "Files\Volkswagen Touareg\sounds\*"; DestDir: "{app}\Vehicles\sounds"; Flags: ignoreversion; Components: CAR16;

;------------------------------------------Volvo FM-----------------------------------------
Source: "Files\Volvo FM\*"; DestDir: "{app}\Vehicles"; Flags: ignoreversion; Components: CAR17;
Source: "Files\Volvo FM\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR17;
Source: "Files\Volvo FM\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR17;
Source: "Files\Volvo FM\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR17;
Source: "Files\Volvo FM\sounds\*"; DestDir: "{app}\Vehicles\sounds"; Flags: ignoreversion; Components: CAR17;

;-----------------------------------------Volvo XC90----------------------------------------
Source: "Files\Volvo XC90\*"; DestDir: "{app}\Vehicles"; Flags: ignoreversion; Components: CAR18;
Source: "Files\Volvo XC90\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR18;
Source: "Files\Volvo XC90\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR18;
Source: "Files\Volvo XC90\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR18;
Source: "Files\Volvo XC90\sounds\*"; DestDir: "{app}\Vehicles\sounds"; Flags: ignoreversion; Components: CAR18;

;--------------------------------------ВАЗ 2103 Жигули--------------------------------------
Source: "Files\ВАЗ 2103 Жигули\*"; DestDir: "{app}\Vehicles"; Flags: ignoreversion; Components: CAR19;
Source: "Files\ВАЗ 2103 Жигули\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR19;
Source: "Files\ВАЗ 2103 Жигули\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR19;
Source: "Files\ВАЗ 2103 Жигули\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR19;
Source: "Files\ВАЗ 2103 Жигули\sounds\LADA1500_nEw\*"; DestDir: "{app}\Vehicles\sounds\LADA1500_nEw"; Flags: ignoreversion; Components: CAR19;

;--------------------------------------Нива (ВАЗ-21213)-------------------------------------
Source: "Files\Нива (ВАЗ-21213)\*"; DestDir: "{app}\Vehicles"; Flags: ignoreversion; Components: CAR20;
Source: "Files\Нива (ВАЗ-21213)\billboards\trucks\*"; DestDir: "{app}\Vehicles\billboards\trucks"; Flags: ignoreversion; Components: CAR20;
Source: "Files\Нива (ВАЗ-21213)\classes\trucks\*"; DestDir: "{app}\Vehicles\classes\trucks"; Flags: ignoreversion; Components: CAR20;
Source: "Files\Нива (ВАЗ-21213)\classes\wheels\*"; DestDir: "{app}\Vehicles\classes\wheels"; Flags: ignoreversion; Components: CAR20;
Source: "Files\Нива (ВАЗ-21213)\sounds\2106\*"; DestDir: "{app}\Vehicles\sounds\2106"; Flags: ignoreversion; Components: CAR20;

;----------------------------------------Русификатор----------------------------------------
Source: "Files\translate\strings\ru\*"; DestDir: "{app}\Vehicles\strings\ru"; Flags: ignoreversion;

;--------------------------------------Временные файлы--------------------------------------
Source: "images\ad.bmp"; DestDir: "{tmp}"; Flags: dontcopy
Source: "images\vehicles\*"; DestDir: "{tmp}"; Flags: dontcopy

[code]
type
TComponentDesc = record
Description: String;
ImageName: String;
Index: Integer;
end;
var
ComponentsInfoImage: TBitmapImage;
ComponentHelper: TStringList;
CompDescText: TLabel;
Image1: TBitmapImage;
DelTmp: TNewCheckBox;
function CompHelper(Param: string): string;
var
Image: TBitmap;
Index: Integer;
begin
Result := '';
with TStringList.Create do
try
StringChangeEx(Param, '|', #13#10, True);
Text := Param;
if Count = 0 then Exit;
if Count > 0 then
Index := ComponentHelper.Add(Strings[0]);
if Count > 1 then
begin
if not FileExists(ExpandConstant('{tmp}\') + Strings[1]) then
ExtractTemporaryFile(Strings[1]);
Image := TBitmap.Create;
Image.LoadFromFile(ExpandConstant('{tmp}\') + Strings[1]);
ComponentHelper.Objects[Index] := Image;
end;
Result := ComponentHelper[Index];
finally
Free;
end;
end;

function DelTmpCheck(): boolean;
begin
result := DelTmp.Checked;
end;

procedure ComponentsListClickCheck(Sender: TObject);
begin
if not Assigned(Sender) or (TNewCheckListBox(Sender).ItemIndex = -1) then Exit;
ComponentsInfoImage.Bitmap.Assign(TBitmap(ComponentHelper.Objects[TNewCheckListBox(Sender).ItemIndex]));
end;

function InitializeSetup(): Boolean;
begin
Result := True;
ComponentHelper := TStringList.Create;
ComponentHelper.Duplicates := dupIgnore;
end;

var
CheckLicense: TCheckBox;

procedure LicenseOnClick(Sender: TObject);
begin
if (CheckLicense.Checked) = True then
begin
WizardForm.LicenseAcceptedRadio.Checked := True;
end else
begin
WizardForm.LicenseNotAcceptedRadio.Checked := True;
end;
end;

var
CompDescs: array of TComponentDesc;
CompDescImgPanel: TPanel;
CompIndex, LastIndex: Integer;
CompDescImg: TBitmapImage;

procedure ShowCompDescription(Sender: TObject; X, Y, Index: Integer; Area: TItemArea);
var
i: Integer;
begin
if Index = LastIndex then Exit;
CompIndex := -1;
for i := 0 to GetArrayLength(CompDescs) -1 do
begin
if (CompDescs[i].Index = Index) then
begin
CompIndex := i;
Break;
end;
end;
if (CompIndex >= 0) and (Area = iaItem) then
begin
if not FileExists(ExpandConstant('{tmp}\') + CompDescs[CompIndex].ImageName) then
ExtractTemporaryFile(CompDescs[CompIndex].ImageName);
CompDescImg.Bitmap.LoadFromFile(ExpandConstant('{tmp}\') + CompDescs[CompIndex].ImageName);
CompDescImg.Show;
if Index = 0 then
CompDescText.Caption := 'Наведите курсор мыши на компонент, чтобы посмотреть его превью.';
end;
LastIndex := Index;
end;

procedure CompListMouseLeave(Sender: TObject);
begin
CompDescImg.Hide;
LastIndex := -1;
end;

procedure AddCompDescription(AIndex: Integer; ADescription: String; AImageName: String);
var
i: Integer;
begin
i := GetArrayLength(CompDescs);
SetArrayLength(CompDescs, i + 1);
CompDescs[i].Description := ADescription;
CompDescs[i].ImageName := AImageName;
CompDescs[i].Index := AIndex - 1
end;

procedure Image1Click(Sender: TObject);
var ErrorCode: Integer;
begin
ShellExec('open','https://www.nssro.ga','', '', SW_SHOW, ewNoWait, ErrorCode)
end;

procedure InitializeWizard();
var
i: Integer;
begin
WizardForm.SelectComponentsLabel.Hide;
WizardForm.SelectDirBitmapImage.Hide;
WizardForm.DiskSpaceLabel.Hide;
WizardForm.DirBrowseButton.SetBounds(ScaleX(342),ScaleY(39),ScaleX(75),ScaleY(22));
WizardForm.DirEdit.SetBounds(ScaleX(0),ScaleY(40),ScaleX(332),ScaleY(20));
WizardForm.SelectDirBrowseLabel.SetBounds(ScaleX(0),ScaleY(13),ScaleX(417),ScaleY(27));
WizardForm.SelectDirLabel.SetBounds(ScaleX(0),ScaleY(1),ScaleX(417),ScaleY(14));
WizardForm.TypesCombo.Top := ScaleY(0)
WizardForm.ComponentsList.OnItemMouseMove:= @ShowCompDescription;
WizardForm.ComponentsList.OnMouseLeave := @CompListMouseLeave;
WizardForm.ComponentsList.Visible := True;
WizardForm.ComponentsList.Height := ScaleX(204);
WizardForm.ComponentsList.Top := ScaleX(31);
WizardForm.ComponentsList.Width := ScaleX(200);
for i := 0 to WizardForm.ComponentsList.Items.Count - 1 do
if not WizardForm.ComponentsList.ItemEnabled[i] then
WizardForm.ComponentsList.ItemSubItem[i] := '';
WizardForm.ComponentsDiskSpaceLabel.Visible := True;
WizardForm.LicenseNotAcceptedRadio.Hide;
WizardForm.LicenseAcceptedRadio.Hide;
WizardForm.LicenseMemo.Height := ScaleY(175);

DelTmp := TNewCheckBox.Create(WizardForm);
DelTmp.Parent := WizardForm.FinishedPage;
DelTmp.Caption := 'Удалить временные файлы';
DelTmp.Left := ScaleX(180);
DelTmp.Top := ScaleY(207);
DelTmp.Width := ScaleX(300);
DelTmp.Height := ScaleY(15);;
DelTmp.Checked := true;

CheckLicense:= TCheckBox.Create(WizardForm);
CheckLicense.Left:= ScaleX(0);
CheckLicense.Top:= ScaleY(216);
CheckLicense.Caption:= WizardForm.LicenseAcceptedRadio.Caption;
CheckLicense.Width:= ScaleX(417);
CheckLicense.OnClick:= @LicenseOnClick;
CheckLicense.Parent:= WizardForm.LicensePage;

Image1 := TBitmapImage.Create(WizardForm);
with Image1 do
begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(0),ScaleY(70),ScaleX(416),ScaleY(170));
ExtractTemporaryFile('ad.bmp');
Bitmap.LoadFromFile(ExpandConstant('{tmp}\ad.bmp'));
OnClick:=@Image1Click;
Enabled:=True;
Cursor:=crHand;
end;

CompDescImgPanel := TPanel.Create(WizardForm);
with CompDescImgPanel do
begin
Parent := WizardForm.SelectComponentsPage;
SetBounds(ScaleX(212), ScaleY(30), ScaleX(205), ScaleY(205));
BevelInner := bvLowered;
end;

CompDescText := TLabel.Create(WizardForm);
with CompDescText do
begin
Parent := CompDescImgPanel;
SetBounds(ScaleX(5), ScaleY(5), CompDescImgPanel.Width - ScaleX(10), CompDescImgPanel.Height - ScaleY(10));
AutoSize := False;
WordWrap := True;
Enabled := False;
Caption := 'Наведите курсор мыши на компонент, чтобы посмотреть его превью.';
end;

CompDescImg := TBitmapImage.Create(WizardForm);
with CompDescImg do
begin
Parent := CompDescImgPanel;
SetBounds(ScaleX(4), ScaleY(4), CompDescImgPanel.Width - ScaleX(7), CompDescImgPanel.Height - ScaleY(7));
Stretch := True;
Hide;
end;
AddCompDescription(1, (''), 'car1.bmp');
AddCompDescription(2, (''), 'car2.bmp');
AddCompDescription(3, (''), 'car3.bmp');
AddCompDescription(4, (''), 'car4.bmp');
AddCompDescription(5, (''), 'car5.bmp');
AddCompDescription(6, (''), 'car6.bmp');
AddCompDescription(7, (''), 'car7.bmp');
AddCompDescription(8, (''), 'car8.bmp');
AddCompDescription(9, (''), 'car9.bmp');
AddCompDescription(10, (''), 'car10.bmp');
AddCompDescription(11, (''), 'car11.bmp');
AddCompDescription(12, (''), 'car12.bmp');
AddCompDescription(13, (''), 'car13.bmp');
AddCompDescription(14, (''), 'car14.bmp');
AddCompDescription(15, (''), 'car15.bmp');
AddCompDescription(16, (''), 'car16.bmp');
AddCompDescription(17, (''), 'car17.bmp');
AddCompDescription(18, (''), 'car18.bmp');
AddCompDescription(19, (''), 'car19.bmp');
AddCompDescription(20, (''), 'car20.bmp');
end;

procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpSelectComponents: ComponentsListClickCheck(nil);
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssDone:
begin
if DelTmpCheck then
begin
DelTree(ExpandConstant('{localappdata}\Temp'), false, true, true);
end;
end;
end;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
case CurPageID of
wpSelectDir:
if not FileExists(ExpandConstant('{app}\SpinTires.exe')) then begin
MsgBox('Ошибка! Вы должны указать путь до папки Spintires.', mbError, MB_OK);
Result := False;
end;
end;
end;

[Run]
Filename: "https://www.worldofmods.ru"; Description: "Посетить сайт WorldOfMods.ru"; Flags: postinstall shellexec;
Filename: "https://www.nsspro.ga"; Description: "«Not So Serious» в Steam"; Flags: postinstall shellexec;
Filename: "mailto:support@nsspro.ga"; Description: "Написать в поддержку"; Flags: postinstall shellexec unchecked;

habib2302 09-05-2018 19:09 2812827

TheLeon, Временные файлы ставьте вверх списка т.к. инсталлятор выгружает файлы с верху в низ. Из-за этого инсталлятор и тормозит после запуска

TheLeon 11-05-2018 13:54 2813164

habib2302, здравствуй, а возможно ли отключить размерность на всех компонентах установщика?

habib2302 11-05-2018 14:08 2813167

TheLeon, я как понял, чтобы инсталлятор не показывал размеры компонентов?
Поменяйте WizardForm.ComponentsDiskSpaceLabel.Visible := True; на False

habib2302 11-05-2018 14:27 2813171

TheLeon, попробуйте поменять WizardForm.ComponentsDiskSpaceLabel.Visible := False; на WizardForm.ComponentsDiskSpaceLabel.Hide;

TheLeon 11-05-2018 14:51 2813178

habib2302, проблему решил, а именно: особо не заморачиваясь, зашёл в russian.isl и нашёл строчки ComponentSize=... и стёр всё, что после знака равно. Но всё равно спасибо вам.
-
Да, опять же возник вопрос: возможно ли сдвинуть поле тип установки вверх, а то я пытался, но у меня половина этого элемента перекрывал задний фон.
https://c.radikal.ru/c14/1805/73/252847181f0e.png

habib2302 11-05-2018 15:12 2813183

TheLeon, ваша ссылка не работает. ПЕРЕЙДИТЕ ПО ССЫЛКЕ НИЖЕ
http://forum.oszone.net/faq.php?faq=...chment_explain
Ссылка на прикрепленный файл не работает. Надо прикреплять в свое сообщение или загружать на облако или файлообм....

habib2302 11-05-2018 15:30 2813185

TheLeon, тут без понятия. если был бы полный скрипт со всеми необходимыми файлами для работы инсталлятора, то помог.

TheLeon 11-05-2018 15:47 2813191

habib2302. Ещё, если не трудно, посмотрите, почему не хочет устанавливать дополнения в program files и подобные директории.

habib2302 11-05-2018 16:50 2813216

TheLeon, поле тип установки и так находится на 0 отметке WizardForm.TypesCombo.Top := ScaleY(0).
Цитата:

Цитата TheLeon
не хочет устанавливать дополнения в program files и подобные директории. »

в параметре DefaultDirName у вас указанно C:\Program Files (x86)\Spintires когда вместо C:\Program Files (x86) должна быть указана константа {pf} (подробнее читайте справку). Для наилучшего сжатия инсталлятора
замените
Compression=zip/9
InternalCompressLevel=ultra
CompressionThreads=2
SolidCompression=True

на
Compression=lzma2/Ultra64
SolidCompression=true
InternalCompressLevel=Ultra64
LZMADictionarySize=65536
LZMAMatchFinder=BT
LZMANumFastBytes=273
MergeDuplicateFiles=yes

habib2302 11-05-2018 21:03 2813289

TheLeon, если вам нужно, чтобы инсталлятор устанавливал допы в папку с игрой, то надо делать через реестр
DefaultDirName={reg:HKxx\SubkeyName,ValueName|Default}
для установки в program files добавьте в раздел setup
ArchitecturesInstallIn64BitMode=x64
ArchitecturesAllowed=x86 x64

TheLeon 18-05-2018 19:21 2814397

habib2302, нужна помощь, опять:
1. Как сделать так, чтобы после установки запускался bat файл(в зависимости оттого какой ты компонент выбрал), от имени администратора + скрытая установка(не высвечивалась командная строка)?
2. Как через bat открыть файл(.txt) и в конце дописать строчки(если они отсутствуют, если же нет, то ничего не делать):

habib2302 18-05-2018 20:32 2814410

Цитата:

Цитата TheLeon
2. Как через bat открыть файл(.txt) и в конце дописать строчки(если они отсутствуют, если же нет, то ничего не делать): »

Цитата:

Цитата TheLeon
от имени администратора »

вам сюда
Цитата:

Цитата TheLeon
1. Как сделать так, чтобы после установки запускался bat файл(в зависимости оттого какой ты компонент выбрал), скрытая установка(не высвечивалась командная строка)? »

Если у вас не запускается батник добавьте
Flags: ShellExec;
для скрытой установки добавьте
Flags: RunHidden;
в зависимости от выбранного компонента добавьте
Components: имя компонента; к нужным строкам из раздела run. если вам нужно добавить несколько компонентов к одной строке, то добавляйте имя компонента через пробел Components: AFP\INSTALL\AX AFP\INSTALL\ALL;

Iska 18-05-2018 21:37 2814418

Цитата:

Цитата habib2302
вам сюда »

С чего бы это туда. Встроенный язык InnoSetup — это, как раз-таки, здесь. Никакие «bat'ы» здесь не нужны.

Я и это: [решено] Замена строк в файле формата .xml предлагал, чтобы сделали здесь же на том же самом встроенном Паскале.

El Sanchez 19-05-2018 13:01 2814461

Цитата:

Цитата Iska
Я и это: [решено] Замена строк в файле формата .xml предлагал, чтобы сделали здесь же на том же самом встроенном Паскале. »

Iska, да легко:
Скрытый текст

Код:


[Code]
/////////////////////////////////////////////////
procedure VehiclesConfig(const FileName: string);
var
 
XMLDoc, XMLNodes, XMLNode: Variant;
  XPath: string;
begin
  try
   
XMLDoc := CreateOleObject('Msxml2.DOMDocument');
    XMLDoc.setProperty('SelectionLanguage', 'XPath');
    XMLDoc.async := False;
    XMLDoc.load(FileName);
    if XMLDoc.parseError.errorCode <> 0 then
     
RaiseException(string(XMLDoc.parseError.reason));

    XMLNode := XMLDoc.createElement('MediaPath');
    XMLNode.setAttribute('Path', 'Vehicles');

    XPath := '/Config/MediaPath[@Path="Media" and not(following-sibling::*[1][self::MediaPath[@Path="Vehicles"]])]/following-sibling::*[1]';
  #if (Ver < 0x5050600) ; avoid VarIsNull
   
XMLNodes := XMLDoc.selectNodes(XPath);
    if XMLNodes.length = 1 then
     
XMLDoc.documentElement.insertBefore(XMLNode, XMLNodes.item(0));
  #else
   
XMLNodes := XMLDoc.selectSingleNode(XPath);
    if not VarIsClear(XMLNodes) then
     
XMLDoc.documentElement.insertBefore(XMLNode, XMLNodes);
  #endif
   
XMLDoc.save(FileName);
  except
   
ShowExceptionMessage;
  finally
  end
;
end;

///////////////////////////
procedure InitializeWizard;
begin
 
VehiclesConfig('{#SourcePath}\example.xml');
end;


ROMKA-1977 28-05-2018 11:31 2815884

Здраствуйте. Помогите пож. объединить два кода.

К инсталятору добавил код фонового изображения используя isgsg.dll:
Скрытый текст

[Setup]
SourceDir=.
OutputDir=Setup
AppName=My Program
AppVerName=1.0
AppVersion=1.0
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
DisableWelcomePage=false
DisableDirPage=false
DisableProgramGroupPage=false

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

[Files]
Source: "Fon.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "isgsg.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: {win}\help\*; DestDir: {app}\Files; Flags: external recursesubdirs createallsubdirs;

[UninstallDelete]
Type: filesandordirs; Name: "{app}"

[_Code]
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall delayload';
function ssInitialize(hParent:HWND;ssTimeShow:integer;FadeOut:boolean;StretchMode:integer;BkgColor:DWORD):boo lean; external 'ssInitialize@files:isgsg.dll stdcall delayload';
procedure ssDeInitialize; external 'ssDeInitialize@files:isgsg.dll stdcall delayload';
procedure ssSetBkgImage(FileName:PChar); external 'ssSetBkgImage@files:isgsg.dll stdcall delayload';

procedure InitializeWizard;
begin
ssInitialize(GetWindowLong(MainForm.Handle,-8),0,False,1,$FF000000);
ExtractTemporaryFile('Fon.jpg');
ssSetBkgImage(ExpandConstant('{tmp}')+'\Fon.jpg');
end;

procedure DeinitializeSetup;
begin
ssDeInitialize;
end;

На странице InstallingPage прописал код минимизации окна:
Скрытый текст

[_Code]
var
ResizeButton: TButton;
PageResized, Show: Boolean;

function GetSystemMetrics(nIndex:Integer):integer;
external 'GetSystemMetrics@user32.dll stdcall delayload';
function GetSystemMenu(hWnd: HWND; bRevert: BOOL): LongWord;
external 'GetSystemMenu@user32.dll stdcall';
function DeleteMenu(hMenu: LongWord; uPosition, uFlags: UINT): BOOL;
external 'DeleteMenu@user32.dll stdcall';

procedure MinimizeInstallPage();
begin
WizardForm.MainPanel.Hide;
WizardForm.Bevel1.Hide;
WizardForm.Width:= ScaleX(395);
WizardForm.Height:= ScaleY(142);
WizardForm.Left:= GetSystemMetrics(16)-ScaleX(420);
WizardForm.Top:= GetSystemMetrics(17)-ScaleX(150);
WizardForm.InnerNotebook.Left:= ScaleX(10);
WizardForm.InnerNotebook.Top:= ScaleY(10);
WizardForm.InnerNotebook.Width:= ScaleX(370);
WizardForm.StatusLabel.Left:= ScaleX(0);
WizardForm.StatusLabel.Top:= ScaleY(0);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:= ScaleX(0);
WizardForm.FileNameLabel.Top:= ScaleY(20);
WizardForm.FileNameLabel.Width:= WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:= ScaleY(40);
WizardForm.ProgressGauge.Width:= WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:= ScaleX(220);
WizardForm.CancelButton.Top:= ScaleY(80);
WizardForm.CancelButton.BringToFront;
ResizeButton.Left:= ScaleX(60);
ResizeButton.Top:= ScaleY(80);
ResizeButton.Caption:= 'Max.';
PageResized:= True;
end;

procedure ResumeInstallPage();
begin
WizardForm.Width:= ScaleX(503);
WizardForm.Height:= ScaleY(388);
WizardForm.Position:= poScreenCenter;
if Show then begin
WizardForm.MainPanel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(497), ScaleY(58));
WizardForm.MainPanel.Show;
WizardForm.Bevel1.Show;
end;
WizardForm.InnerNotebook.SetBounds(ScaleX(40), ScaleY(72), ScaleX(417), ScaleY(237));
WizardForm.StatusLabel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(417), ScaleY(16));
WizardForm.FilenameLabel.SetBounds(ScaleX(0), ScaleY(16), ScaleX(417), ScaleY(16));
WizardForm.ProgressGauge.SetBounds(ScaleX(0), ScaleY(42), ScaleX(417), ScaleY(21));
WizardForm.CancelButton.SetBounds(ScaleX(412), ScaleY(327), ScaleX(75), ScaleY(23));
ResizeButton.SetBounds(ScaleX(20), ScaleY(327),ScaleX(75), ScaleY(23));
ResizeButton.Caption:= 'Min.';
PageResized:= False;
end;

procedure ResizeButtonOnClick(Sender: TObject);
begin
If PageResized then
ResumeInstallPage
else
MinimizeInstallPage;
end;

procedure InitializeWizard();
begin
ResizeButton:= TButton.Create(WizardForm);
ResizeButton.SetBounds(ScaleX(20), ScaleY(327),ScaleX(75), ScaleY(23));
ResizeButton.OnClick:= @ResizeButtonOnClick;
ResizeButton.Caption:= 'Min.';
ResizeButton.Hide;
ResizeButton.Parent:= WizardForm;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
ResizeButton.Hide;
case CurPageID of
wpInstalling:
begin
Show:= true;
ResizeButton.Show;
end;
wpFinished:
begin
Show:= false;
ResumeInstallPage;
DeleteMenu(GetSystemMenu(WizardForm.Handle,False),$F060,0);
end;
end;
end;

procedure BtnDisable();
begin
ResizeButton.Enabled := False;
end;

Необходимо выполнить следующее:
1. При клике на кнопку "Min" фоновое изображение закрывается
2. При клике на кнопку "Max" фоновое изображение отображается

El Sanchez 29-05-2018 17:15 2816073

Цитата:

Цитата ROMKA-1977
Необходимо выполнить следующее:
1. При клике на кнопку "Min" фоновое изображение закрывается
2. При клике на кнопку "Max" фоновое изображение отображается »

ROMKA-1977, в секцию Setup добавить WindowVisible=yes и WindowShowCaption=no, в процедуре ResizeButtonOnClick в конце дописать MainForm.Visible := not PageResized;

ROMKA-1977 30-05-2018 09:29 2816141

Цитата:

Цитата El Sanchez
в секцию Setup добавить WindowVisible=yes и WindowShowCaption=no, в процедуре ResizeButtonOnClick в конце дописать MainForm.Visible := not PageResized; »

Получилось но не совсем то. Поверх фонового изображения "xxx.jpg" теперь накладывается стандартный синий фон Inno Setup вот он закрывается и отображается при кликах на кнопки "Min" и "Max", а фоновое изображение "xxx.jpg" как и ранее отображается на экране при клике на кнопку "Min".

Nikolay4 30-05-2018 16:42 2816182

Добрый день, подскажите, возможно ли как-то прикрутить inno download plugin к скрипту "Opera"
чтоб прогресс скачивания нормально отображался перед распаковкой.

Сам скрипт

El Sanchez 31-05-2018 10:08 2816246

Цитата:

Цитата ROMKA-1977
Получилось но не совсем то. Поверх фонового изображения "xxx.jpg" теперь накладывается стандартный синий фон Inno Setup вот он закрывается и отображается при кликах на кнопки "Min" и "Max", а фоновое изображение "xxx.jpg" как и ранее отображается на экране при клике на кнопку "Min". »

ROMKA-1977, не проверял, не хочу библиотеку искать :). Попробуйте вместо ssInitialize(GetWindowLong(MainForm.Handle,-8),0,False,1,$FF000000); написать ssInitialize(MainForm.Handle,0,False,1,$FF000000);
P.S. GetWindowLong(MainForm.Handle,-8) - попытка автора библиотеки Application.Handle получить. Ужас.

Sotonisto 13-06-2018 02:13 2818046

Доброго времени суток. Будьте добры подскажите:
1. Как изменить цвет текста лицензионного соглашения? WizardForm.LicenseMemo.Font.Color не даёт никакого эффекта.
2. Существует ли способ разместить текст на Splash изображении?
3. Можно ли в WizardForm.ComponentsList добавить название колонок (как в таблицах)? По сути над списком чекбоксов должна размещаться линия, поделенная на 3 "колонки", такого вида: [ Пустая ячейка | Компоненты | Размер компонента].

El Sanchez 14-06-2018 12:04 2818213

Цитата:

Цитата Sotonisto
1. Как изменить цвет текста лицензионного соглашения? WizardForm.LicenseMemo.Font.Color не даёт никакого эффекта. »

Sotonisto, используйте rtf-файл
Цитата:

Цитата Sotonisto
3. Можно ли в WizardForm.ComponentsList добавить название колонок (как в таблицах)? По сути над списком чекбоксов должна размещаться линия, поделенная на 3 "колонки", такого вида: [ Пустая ячейка | Компоненты | Размер компонента]. »

Sotonisto,
Скрытый текст

Код:

[Code]
#define A = (Defined UNICODE) ? "W" : "A"
#ifndef IS_ENHANCED
const
 
WC_HEADER = 'SysHeader32';
  WS_CHILD = $40000000;
  WS_VISIBLE = $10000000;
  WS_DISABLED = $08000000;
  WM_SETFONT = $0030;
  HDI_WIDTH = $0001;
  HDI_TEXT = $0002;
  HDI_FORMAT = $0004;
  HDF_CENTER = $0002;
  HDF_STRING = $4000;
  HDM_FIRST = $1200;
  HDM_INSERTITEM = HDM_FIRST + {#ifdef UNICODE}10{#else}1{#endif};

type
 
THDItem = record
   
Mask: LongWord;
    cxy: Integer;
    pszText: string;
    hbm: HBITMAP;
    cchTextMax: Integer;
    fmt: Integer;
    lParam: LongWord;
    iImage: Integer;
    iOrder: Integer;
    _type: LongWord;
    pvFilter: LongWord;
    state: LongWord;
  end;

// Window Functions
function CreateWindowEx(dwExStyle: DWORD; lpClassName, lpWindowName: string; dwStyle: DWORD; x, y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: THandle; hInstance, lpParam: Longint): HWND; external 'CreateWindowEx{#A}@user32.dll stdcall';
function DestroyWindow(hWnd: HWND): BOOL; external 'DestroyWindow@user32.dll stdcall';
// Message Functions
function SendMessageHDItem(hWnd: HWND; Msg: LongWord; wParam: Longint; var lParam: THDItem): Longint; external 'SendMessage{#A}@user32.dll stdcall';

var
 
HeaderHandle: HWND;
#endif

procedure CreateHeader;
var
#ifdef IS_ENHANCED
 
HeaderControl: THeaderControl;
  HeaderSection: THeaderSection;
#else
 
HDItem: THDItem;
#endif
begin
  with
WizardForm.ComponentsList do
  begin
#ifdef IS_ENHANCED
   
HeaderControl := THeaderControl.Create(WizardForm);
    HeaderControl.Parent := WizardForm.ComponentsList;
    HeaderControl.Enabled := False;
    HeaderSection := HeaderControl.Sections.Add;
    HeaderSection.Width := ClientWidth div 3;
    HeaderSection.Alignment := taCenter;
    HeaderSection.Text := '';
    HeaderSection := HeaderControl.Sections.Add;
    HeaderSection.Width := ClientWidth div 3;
    HeaderSection.Alignment := taCenter;
    HeaderSection.Text := 'Компоненты';
    HeaderSection := HeaderControl.Sections.Add;
    HeaderSection.Width := ClientWidth div 3;
    HeaderSection.Alignment := taCenter;
    HeaderSection.Text := 'Размер компонента';
#else
   
HeaderHandle := CreateWindowEx(0, WC_HEADER, '', WS_VISIBLE or WS_CHILD or WS_DISABLED, 0, 0, ClientWidth, MinItemHeight, Handle, 0, 0, 0);
    if HeaderHandle = 0 then Exit;
    SendMessage(HeaderHandle, WM_SETFONT, Font.Handle, 1);
    HDItem.Mask := HDI_WIDTH or HDI_TEXT or HDI_FORMAT;
    HDItem.cxy := ClientWidth div 3;
    HDItem.fmt := HDF_CENTER or HDF_STRING;
    HDItem.pszText := '';
    SendMessageHDItem(HeaderHandle, HDM_INSERTITEM, 0, HDItem);
    HDItem.pszText := 'Компоненты';
    SendMessageHDItem(HeaderHandle, HDM_INSERTITEM, 1, HDItem);
    HDItem.pszText := 'Размер компонента';
    SendMessageHDItem(HeaderHandle, HDM_INSERTITEM, 2, HDItem);
#endif
 
end;
end;

procedure InitializeWizard;
begin
 
CreateHeader;
end;

procedure DeinitializeSetup;
begin
#ifndef IS_ENHANCED
 
if HeaderHandle <> 0 then
   
DestroyWindow(HeaderHandle);
#endif
end;


Sotonisto 15-06-2018 03:57 2818301

El Sanchez, скрипт для ComponentsList работает, но название колонок скрывает первый компонент. Каким образом можно разместить название колонок до первого компонента? Или же сделать отступ определенного размера перед списком компонентов?

El Sanchez 15-06-2018 14:37 2818342

Цитата:

Цитата Sotonisto
скрипт для ComponentsList работает, но название колонок скрывает первый компонент. »

Sotonisto, точно, еще и стирается при нажатии на первый компонент. Вот вариант на расширенной версии, где заголовок рисуется на неклиентской части ComponentsList:
Скрытый текст

Код:

[Code]
#define A = (Defined UNICODE) ? "W" : "A"
type
 
TNCCalcSizeParams = record
   
rgrc0: TRect;
    rgrc1: TRect;
    rgrc2: TRect;
  end;

// Shell Functions
function SetWindowSubclass(hWnd: HWND; pfnSubclass: Longint; uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): BOOL; external 'SetWindowSubclass@comctl32.dll stdcall';
function RemoveWindowSubclass(hWnd: HWND; pfnSubclass: Longint; uIdSubclass: UINT_PTR): BOOL; external 'RemoveWindowSubclass@comctl32.dll stdcall';
function DefSubclassProc(hWnd: HWND; uMsg: UINT; wParam, lParam: Longint): Longint; external 'DefSubclassProc@comctl32.dll stdcall';
// Run-Time Library (RTL) Routines
function ReadNCCalcSizeParams(out Destination: TNCCalcSizeParams; const Source: LongWord; len: Integer): Integer; external 'RtlMoveMemory@kernel32.dll stdcall';
// Debugging Functions
function WriteNCCalcSizeParams(hProcess: THandle; lpBaseAddress: Longint; var lpBuffer: TNCCalcSizeParams; nSize: DWORD; out lpNumberOfBytesWritten: DWORD): BOOL; external 'WriteProcessMemory@kernel32.dll stdcall';
// Process and Thread Functions
function GetCurrentProcess: THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
// Device Context Functions
function GetDCEx(hWnd: HWND; hrgnClip: THandle; flags: DWORD): THandle; external 'GetDCEx@user32.dll stdcall';
function ReleaseDC(hWnd: HWND; hDC: THandle): Integer; external 'ReleaseDC@user32.dll stdcall';
//  Painting and Drawing Functions
function GetWindowDC(hWnd: HWND): THandle; external 'GetWindowDC@user32.dll stdcall';
// Window Functions
function GetWindowRect(hWnd: HWND; var lpRect: TRect): BOOL; external 'GetWindowRect@user32.dll stdcall';
function SetWindowPos(hWnd, hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; external 'SetWindowPos@user32.dll stdcall';

const
 
WM_NCCALCSIZE = $0083;
  WM_NCPAINT = $0085;

  SWP_NOSIZE = 1;
  SWP_NOMOVE = 2;
  SWP_NOZORDER = 4;
  SWP_FRAMECHANGED = $20;
  SWP_NOOWNERZORDER = $200;

  DCX_WINDOW = 1;
  DCX_CACHE = 2;
  DCX_INTERSECTRGN = $80;
  DCX_USESTYLE = $10000;
  DCX_KEEPCLIPRGN = $40000;

var
 
PCheckListBoxWndProc: LongWord;
  HeaderControl: THeaderControl;

function CheckListBoxWndProc(hWnd: HWND; uMsg: UINT; wParam, lParam: Longint; uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): LongWord;
var
 
DC: THandle;
  NCCalcSizeParams: TNCCalcSizeParams;
  NumberOfBytesWritten: DWORD;
  P: TPoint;
  R: TRect;
begin
  case
uMsg of
   
WM_NCCALCSIZE:
      begin
       
Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
        ReadNCCalcSizeParams(NCCalcSizeParams, lParam, SizeOf(NCCalcSizeParams));
        NCCalcSizeParams.rgrc0.Top := NCCalcSizeParams.rgrc0.Top + HeaderControl.Height;
        WriteNCCalcSizeParams(GetCurrentProcess, lParam, NCCalcSizeParams, SizeOf(NCCalcSizeParams), NumberOfBytesWritten);
      end;
    WM_NCPAINT:
      begin
        if
(wParam <> 0) and (wParam <> 1) then
         
DC := GetDCEx(hWnd, wParam, DCX_WINDOW or DCX_CACHE or DCX_INTERSECTRGN or DCX_KEEPCLIPRGN or DCX_USESTYLE)
        else
         
DC := GetWindowDC(hWnd);
        try
         
Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
          GetWindowRect(hWnd, R);
          P.x := 0;
          P.y := -HeaderControl.Height;
          P := HeaderControl.ClientToScreen(P);
          HeaderControl.PaintTo(DC, P.x - R.Left, P.y - R.Top);
        finally
         
ReleaseDC(hWnd, DC);
        end;
      end;
  else
   
Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
  end;
end;

procedure CreateHeader;
var
 
HeaderSection: THeaderSection;
begin
  with
WizardForm.ComponentsList do
  begin
   
HeaderControl := THeaderControl.Create(WizardForm);
    HeaderControl.Parent := WizardForm.ComponentsList;
    HeaderControl.Enabled := False;
    HeaderSection := HeaderControl.Sections.Add;
    HeaderSection.Width := ClientWidth div 3;
    HeaderSection.Alignment := taCenter;
    HeaderSection.Text := '';
    HeaderSection := HeaderControl.Sections.Add;
    HeaderSection.Width := ClientWidth div 3;
    HeaderSection.Alignment := taCenter;
    HeaderSection.Text := 'Компоненты';
    HeaderSection := HeaderControl.Sections.Add;
    HeaderSection.Width := ClientWidth div 3;
    HeaderSection.Alignment := taCenter;
    HeaderSection.Text := 'Размер компонента';

    // sublass
   
PCheckListBoxWndProc := CallbackAddr('CheckListBoxWndProc');
    SetWindowSubclass(Handle, PCheckListBoxWndProc, 0, 0);
    // send WM_NCCALCSIZE
   
SetWindowPos(Handle, 0, 0, 0, 0, 0, SWP_FRAMECHANGED or SWP_NOMOVE or SWP_NOOWNERZORDER or SWP_NOSIZE or SWP_NOZORDER);
    HeaderControl.Visible := False;
  end;
end;

procedure InitializeWizard;
begin
 
CreateHeader;
end;

procedure DeinitializeSetup;
begin
  if
PCheckListBoxWndProc <> 0 then
   
RemoveWindowSubclass(WizardForm.ComponentsList.Handle, PCheckListBoxWndProc, 0);
end;


usermode 15-06-2018 14:40 2818343

Всем привет! Есть код:

Код:

procedure RtlMoveMemory(Dest: string; Source: PAnsiChar; Len: Integer);
external 'RtlMoveMemory@kernel32.dll stdcall';

function LoadStringFromUTF16LEFile(FileName: string; var S: string): Boolean;
var
  A: AnsiString;
begin
  Result := LoadStringFromFile(FileName, A);
  if Result then
  begin
    SetLength(S, Length(A) div 2);
    RtlMoveMemory(S, A, Length(S) * 2);
    { Trim BOM, if any }
    if (Length(S) >= 1) and (Ord(S[1]) = $FEFF) then
      Delete(S, 1, 1);
  end;
end;

Помогите переделать данную функцию для загрузки UTF-8 файла.

Сама задача решаема через перекодировки в скрипте ConvertString.iss, но в этом примере кода поменьше.

// еще одна задача
необходимо запустить юникодный батник через функцию Exec или ShellExec (или через api), чтобы внутренние команды выполнились, например, bat-ник с содержимым:

copy "c:\嗨 русский.txt" "c:\嗨 русский.txt.bak"

в самой Windows, если вставить данную строку в cmd, то, пусть она и не отобразит правильно имена файлов в окне (что не требуется), но зато выполнит операцию корректно с названиями файлов в Unicode кодировке.

как добиться этого в Inno, чтобы можно было выполнять юникодные батники?
(просьба при возможности сделать пример для стандартной версии IS)

Sotonisto 15-06-2018 20:55 2818381

El Sanchez, у меня всё снова не как у людей. Вместо названий колонок отображается пустое место (зато с отступом). В первой версии скрипта все отображалось корректно. Я обнаружил, что причина проблемы в том, что у меня WizardForm является родительским элементом для ComponentsList (Parent:=WizardForm). Прошу у Вас помощи еще раз, подскажите что нужно изменить, чтобы колонки отображались.

El Sanchez 16-06-2018 12:16 2818417

Цитата:

Цитата Sotonisto
Я обнаружил, что причина проблемы в том, что у меня WizardForm является родительским элементом для ComponentsList (Parent:=WizardForm). »

Sotonisto, переместите строку HeaderControl.Visible := False; после SetWindowPos.

Coломoн Keйн 16-06-2018 15:51 2818436

Здраствуйте. Подскажите, пожалуйста, как создать патч с помощью Inno Setup? Обыкновенный инсталятор непрактичен из-за своего веса. Вчера использовал софтинку Inno Setup XDELTA Patch Maker, но два факта огорчили меня сильно - во первых, файла два (exe и bin), не один, а во вторых, окно инсталла сильно упрощенно по сравнению с инсталлами от самого Inno Setup.
Грубо говоря, есть два архива - оригинальный и модифицированный. Надо, чтобы инсталл содержал только разницу между ними (патч-данные). Тогда он будет весить около всего 40 Мб, чего я и хочу добиться, но чтобы окно инсталла осталось неизменным.

habib2302 16-06-2018 22:29 2818460

Coломoн Keйн, можете попробовать Mole`s Smart Version Patch Constructor

Coломoн Keйн 16-06-2018 22:56 2818464

Цитата:

Цитата habib2302
Coломoн Keйн, можете попробовать Mole`s Smart Version Patch Constructor »

Обязательно попробую. Спасибо за совет!

usermode 16-06-2018 23:01 2818465

Coломoн Keйн, есть еще патчер Visual Patch от Indigo Rose, там патчи можно создать как мастер со страницами наподобие Inno Setup. А для создания автономного патча в ISXPM нужно убрать галку Create Launcher, если размер патча на выходе небольшой.

А чтобы самому включить в свой инсталлятор патч-файл и применить его при установке, это нужно консольные утилиты использовать, типа xdelta или jojodiff, разбираться, как они работают и использовать их в своем инсталляторе.

Coломoн Keйн 17-06-2018 14:47 2818516

Цитата:

Цитата usermode
есть еще патчер Visual Patch от Indigo Rose »

Да вот сижу над ней, но после компиляции говорит, мол моя софтинка не найдена. Хз как исправить.
Цитата:

Цитата Coломoн Keйн
Mole`s Smart Version Patch Constructor »

инсталл просто отвратительный получился.

Цитата:

Цитата usermode
А чтобы самому включить в свой инсталлятор патч-файл и применить его при установке, это нужно консольные утилиты использовать, типа xdelta или jojodiff, разбираться, как они работают и использовать их в своем инсталляторе. »

Если не разберусь, обращусь. $$$

usermode 17-06-2018 19:33 2818547

Цитата:

Цитата Coломoн Keйн
Если не разберусь, обращусь. $$$ »

Так а что там, вот, к примеру JojoDiff:
https://sourceforge.net/projects/jojodiff/
Для генерации патч-файла запустить из командной строки:

jdiff.exe -b "C:\original.file" "C:\modified.file" "C:\resultpatch.file"

а для применения, полученный файл с изменениями resultpatch.file включить в установку и после инсталляции выполнить в Exec или RunTask:
jptch.exe "C:\original.file" "C:\resultpatch.file" "C:\modified.file"
(естественно, с путями константами)

в итоге после установки указанный original.file будет пропатчен.
но для этого может понадобится манипуляция удаления старого файла с переименованием пропатченного файла в оригинальное имя стандартными средствами Inno.

А в ISXPM можно вообще сделать невидимый Silent патч без окна (или SilentForm - маленькая форма с индикатором прогресса выполнения, чтобы пользователю было понятно, что применяется обновление и ничего не зависло) с указанием параметров с путем для применения и запускать его из инсталлятора, вся информация есть в справке, в нем поддерживаются константы Inno Setup.
Просто когда нужно будет поставить апдейт с обновлением для сотни файлов, то делать вручную это не очень хорошая идея, поэтому создавалась данная программа, чтобы довести все до полного автоматизма.

Coломoн Keйн 17-06-2018 20:41 2818552

Цитата:

Цитата usermode
Для генерации патч-файла запустить из командной строки:
jdiff.exe -b "C:\original.file" "C:\modified.file" "C:\resultpatch.file" »

Ого, спасибище! 3 дня мучаюсь уже. С этим моментом понятно, с остальными - как начну, будет ясно. Или не ясно. Я не профи в инно сетапе. В любом случае, спасибо!

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

usermode 17-06-2018 21:15 2818557

Цитата:

Цитата Coломoн Keйн
Можно как то сделать применение патч-данных к оригинальному файлу как раз в момент установки, не после нее? »

можно выполнить и перед установкой, можно как угодно в зависимости от алгоритма действий. но чтобы делать такие простейшие вещи, нужно время изучить хотя бы базово Inno Setup, опробовать примеры, почитать справку и руководства. все есть в шапке темы. а потом спрашивать, что именно не получается. ко всем модулям тоже нужно читать описания и мануалы, не лениться вобщем :)

Sotonisto 18-06-2018 19:36 2818647

Доброго всем вечера.
Будьте добры, подскажите, как реализовать сплеш с использованием botva2? Попытался сделать так, но содержимое формы не отображается (хотя при ShowModal все отображалось корректно):
И еще один вопрос: существует ли способ выровнять текст по правому краю? Например, как размещение по центру при помощи taCenter.

ZVSRus 21-06-2018 21:26 2819043

Цитата:

Цитата Sotonisto
И еще один вопрос: существует ли способ выровнять текст по правому краю? Например, как размещение по центру при помощи taCenter.

Так не пойдёт?
Скрытый текст

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[code]
var
Text1: TLabel;
Text2: TLabel;
Text3: TLabel;

procedure InitializeWizard();
begin
Text1 := TLabel.Create(WizardForm);
with Text1 do
begin
Parent := WizardForm.SelectDirPage;
Alignment := taRightJustify;
Caption := 'Текст справа';
Font.Color := clBlue;
Font.Height := -13;
Font.Name := 'Tahoma';
Font.Style := [fsBold, fsItalic];
SetBounds(ScaleX(0),ScaleY(120),ScaleX(417),ScaleY(16));
end;

Text2 := TLabel.Create(WizardForm);
with Text2 do
begin
Parent := WizardForm.SelectDirPage;
Alignment := taCenter;
Caption := 'Текст по центру';
Font.Color := clBlue;
Font.Height := -13;
Font.Name := 'Tahoma';
Font.Style := [fsBold, fsItalic];
SetBounds(ScaleX(0),ScaleY(140),ScaleX(417),ScaleY(16));
end;

Text3 := TLabel.Create(WizardForm);
with Text3 do
begin
Parent := WizardForm.SelectDirPage;
// Alignment := taLeftJustify;
Caption := 'Текст слева';
Font.Color := clBlue;
Font.Height := -13;
Font.Name := 'Tahoma';
Font.Style := [fsBold, fsItalic];
SetBounds(ScaleX(0),ScaleY(160),ScaleX(417),ScaleY(16));
end;
end;


Sotonisto 22-06-2018 11:47 2819100

ZVSRus, благодарю. Я понятия не имел, что к taRight и taLeft необходимо добавить Justify.

pollipen 22-06-2018 12:39 2819115

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

habib2302 22-06-2018 13:18 2819122

pollipen, мы по вашему экстрасенсы? скрипт в студию!

TheLeon 08-07-2018 12:44 2821014

Здравствуйте, нужна помощь:
  • Не могу вместо кнопок инсталлятора вставить свои изображения(кастомные кнопки), а также непонятно как сделать кастомные "Скрыть" и "Закрыть" кнопки(если без рамки Windows). [Скриншот 1]
  • Не могу убрать данный белый фон или просто изменить его размер. [Скриншот 2]
  • Правильно ли я вообще выполняю действия(что через редактор форм)?


P.S. Видно плохо искал ответы на вопросы, что не нашёл.

habib2302 08-07-2018 20:50 2821063

Цитата:

Цитата TheLeon
Не могу вместо кнопок инсталлятора вставить свои изображения(кастомные кнопки) »

Текстурирование кнопок через botva2.dll
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[Files]
Source: botva2.dll; DestDir: {tmp}; Flags: dontcopy
Source: compiler:innocallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: Button.png; DestDir: {tmp}; Flags: dontcopy

[Code]
type
TButtonInfo = record ButtonName: array of TButton; Handle: array of HWND; Count: Integer; end;
TBtnEventProc = procedure(h:HWND);

const
BtnClickEventID = 1;
BtnMouseEnterEventID = 2;
BtnMouseLeaveEventID = 3;
BtnMouseMoveEventID = 4;

balLeft = 0;
balCenter = 1;

var
ButtonsBuff: TButtonInfo;
HCancelButton, HNextButton, HBackButton, HDirBrowseButton, HGroupBrowseButton: HWND;

function WrapBtnCallback(Callback: TBtnEventProc; ParamCount: Integer): Longword; external 'wrapcallback@files:innocallback.dll stdcall';
function BtnCreate(hParent:HWND; Left,Top,Width,Height:integer; FileName:PAnsiChar; ShadowWidth:integer; IsCheckBtn:boolean):HWND; external 'BtnCreate@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetPosition(h:HWND; NewLeft, NewTop, NewWidth, NewHeight: integer); external 'BtnSetPosition@files:botva2.dll stdcall';
procedure BtnRefresh(h:HWND); external 'BtnRefresh@files:botva2.dll stdcall';
function BtnGetChecked(h:HWND):boolean; external 'BtnGetChecked@files:botva2.dll stdcall';
procedure BtnSetChecked(h:HWND; Value:boolean); external 'BtnSetChecked@files:botva2.dll stdcall';
procedure BtnSetText(h:HWND; Text:PAnsiChar); external 'BtnSetText@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetTextAlignment(h:HWND; HorIndent, VertIndent:integer; Alignment:DWORD); external 'BtnSetTextAlignment@files:botva2.dll stdcall';
procedure BtnSetVisibility(h:HWND; Value:boolean); external 'BtnSetVisibility@files:botva2.dll stdcall';
function BtnGetEnabled(h:HWND):boolean; external 'BtnGetEnabled@files:botva2.dll stdcall';
procedure BtnSetEnabled(h:HWND; Value:boolean); external 'BtnSetEnabled@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetFont(h:HWND; Font:Cardinal); external 'BtnSetFont@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetFontColor(h:HWND; NormalFontColor, FocusedFontColor, PressedFontColor, DisabledFontColor: Cardinal); external 'BtnSetFontColor@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetEvent(h:HWND; EventID:integer; Event:Longword); external 'BtnSetEvent@files:botva2.dll stdcall';
procedure BtnSetCursor(h:HWND; hCur:Cardinal); external 'BtnSetCursor@files:botva2.dll stdcall';
function GetSysCursorHandle(id:integer):Cardinal; external 'GetSysCursorHandle@files:botva2.dll stdcall';
procedure gdipShutdown; external 'gdipShutdown@files:botva2.dll stdcall';

procedure UpdateButtons();
var I: integer;
begin
for
I:=0 to (ButtonsBuff.Count-1) do begin
BtnSetEnabled(ButtonsBuff.Handle[I], ButtonsBuff.ButtonName[I].Enabled)
BtnSetVisibility(ButtonsBuff.Handle[I], ButtonsBuff.ButtonName[I].Visible)
BtnSetText(ButtonsBuff.Handle[I], ButtonsBuff.ButtonName[I].Caption)
BtnRefresh(ButtonsBuff.Handle[I])
end;
end;

procedure ButtonOnClick(hBtn: HWND);
var Btn: TButton; I: Integer;
begin
for
I:=0 to (ButtonsBuff.Count-1) do begin
if
hBtn = ButtonsBuff.Handle[I] then Btn:= ButtonsBuff.ButtonName[I];
end;
Btn.OnClick(Btn)
UpdateButtons;
end;

function EffectTextureButton(Handle: HWND; Button: TButton; ImageName: PAnsiChar; ShadowWidth: Integer; EnterEvent, MoveEvent, LeaveEvent: TbtnEventProc): HWND;
begin
Result:=BtnCreate(Handle, Button.Left-8, Button.Top-8, Button.Width+16, Button.Height+16, ImageName, ShadowWidth, False) ///Размеры подобраны для текущей текстуры
BtnSetEvent(Result, BtnClickEventID, WrapBtnCallback(@ButtonOnClick, 1))
if EnterEvent <> nil then BtnSetEvent(Result, BtnMouseEnterEventID, WrapBtnCallback(EnterEvent, 1));
if MoveEvent <> nil then BtnSetEvent(Result, BtnMouseMoveEventID, WrapBtnCallback(MoveEvent, 1));
if LeaveEvent <> nil then BtnSetEvent(Result, BtnMouseLeaveEventID, WrapBtnCallback(LeaveEvent, 1));
BtnSetFont(Result, Button.Font.Handle)
BtnSetText(Result, Button.Caption);
BtnSetVisibility(Result, Button.Visible);
BtnSetFontColor(Result,clBlack,clBlack,clBlack,clGray);
BtnSetCursor(Result,GetSysCursorHandle(32649));
Button.Width:=0; Button.Height:= 0;
SetArrayLength(ButtonsBuff.Handle, ButtonsBuff.Count+1);SetArrayLength(ButtonsBuff.ButtonName, ButtonsBuff.Count+1);
ButtonsBuff.ButtonName[ButtonsBuff.Count]:= Button; ButtonsBuff.Handle[ButtonsBuff.Count]:= Result;
ButtonsBuff.Count:= ButtonsBuff.Count+1;
end;

procedure ButtonChangeFont(ButtonHandle: HWND; Font: TFont; NormalColor, FocusedColor, PressedColor, DisabledColor: Cardinal);
begin
if
Font <> nil then BtnSetFont(ButtonHandle, Font.Handle);
BtnSetFontColor(ButtonHandle, NormalColor, FocusedColor, PressedColor, DisabledColor)
end;

procedure InitializeWizard();
begin
ExtractTemporaryFile('Button.png')
HNextButton:= EffectTextureButton(WizardForm.Handle, WizardForm.NextButton, ExpandConstant('{tmp}\Button.png'), 18, nil, nil, nil)
HCancelButton:= EffectTextureButton(WizardForm.Handle, WizardForm.CancelButton, ExpandConstant('{tmp}\Button.png'), 18, nil, nil, nil)
HBackButton:= EffectTextureButton(WizardForm.Handle, WizardForm.BackButton, ExpandConstant('{tmp}\Button.png'), 18, nil, nil, nil)
HDirBrowseButton:= EffectTextureButton(WizardForm.Handle, WizardForm.DirBrowseButton, ExpandConstant('{tmp}\Button.png'), 18, nil, nil, nil)
HGroupBrowseButton:= EffectTextureButton(WizardForm.Handle, WizardForm.GroupBrowseButton, ExpandConstant('{tmp}\Button.png'), 18, nil, nil, nil)
end;

procedure CurPageChanged(CurPageId: Integer);
begin
UpdateButtons
end;

procedure DeinitializeSetup();
begin
gdipShutdown
end;



Цитата:

Цитата TheLeon
а также непонятно как сделать кастомные "Скрыть" и "Закрыть" кнопки(если без рамки Windows) »

если не ошибаюсь эти кнопки меняются только скинами для инсталляторов

TheLeon 09-07-2018 12:45 2821129

habib2302,
Цитата:

Цитата habib2302
Текстурирование кнопок через botva2.dll »

Использовал код, настраивал размеры текстурирования, но пропал текст кнопок, кнопки огромного размера, а также неактивны. [Скриншот 1]

Sotonisto 11-07-2018 02:59 2821422

Цитата:

Цитата TheLeon
Не могу вместо кнопок инсталлятора вставить свои изображения(кастомные кнопки), а также непонятно как сделать кастомные "Скрыть" и "Закрыть" кнопки(если без рамки Windows).
Не могу убрать данный белый фон или просто изменить его размер.»

Как-то так?

TheLeon 11-07-2018 12:28 2821484

Sotonisto, спасибо огромное! Вы сделали всё как в моём шаблоне, не видя других страниц инсталлятора, спасибо!

Sotonisto 11-07-2018 18:07 2821551

TheLeon, не за что. Надеюсь, со скриптом вы разобрались без проблем.

pollipen 16-07-2018 11:56 2821993

парни как избавиться от запроса вот этого
что бы перезаписала сразу
Скрытый текст

boss911 16-07-2018 14:59 2822020

Цитата:

Цитата pollipen
как избавиться от запроса... »

Код:

[Files]
Source: ACDSee Video\videorecorder.ini; DestDir: {app}\ACDSee Video; Flags: overwritereadonly


ErikPshat 21-07-2018 17:46 2822974

Ребята, помогите пожалуйста...
Я тут делаю распаковщик для многотомных архивов одной игры. Но пока это дело реализовал через голый 7-Zip.
Скачать проект можно здесь: http://rgho.st/7Qx8Zvc7C (в архиве лежат 5 маленьких томов для теста распаковки - 001, 002, 003, 004, 005).

Я же хочу сделать распаковку через ISDone по фэншую, чтобы распаковка шла с двумя полосками прогресс-бара, с процентами, временем и всем остальным, но не пойму, какими командами и в каком месте её прикрутить. Я умею её прикручивать, но она у меня работает только в стандартных приложениях после нажатия кнопки "Готово". А здесь у меня кастомный интерфейс и есть кнопка "Распаковать".

Помогите пожалуйста...

R.i.m.s.k.y. 23-07-2018 12:20 2823157

Подскажите, пожалуйста, почему установщик инно не может под UAC внести изменения в реестр HLKM
Версия инно 5,5,1 ее2 (а)
куски скрипта в части касающейся
Код:

[Setup]
PrivilegesRequired=admin

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssDone then begin
    if IsComponentSelected('TW1') then begin
      RegWriteDWordValue (HKEY_LOCAL_MACHINE, 'SOFTWARE\CD Projekt Red\The Witcher','IsDjinniInstalled', 1);
      RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\CD Projekt Red\The Witcher','RegionVersion', 'WE');
      RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\CD Projekt Red\The Witcher','InstallFolder', ExpandConstant('app}\'));
    end;//  if IsComponentSelected('TW1') then begin
  end;

[Registry]
Root: HKLM; Subkey: "SOFTWARE\CD Projekt Red\The Witcher"; ValueName: "IsDjinniInstalled"; ValueType: Dword; ValueData: "$1"; Components: TW1; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\CD Projekt Red\The Witcher"; ValueName: "RegionVersion"; ValueType: String; ValueData: "WE"; Components: TW1; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\CD Projekt Red\The Witcher"; ValueName: "InstallFolder"; ValueType: String; ValueData: "{app}\"; Components: TW1; Flags: uninsdeletekey

Установщик может выдать ошибку RegCreatekeyEx: сбой, код 89
или не выдать и втихаря все поставить но ключи в реестре HKLM не создать

Причем примерно до НГ установщик работал нормально, виню последние обновки безопасности майкрософта

Заранее благодарен

usermode 23-07-2018 19:53 2823188

если игра x64 и нужен доступ установщика к 64 бит разделам, то попробуй в секцию [Setup] прописать:
ArchitecturesInstallIn64BitMode=x64 ia64

Цитата:

Цитата R.i.m.s.k.y.
Причем примерно до НГ установщик работал нормально, виню последние обновки безопасности майкрософта »

тогда уж инсталлятор тоже надо обновить, далеко на необновляемых ResTools сборках не уехать.

R.i.m.s.k.y. 23-07-2018 20:43 2823198

usermode, нет игра х86

R.i.m.s.k.y. 23-07-2018 21:42 2823204

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

procedure InitializeWizard();
  ...
  ExtractTemporaryFile('BASS.dll');
  ExtractTemporaryFile('InnoCallback.dll');
  ExtractTemporaryFile('CallbackCtrl.dll');
  ExtractTemporaryFile('botva2.dll');
  ExtractTemporaryFile('volmax.png');
  ExtractTemporaryFile('volmin.png');
  ExtractTemporaryFile('volpb.png');
  ExtractTemporaryFile('voldote.png');
  ExtractTemporaryFile('MusicButton.png');
  ExtractTemporaryFile('mp3.mp3');
  BASS_Init(ExpandConstant('{tmp}\mp3.mp3'))
  BASS_CreateMediaPlayer(WizardForm, '{tmp}\volmax.png', '{tmp}\volmin.png', '{tmp}\volpb.png', '{tmp}\voldote.png', 110, 490);


usermode 24-07-2018 12:00 2823259

R.i.m.s.k.y.
тогда для записи в реестр использовать windows api.

R.i.m.s.k.y. 24-07-2018 12:04 2823262

Цитата:

Цитата usermode
тогда для записи в реестр использовать windows api »

можно пример для инно?

ErikPshat 31-07-2018 10:02 2824163

Не могу выудить переменную из кода GetOpenFileName. Вот пример:
Код:

procedure UnpackButtonClick(Sender: TObject);
var
  FileName: String;
begin
  // Set the initial filename
  FileName := '';
  if GetOpenFileName('', FileName, '', 'Archives Files (*.zip)|*.zip|All Files|*.*', 'zip') then
  begin
    // Successful; user clicked OK
    // FileName contains the selected filename
    MsgBox('Выбран архив {FileName}', mbInformation, MB_OK);
  end;
  if not ShellExec('open', ExpandConstant('{tmp}\7z.exe'), 'x -y {FileName}', ExpandConstant('{src}'), SW_SHOWNORMAL, ewnowait, ResultCode) then
  MsgBox(ExpandConstant('{code:NotFileOnDiskMsg}'), mbCriticalError,MB_OK);
end;

Делаю распаковку архивов и переменная {FileName} ничего не возвращает, ни в MsgBox, ни подхватывает выбранный файл при распаковке.

nik1967 31-07-2018 12:03 2824191

ErikPshat,
Скрытый текст

Код:

[Setup]
AppName = MyApp
AppVerName = MyApp
DefaultDirname = {pf}\MyApp
OutputDir=.

[Files]
Source: 7z.exe; Flags: dontcopy;

[code]
var
 
UnpackButton: TButton;
  PathTmp: String;

procedure UnpackButtonClick(Sender: TObject);
var
 
FileName: String;
  ResultCode: Integer;
begin
  if not
FileExists(PathTmp+'7z.exe') then ExtractTemporaryFile('7z.exe');
  // Set the initial filename
 
FileName := '';
  if GetOpenFileName('', FileName, '', 'Archives Files (*.zip)|*.zip|All Files|*.*', 'zip') then
  begin
   
// Successful; user clicked OK
    // FileName contains the selected filename
   
MsgBox('Выбран архив: '+FileName, mbInformation, MB_OK);
  end;
  if not ShellExec('open', ExpandConstant('{tmp}\7z.exe'), 'x -y '+FileName, ExpandConstant('{src}'), 0, ewnowait, ResultCode) then
 
MsgBox(ExpandConstant('{code:NotFileOnDiskMsg}'), mbCriticalError,MB_OK);
end;

procedure InitializeWizard();
begin
 
PathTmp:= ExpandConstant('{tmp}\');
  UnpackButton:= TButton.Create(WizardForm);
  with UnpackButton do begin
   
Parent:= WizardForm;
    SetBounds(ScaleX(10), ScaleY(327), ScaleX(75), ScaleY(25));
    Caption:= 'Распаковать';
    OnClick:= @UnpackButtonClick;
  end;
end;


ErikPshat 31-07-2018 12:48 2824195

nik1967, Классно, спасибо, отлично работает!!! Понятно, где я допустил ошибку в фигурных скобках.

Можно ещё развить тему?...
А теперь я пытаюсь распаковать архивы с мультивыбором GetOpenFileNameMulti.
Всё то же самое, в справке Inno Setup есть пример кода.
Но почему-то компилятор выдаёт ошибку "Unknown Identifier 'GetOpenFileNameMulti'".
Может есть рабочий пример аналогичного кода?

nik1967 31-07-2018 13:03 2824198

ErikPshat, скорее всего пользуешься расширенным компилятором. А GetOpenFileNameMulti прикрутили в поздних версиях инно. У меня в 5.5.9 уже не ругается.
Цитата:

Цитата ErikPshat
в справке Inno Setup »

Эта справка для 5.6.1, на сколько я помню.

zbz 31-07-2018 14:06 2824207

Ребята помогите пожалуйста, разобратся в скрите. Еле откопал в интернете вот этот скрипт:
скрипт
[Setup]
AppName=My Program
AppVersion=1.5
DefaultGroupName=My Program
DefaultDirName={pf}\My Program
DisableDirPage=yes

[Files]

Source: "D:\!ZBFlash\!АБУБоекомплект\InnoSetup\Projects\ABU\Core\Myprog1.exe"; DestDir: "C:\ABUTemp"
Source: "D:\!ZBFlash\!АБУБоекомплект\InnoSetup\Projects\ABU\Core\Myprog2.exe"; DestDir: "C:\ABUTemp"



[code]
var
MyOptionsPage: TInputOptionWizardPage;

procedure InitializeWizard;
begin
MyOptionsPage := CreateInputOptionPage(wpWelcome, 'Caption', 'Description',
'SubCaption', True, False);
MyOptionsPage.Add('install Myprog1');
MyOptionsPage.Add('install Myprog1');
MyOptionsPage.Values[0] := True;
end;

function ShouldInstallIcon: Boolean;
begin


Result := MyOptionsPage.Values[0];
end;


procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=wpWelcome then
begin
SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0)
SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0)
end;
end;

и не могу понят куда и как написать, чтоб при соотвествуюшем выборе радио кнопки запускалась соотвествующий ехешник (Myprog1.exe или Myprog2.exe).

R.i.m.s.k.y. 31-07-2018 14:21 2824212

zbz, читать в справке про секцию components
Код:

[Components]
Name: Myprog; Description: Myprog;
Name: Myprog\Myprog1; Description: Myprog1; Flags: exclusive
Name: Myprog\Myprog2; Description: Myprog2; Flags: exclusive


[Files]
Components: Myprog\Myprog1; Source: "D:\!ZBFlash\!АБУБоекомплект\InnoSetup\Projects\ABU\Core\Myprog1.exe"; DestDir: "C:\ABUTemp"
Components: Myprog\Myprog2; Source: "D:\!ZBFlash\!АБУБоекомплект\InnoSetup\Projects\ABU\Core\Myprog2.exe"; DestDir: "C:\ABUTemp"


zbz 31-07-2018 14:45 2824217

Цитата:

Цитата R.i.m.s.k.y.
Components: Myprog\Myprog1; Source: "D:\!ZBFlash\!АБУБоекомплект\InnoSetup\Projects\ABU\Core\Myprog1.exe"; DestDir: "C:\ABUTemp" Components: Myprog\Myprog2; Source: "D:\!ZBFlash\!АБУБоекомплект\InnoSetup\Projects\ABU\Core\Myprog2.exe"; DestDir: "C:\ABUTemp" »

она же только копирует ехешники, а мне надо чтоб ехешник запускалось (или я что то не понял?!)

ErikPshat 31-07-2018 14:48 2824218

Да, ошибку выбивает китайский 5.5.1 ee2. Переключился на компилятор 5.6.1, проходит нормально. Но при условии, если я делаю через ExpandConstsnt:
Код:

MsgBox('Выбраны PKG: '+ExpandConstant('FileNameList'), mbInformation, MB_OK);
Позволяет выбрать множество файлов и парсит все выбранные файлы в одну строку, каждый в кавычках, как и должно быть. Но при попытке распаковать, MsgBox выводит необработанную строку:
Код:

Выбраны PKG: FileNameList
При нормальных условиях, без ExpandConstant, при компиляции выдаёт ошибку: Type mismatch.
Что-то не так снова в этой конструкции.

R.i.m.s.k.y. 31-07-2018 14:59 2824220

zbz, а) в твоем скрипте я не увидел запуска
б) лучше не использовать модификации инно если можно использовать стандартные средства инно
убрать кусок
Код:

MyOptionsPage: TInputOptionWizardPage;

procedure InitializeWizard;
begin
MyOptionsPage := CreateInputOptionPage(wpWelcome, 'Caption', 'Description',
'SubCaption', True, False);
MyOptionsPage.Add('install Myprog1');
MyOptionsPage.Add('install Myprog1');
MyOptionsPage.Values[0] := True;
end;

function ShouldInstallIcon: Boolean;
begin


Result := MyOptionsPage.Values[0];
end;

в) про запуск читать про секцию Run
Код:

[Run]

Components: Myprog\Myprog1; Filename: "C:\ABUTemp\Myprog1.exe"; Description: "Myprog1.exe"; Flags: skipifsilent runhidden
Components: Myprog\Myprog2; Filename: "C:\ABUTemp\Myprog2.exe"; Description: "Myprog2.exe"; Flags: nowait skipifsilent


mubbii 12-08-2018 00:42 2826007

Это мой первый пост, я использовал или просматривал OSZONE в течение нескольких месяцев (помог мне много ... :) новичок здесь).
У меня вопрос о наложении Thumbail для панели задач ... в частности, показывается ход установки. Я добавил скриншот, чтобы уточнить.

https://imgur.com/a/duLH1r7

Im в настоящее время использует (wintb) .dll для наложения эскизов и работает нормально, но я хочу, чтобы он отображал дополнительную информацию, например. ход установки и оставшееся время.

Если это возможно? отправляем. любая помощь оценена. Спасибо!

im с использованием inno 5.6.1 (u) и последней улучшенной.

nik1967 18-08-2018 08:52 2827210

mubbii, почитай здесь.

ChopMan 27-08-2018 02:39 2828722

Относительно недавно начал изучать конструкция написания скрипта для Inno Setup. И тут возникла проблема: На странице, где необходимо выбрать путь, куда будет устанавливаться программа, по умолчанию стоит путь, который прописан в DefaultDirName, к примеру это DefaultDirName={pf}. В том проблема, что если требуется изменить путь в ручную, то все к выставленному пути приписывается значение DefaultDirName, то есть я хочу установить путь на E:\Games, но выставляется в итоге E:\Games\Program Files , мне требуется, чтобы значение DefaultDirName не выставлялось при изменении пути.
В интернете искал как и на этом форуме, особо толку такого не нашёл. Помогите пожалуйста разобраться в данной проблеме.

nik1967 27-08-2018 07:17 2828727

ChopMan,
Справочку внимательно изучаем

[Setup]: AppendDefaultDirName
Возможные значения:
yes или no
Значение по умолчанию:
yes

Описание:
По умолчанию при указании пути на странице Выбор папки назначения с помощью кнопки Обзор... (Browse...) инсталлятор автоматически добавляет в конце имя папки, указанной в директиве DefaultDirName, в которую будет установлена программа. Например, если DefaultDirName={pf}\My Program и пользователь выбрал в обзоре диск "Z:\", то программа установится в "Z:\My Program".

Если значение директивы no, то папка с указанным DefaultDirName именем в конечном каталоге создаваться не будет. На странице выбора появится кнопка "Создать папку" (Make New Folder).


El Sanchez 05-10-2018 09:26 2834519

Цитата:

Цитата из ЛС
Можете обновить примеры для inno setup закрепления ярлыка на панели задач и в меню пуск? Те что есть не закрепляют на win10 pro.

PinToTaskbar

Код:

function PinToTaskbar(const FileName: string; IsPin: Boolean): Boolean;
// FileName : full path to executable file
// IsPin    : False - unpin from TaskBar, True - pin to TaskBar
var
 
ShellApp: Variant;
  Verb: string;
begin
 
Result := False;
  if not FileExists(FileName) then Exit;
  try
    if
IsPin then
     
Verb := 'taskbarpin' else
     
Verb := 'taskbarunpin';
    ShellApp := CreateOleObject('Shell.Application');
    ShellApp.Windows.Item.Document.Application.NameSpace(ExtractFileDir(FileName)).ParseName(ExtractFileName(FileName)).InvokeVerb(Verb);
    Result := True;
  except
   
ShowExceptionMessage;
  end;
end;


PinToStartMenu

Код:

function PinToStartMenu(const FileName: string; const IsPin: Boolean): Boolean;
// FileName : full path to exe- or lnk-file
// IsPin    : False - unpin from StartMenu, True - pin to StartMenu
var
 
ShellApp, FolderItem: Variant;
  Verb, LnkName: string;
begin
 
Result := False;
  if not FileExists(FileName) then Exit;
  try
   
ShellApp := CreateOleObject('Shell.Application');
    FolderItem := ShellApp.Windows.Item.Document.Application.NameSpace(ExtractFileDir(FileName)).ParseName(ExtractFileName(FileName));
    if GetWindowsVersion < $06020000 then // below Windows 8
   
begin
      if
IsPin then
       
Verb := 'startpin' else
       
Verb := 'startunpin';
      FolderItem.InvokeVerb(Verb);
      Result := True;
    end
    else 
// Windows 8 and above
   
begin
      if not
FolderItem.IsLink then
      begin
       
LnkName := FolderItem.ExtendedProperty('FileDescription');
        if LnkName = '' then
         
LnkName := ExtractFileName(FileName);
        LnkName := ExpandConstant('{commonprograms}\') + ChangeFileExt(LnkName, '.lnk');
        if IsPin then
         
Result := not FileExists(LnkName) and
           
FileExists(CreateShellLink(LnkName, '', FileName, '', '', '', 0, SW_SHOWNORMAL))
        else
         
Result := DeleteFile(LnkName);
      end
      else
      begin
       
LnkName := ExpandConstant('{commonprograms}\') + ExtractFileName(FolderItem.Path);
        if IsPin then
         
Result := not FileExists(LnkName) and
           
FileCopy(FolderItem.Path, LnkName, False)
        else
         
Result := DeleteFile(LnkName);
      end;
    end;
  except
   
ShowExceptionMessage;
  end;
end;


ROMKA-1977 08-10-2018 14:31 2834946

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

Всегда указывал так:
[Icons]
Name: {group}\{cm:UninstallProgram,{#MyName}}; Filename: {uninstallexe}; Check: CheckError

Ярлык деинсталятора в меню пуск Win 7 отображался. Установив прогу в Win 10 ярлык деинсталятора не отображается. Заметил что такая же проблема и в инсталяторах других разработчиков.
Запустив установку в Win 10 в режиме совместимости с Win 7 всё нормально, рабочий ярлык на своём месте.

Прописал следующее:
[Icons]
Name: {group}\Деинсталлировать {#MyName}; Filename: {uninstallexe}; Check: CheckError

После этого всё норм, рабочий ярлык на своём месте.
В чем же проблема в первом случае ?

ErikPshat 08-10-2018 19:32 2834982

Цитата:

Цитата ROMKA-1977
{cm:UninstallProgram,{#MyName}}; »

Наверное лучше писать так:
Код:

{cm:UninstallProgram} {#MyName};

ErikPshat 09-10-2018 15:12 2835093

Ребята, нубский вопрос...
Как средствами Inno Setup создать новый пустой текстовой файл?

Я знаю только один хак создания через лист:
Код:

var
  List: TStringList; txt: string; res: Integer;
begin
  txt:= ExpandConstant('{tmp}\file.txt');
  List:= TStringList.Create;
  List.Add('Добавляем первую строку в файл');
  List.SaveToFile(txt);
  List.Free;
end;

Может быть можно просто написать эту строку отдельно, как самостоятельную:
Код:

SaveToFile(file.txt);
Но по-моему к этому должна предшествовать какая-та трансляция.

El Sanchez 09-10-2018 15:50 2835102

Цитата:

Цитата ROMKA-1977
Всегда указывал так:
[Icons]
Name: {group}\{cm:UninstallProgram,{#MyName}}; Filename: {uninstallexe}; Check: CheckError »

ROMKA-1977, если UninstallProgram вынесен во внешний файл, то проверьте его кодировку, должна быть UTF-8. Либо CheckError возвращает False на Win 10.
Цитата:

Цитата ErikPshat
Наверное лучше писать так: »

ErikPshat, там все правильно написано, читайте справку.
Цитата:

Цитата ErikPshat
Как средствами Inno Setup создать новый пустой текстовой файл? »

ErikPshat,
Код:

SaveStringToFile(ExpandConstant('{tmp}\file.txt'), '', False);


ErikPshat 09-10-2018 16:09 2835106

El Sanchez, о да, спасибо, проверил работает.
Если указано False, тогда перезаписывает файл, а если указать True, тогда записывает строку в конец файла.

А я перелопатил в документации весь хэлп и почему-то пропустил эту команду. Оказывается она там есть )))
Спасибо ещё раз!

ErikPshat 09-10-2018 18:47 2835134

Подскажите пожалуйста, как проверить наличие записи в INI-файле?

У меня в секцию [CONFIG] записывается ключ "InstallDirectory" с путём в параметре. И я делаю отдельную функцию на его считывание:
Код:

function InsDir(Default:String):String;
  Begin
    Result:= GetIniString('CONFIG','InstallDirectory','',ExpandConstant('{tmp}\config.ini'));
  end;

А теперь мне нужно проверить, присутствует ли ключ с параметром. Если да, то я его считываю. Если нет, то я беру данные из другого ключа. Ну типа как-то так:
Код:

if (ExpandConstant('{code:InsDir}') > 0) then begin DIR:= ExpandConstant('{code:InsDir}') end else
if (ExpandConstant('{code:NewDir}') > 0) then begin DIR:= ExpandConstant('{code:NewDir}') end;

То есть, я не знаю с чем сравнивать. Правильно ли будет узнавать наличие ключа, потому что он больше нуля?
Мне нужно на переменную DIR назначить существующий ключ.

ROMKA-1977 09-10-2018 20:47 2835150

Цитата:

Цитата ErikPshat
{cm:UninstallProgram} {#MyName}; »

В данном вами примере инсталятор берёт полное название ярлыка из файла Russian.isl и получается в итоге - Деинсталлировать %1MyName
Может есть какойто метод оптимизации секции [Icons] не прибегая к подробному тексту - Name: {group}\Деинсталлировать {#MyName}; Filename: {uninstallexe}; Check: CheckError
Уточняю проблему - это только но win 10 и подобное не только у моих инсталяшек

ErikPshat 09-10-2018 21:08 2835154

ROMKA-1977, вам выше совет дал El Sanchez, вы читали?
То есть, вы вписали ключ MyName в файл Russian.isl и теперь хотите вывести его в секции [Icons]?
А почему бы в шапке не написать через
Код:

#define  MyName  "Моё Название"
а потом выводить куда захочешь?
Или в секцию CustomMessage через en. и ru.

Кстати, нужно бы параметры в кавычки брать, а у вас без кавычек. Просто в Inno Setup иногда запятая всё решает.
Из меня правда плохой советчик, кто бы мне самому подсказал, но у меня в секции [Icons] всегда так:
Код:

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


AnastasiyaM 20-10-2018 16:45 2836730

Ребята, помогите, пожалуйста.
Есть задача, при установке программы создавать нового пользователя windows и добавлять программу в автозагрузку только ему (во время установки программы но не является текущим пользователем.) Пробовала получать SID пользователя после создания, но видимо из-за нехватки опыта получается какая-то ерунда. Выкладываю свои попытки, может подскажете как можно поправить?

Код:

[Registry]
Root: HKU; Subkey: {code:GetUserSid}\Software\Microsoft\Windows\CurrentVersion\Run; ValueName: {#MyAppExeName}; ValueType: string; ValueData: {app}\{#MyAppExeName};

[Run]
;  здесь я создаю пользователя и пыталась сделать его загружаемым по умлочания после перезагрузки, но пока точно работает только первая строчка :)
Filename: net.exe; parameters: "user Visitor /add /fullname:""Visitor"" /comment:""TEST"" /expires:never /passwordchg:no"
Filename: reg.exe; parameters: "ADD HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon /v AutoAdminLogon /t REG_SZ /d 1";
Filename: reg.exe; parameters: "ADD HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon /v DefaultUserName /t REG_SZ /d 'Visitor'"; 
[Code]
function GetUserSid(ExecStdout: string):string;
var
  TmpFileName: string;
  ResultCode: integer;
  Params: string;

  begin
TmpFileName := ExpandConstant('{tmp}') + '\sid_results.txt';
    Exec(ExpandConstant('{cmd}'), ' /C wmic useraccount where name=''Visitor'' get sid > "' + TmpFileName + '"', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
      if LoadStringFromFile(TmpFileName, ExecStdout) then
        begin   
        MsgBox(ExecStdout, mbInformation, MB_OK);
        end
      else
        begin
        MsgBox('Installing Error', mbError, MB_OK);
        end;
    DeleteFile(TmpFileName);
    end;


Chudmin 21-10-2018 22:26 2836907

Здравствуйте!
Подскажите пожалуйста, как реализовать, чтобы при запуске инсталятора, например, "Моя_прога", если запущена уже ранее установленная программа "Моя_прога.exe", то сразу же, без вопросов, "Моя_прога.exe" закрывалась?

Iska 21-10-2018 23:00 2836909

Chudmin, вообще-то, в этом случае инсталлятор не должен «сразу же, без вопросов» закрываться.

Chudmin 22-10-2018 05:44 2836925

Цитата:

Цитата Iska
в этом случае инсталлятор не должен «сразу же, без вопросов» закрываться. »

Вы не правильно меня поняли. Есть программа "Моя_прога" и есть инсталятор к ней "Моя_прога_Setup", так вот, если у пользователя уже установлена "Моя_прога" и запущена, а в это время он запускает (при работающей "Моя_прога") инсталятор "Моя_прога_Setup", то инсталятор сразу же, "молчком", закрывает программу "Моя_прога".

Iska 22-10-2018 05:46 2836926

Chudmin, и этого быть не должно (разве что «Моя_прога» — это сервис).

Chudmin 22-10-2018 06:01 2836927

Цитата:

Цитата Iska
и этого быть не должно »

Ну, должно или не должно, это другой вопрос, главное что такое работает, например в репаках уважаемого Elchupacabra.

ErikPshat 22-10-2018 06:39 2836928

Chudmin,
Код:

[UninstallRun]
Filename: "{sys}\taskkill.exe"; Parameters: "/f /im Моя_прога.exe"; Flags: skipifdoesntexist runhidden

или использовать сразу в секции Files параметр BeforeInstall для уничтожения процесса перед установкой:
Код:

[Files]
Source: "Моя_прога.exe"; DestDir: "{app}"; Flags: ignoreversion; BeforeInstall: TaskKill('Моя_прога.exe')

[ Code ]
procedure TaskKill(FileName: String);
var
  ResultCode: Integer;
begin
    Exec(ExpandConstant('taskkill.exe'), '/f /im ' + '"' + FileName + '"', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;


Chudmin 22-10-2018 07:17 2836931

Цитата:

Цитата ErikPshat
или использовать сразу в секции Files параметр BeforeInstall для уничтожения процесса перед установкой: »

Спасибо большое, этот метод как раз близок к моему желанию (в отличии от [UninstallRun]). Я только недавно стал вникать в тонкости Inno Setup, так-что чайник в полном смысле этого слова, а в секции [code], так вообще на уровне скопировал, посмотрел результат, так-что Ваш пример в мою копилку, на которых (в том числе) я буду постигать азы [code].

И всё-таки, у Elchupacabra этот процесс происходит сразу же после запуска инсталятора, КАК? Конечно и Ваш способ работает и выполняет свою функцию, но хотелось бы знать как сделать в самом начале, чисто академический интерес.

boss911 22-10-2018 16:00 2836987

Цитата:

Цитата Chudmin
Есть программа "Моя_прога" и есть инсталятор к ней "Моя_прога_Setup", так вот, если у пользователя уже установлена "Моя_прога" и запущена, а в это время он запускает (при работающей "Моя_прога") инсталятор "Моя_прога_Setup", то инсталятор сразу же, "молчком", закрывает программу "Моя_прога". »

Предложу использовать библиотеку KillProc.dll для Inno Setup.
Код:

[Files]
Source: C:\MyProg\MyProg.exe; DestDir: {app}; Flags: ignoreversion; BeforeInstall: KillProc
Source: compiler:Libraries\KillProc.dll; DestDir: {tmp}; Flags: dontcopy

[Code]
function KillProcByExeName(ProcessName: PAnsiChar; ExcludeID: Cardinal): Integer; external 'KillProcByExeName@files:KillProc.dll stdcall';

procedure KillProc;
begin
  KillProcByExeName('MyProg.exe', 0);
end;

Если в момент установки будет запущен процесс с именем MyProg.exe, то перед копированием файла MyProg.exe, данный процесс будет принудительно завершен. Метод старый, возможно уже есть другие решения, с проверкой ID процесса.

Правильно или не правильно, но если MyProg.exe не служба и нет ключа командной строки для завершения работы, а процесс без вопросов необходимо завершить и по другому ни как, то это единственный вариант, и уже закрываешь глаза на то, что это не правильно. ИМХО.

ErikPshat 22-10-2018 21:21 2837055

Цитата:

Цитата boss911
Предложу использовать библиотеку KillProc.dll для Inno Setup. »

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

Цитата:

Цитата Chudmin
И всё-таки, у Elchupacabra этот процесс происходит сразу же после запуска инсталятора, КАК? »

Ну так всё зависит от того, когда выполняется ваш код. Сколько у вас файлов в секции [Files] и когда они запускаются?
Скорее всего ваши файлы смирно сидят в инсталляторе и терпеливо ждут, пока юзер не пройдёт все этапы, проставит галочки, там создавать ярдыки на рабочем столе, выбирает дополнения, путь установки, а тоько в заключении жмёт кнопку "Установить". Вот тогда и активируется ваша "Моя_прога.exe", а перед её запуском и начинается поиск процесса и его уничтожение.

Чтобы процесс уничтожался сразу при запуске инсталлятора, нужно чтобы у вас в [Files] был бы назначен на BeforeInstall какой-нибудь файлик, который бы извлекался в %TEMP% именно при запуске инсталлятора, а не по нажатию кнопки "Установить".

Для примера, вы можете прикрепить к инсталлятору Сплэш-заставку и заодно на неё повесить убийцу процесса:
Код:

[Files]
; Файлы Splash-заставки, загружаются первыми
Source: Include\isgsg.dll; DestDir: {tmp}; Flags: dontcopy nocompression; BeforeInstall: TaskKill('Моя_прога.exe')
Source: Include\Splash.png; DestDir: {tmp}; Flags: dontcopy nocompression

В секции [ Code ] объявляете процедуру заставки и процедуру убийцы процесса в самом начале:
Код:

[ Code ]
{ Splash заставка }
procedure ShowSplashScreen(p1:HWND;p2:AnsiString;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer);
    external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
procedure TaskKill(FileName: String);var ResultCode: Integer;begin
    Exec(ExpandConstant('taskkill.exe'),'/f /im '+'"'+FileName+'"','',SW_HIDE,ewWaitUntilTerminated,ResultCode);end;

Этот код извлечения и запуска заставки вставляете в нужном вам месте. Я её разместил после всей массы программного кода в конец, но перед отрисовкой формы окна:
Код:

{ Splash заставка }
procedure Splash();
begin
  ExtractTemporaryFile('Splash.png');
  ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}\Splash.png'),500,800,500,0,255,True,$FFFFFF,10);
end;

И в конце кода инициализируете её:
Код:

procedure InitializeWizard();
begin
  Splash();
end;

Таким образом, при запуске программы сразу извлекаются файлы заставки в %TEMP% и запускается заставка перед стартом инсталлятора, но ещё перед этим, запускается убийца процесса, потому что на файл заставки выставлен флаг BeforeInstall.

AnastasiyaM 22-10-2018 22:54 2837096

Цитата:

Цитата AnastasiyaM
Есть задача, при установке программы создавать нового пользователя windows и добавлять программу в автозагрузку только ему (во время установки программы но не является текущим пользователем.) Пробовала получать SID пользователя после создания, но видимо из-за нехватки опыта получается какая-то ерунда. Выкладываю свои попытки, может подскажете как можно поправить? »

В общем, не смогла победить задачу средствами инсталлятора, сделала bat файл, который находит SID и прописывает в автозапуск программу. Теперь новая проблема. Если запускаю свой bat в новом пользователе, то он успешно отрабатывает. А если в том пользователе, под которым создаю нового, то пишет "неверный параметр". В связи с этим ломаю теперь голову над задачей:
1. установить программу
2. создать попутно нового пользователя
3. перезагрузить систему и зайти под новым пользователем
4. запустить bat файл.
И это все должен делать инсталлятор.
Видела примеры как делают продолжение установки после перезагрузки, но очень слабо понимаю, что куда там нужно вписать (
Буду очень благодарна за советы, примеры, объяснения

Iska 22-10-2018 23:47 2837108

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

AnastasiyaM 22-10-2018 23:56 2837112

Цитата:

Цитата Iska
AnastasiyaM, в Вашем случае пользователя мало создать: у новосозданного пользователя отсутствует профиль. Просто запустите программно какое-либо приложение от имени новосозданного пользователя, дождитесь его завершения, и только затем пытайтесь что-либо делать с его разделами реестра или путями в его профиле. »

Большое спасибо за совет, буду копать в этом направлении!

ErikPshat 23-10-2018 03:29 2837125

Цитата:

Цитата AnastasiyaM
В общем, не смогла победить задачу средствами инсталлятора, сделала bat файл, который находит SID и прописывает в автозапуск программу. Теперь новая проблема. Если запускаю свой bat в новом пользователе, то он успешно отрабатывает. А если в том пользователе, под которым создаю нового, то пишет "неверный параметр". В связи с этим ломаю теперь голову над задачей: »

Это уже называется вирусописание, а не инсталлятор )))

Chudmin 23-10-2018 08:06 2837135

Цитата:

Цитата ErikPshat
Таким образом, при запуске программы сразу извлекаются файлы заставки в %TEMP% и запускается заставка перед стартом инсталлятора, но ещё перед этим, запускается убийца процесса, потому что на файл заставки выставлен флаг BeforeInstall. »

При компиляции выдаёт ошибку на строке " Splash();" - Unknown identifier 'Splash'.

ErikPshat 23-10-2018 08:38 2837138

Вложений: 1
Цитата:

Цитата Chudmin
При компиляции выдаёт ошибку на строке " Splash();" - Unknown identifier 'Splash'. »

Ой, забыл добавить код извлечния ))) мы же 2 файла только добавилив в [Files], чтобы программа паковала их и таскала с собой. А кто извлекать файлы будет, чтобы они заработали? Они в нужный момент в нужной части кода должны извлекаться командой ExtractTemporaryFile и следом запускать отображение заставки.

Вот, нужно ещё код извлечения и активации нужно добавить в подходящее вам место:
Код:

{ Splash заставка }
procedure Splash();
begin
  ExtractTemporaryFile('Splash.png');
  ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}\Splash.png'),500,800,500,0,255,True,$FFFFFF,10);
end;

Если что, DLL-ку isgsg.dll Splash-заставки залил во вложение. Картинку с прозрачностью Splash.png свою добавите.

Chudmin 23-10-2018 09:07 2837142

Цитата:

Цитата ErikPshat
Вот, нужно ещё код извлечения и активации нужно добавить в подходящее вам место: »

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

Дайте совет, что, где почитать в этом направлении, чтобы хоть что-то понимать?

ErikPshat 23-10-2018 09:57 2837148

Chudmin, ну так в Inno Script Studio нажмите в меню Помощь -> Документация Inno Setup и изучайте.
Используется Pascal, простейший язык для изучения.

Я именно со справки и начинал. Когда делал свою первую программу, сутки посидел, поискал решения своих задач, так там всё и нашёл, там много примеров практически по всем направлениям, собранных по вопросам и ответам на форумах. Ну и за сутки я практически освоил все приёмы по кодингу в этой программе.
Скачайте последнюю версию русской справки: http://krinkels.org/threads/russkaja...no-setup.2083/
Замените CHM в папке с программой C:\Program Files (x86)\Inno Setup 5\
Посмотрите сборник скриптов и примеров: http://krinkels.org/threads/faq-po-inno-setup.7/
Покомпилируйте готовые рабочие скрипты: http://krinkels.org/forums/skripty-dlja-inno-setup.256/
Ну и на их примере попытайтесь сделать что-нибудь своё.

Chudmin 23-10-2018 14:01 2837187

Цитата:

Цитата ErikPshat
Используется Pascal, простейший язык для изучения. »

Нашёл я свою ошибку, Splash-заставка отработала, а вот taskkill нет.

AnastasiyaM 23-10-2018 17:18 2837222

Цитата:

Цитата Iska
AnastasiyaM, в Вашем случае пользователя мало создать: у новосозданного пользователя отсутствует профиль. Просто запустите программно какое-либо приложение от имени новосозданного пользователя, дождитесь его завершения, и только затем пытайтесь что-либо делать с его разделами реестра или путями в его профиле. »

Еще раз спасибо, почти получилось сотворить чудо.
Только bat файл запрашивает пароль нового пользователя, когда запускает что-то от его имени (без пароля отказывается работать). Есть ли способ, как ему его передать в инсталятор? что то вроде Filename: cmd.exe; parameters: "{app}\my.bat %pas"; ?

Цитата:

Цитата ErikPshat
Это уже называется вирусописание, а не инсталлятор ))) »

не :) специфические требования :)

ErikPshat 23-10-2018 20:10 2837253

Цитата:

Цитата Chudmin
Нашёл я свою ошибку, Splash-заставка отработала, а вот taskkill нет. »

Ну попробуйте повесить taskkill на иконку заставки или на другие файлы, которые загружаются первыми.
Вполне возможно, что команда извлечения ExtractTemporaryFile действует принудительно, в обход стандартного функционала инсталлятора и поэтому флаги из секции [Files] не отрабатывают. По-моему так и есть, флаги там работают только при стандартных действиях инсталлятора, т.е. при нажатии кнопки Install на конечном этапе. А у вас до этого не доходит и вы вызываете Taskkill до запуска инсталлятора из секции [ Code ] программы.

Поэтому нужно искать другое решение, т.е. как-то вызывать taskkill из кода программы, либо подключать библиотеку taskkill.dll или KillProc.dll и вызывать его через [external 'KillProcByExeName@files:KillProc.dll stdcall], как недавно выкладывал код boss911
здесь: http://forum.oszone.net/thread-33414...essage_2836987
здесь: http://forum.oszone.net/thread-33414...ml#edit2836987
здесь: http://forum.oszone.net/thread-33414...ml#post2836987

Chudmin 23-10-2018 20:14 2837254

Цитата:

Цитата ErikPshat
Поэтому нужно искать другое решение, т.е. как-то вызывать taskkill из кода программы, либо подключать библиотеку taskkill.dll или KillProc.dll и вызывать его через [external 'KillProcByExeName@files:KillProc.dll stdcall], как недавно выкладывал код boss911 здесь: http://forum.oszone.net/thread-33414...essage_2836987 »

Да, буду думать-экспериментировать.

Iska 23-10-2018 21:23 2837269

Цитата:

Цитата AnastasiyaM
Только bat файл запрашивает пароль нового пользователя, когда запускает что-то от его имени (без пароля отказывается работать). Есть ли способ, как ему его передать в инсталятор? »

Это Вам надо «местных» коллег, специалистов по InnoSetup Pascal Scripting, озадачить данным вопросом, дабы подсказали.

ErikPshat 23-10-2018 22:09 2837274

Цитата:

Цитата AnastasiyaM
Только bat файл запрашивает пароль нового пользователя, когда запускает что-то от его имени (без пароля отказывается работать). Есть ли способ, как ему его передать в инсталятор? что то вроде Filename: cmd.exe; parameters: "{app}\my.bat %pas"; ? »

Скорее всего созданный пользователь не является Администратором и не имеет прав. Вам нужно нового пользователя назначить Администратором компьютера. Может быть как-то так получится:
Код:

@echo Добавление нового пользователя
@echo off
 set user_name=Vasia_Pupkin
 set user_passw=12345678
echo.
echo 1. Добавление нового пользователя
 net user %user_name% %user_passw% /add /expires:never /fullname:%user_name%
echo.
echo 2. Обновление свойств пользователя
echo.
 wmic path UserAccount where "Name='%user_name%'" set PasswordExpires=false /nointeractive
echo.
echo 3. Добавление в группу "Администраторы" и удаление из "Пользователя"
 net localgroup "Администраторы" %user_name% /add
 net localgroup "Пользователи" %user_name% /delete
@pause


Iska 23-10-2018 22:29 2837278

ErikPshat, чего, кого?

Цитата:

Цитата ErikPshat
Скорее всего созданный пользователь не является Администратором и не имеет прав. »

И не должен являться. Этого не требуется ни по условию техзадания, ни для реализации.

Цитата:

Цитата ErikPshat
Вам нужно нового пользователя назначить Администратором компьютера. »

Не нужно. Совсем. И этого не требуется ни по условию техзадания, ни для реализации.

Нужно: реализация на InnoSetup Pascal Scripting функции CreateProcessAsUser/CreateProcessWithLogon.

ErikPshat 23-10-2018 22:41 2837280

Iska, ну я написал код батника, можно всё перенести в код Inno Setup.
А почему тогда, при создании нового пользователя, после запуска батника, требует ввод пароля?
Потому что созданный пользователь является просто Гостем и для него всегда будет запршиваться пароль.

AnastasiyaM 23-10-2018 23:16 2837286

Цитата:

Цитата ErikPshat
Iska, ну я написал код батника, можно всё перенести в код Inno Setup.
А почему тогда, при создании нового пользователя, после запуска батника, требует ввод пароля?
Потому что созданный пользователь является просто Гостем и для него всегда будет запршиваться пароль. »

Iska прав, задача создать пользователя и прописать ему ключи в реестр. Но так как у нового пользователь нет профиля, пока в него никто не логинился, я пытаюсь запустить от его имени какой-то процесс. Пароль просит именно нового пользователя. Если создавать пользователя без пароля, то ranas команда вообще отказывается работать :(

ErikPshat 24-10-2018 00:28 2837290

AnastasiyaM, ну так я что-то недогоняю. Я же вам и предложил код, который:

1. Создаёт нового пользователя с Именем и Паролем.
2. Настраивает пользователя, т.е. ставит галочку, что Пароль не временный, а "Срок действия пароля не ограничен".
3. Делает пользователя Админом и даёт права на выполнение действий без ввода пароля.

Теперь вы можете от его имени запускать необходимые процессы, без запроса пароля.
И команду ranas можете выполнять.

AnastasiyaM 24-10-2018 01:17 2837291

ErikPshat, нужен обязательно бесправный пользователь.
Цитата:

Цитата ErikPshat
3. Делает пользователя Админом и даёт права на выполнение действий без ввода пароля. »

Даже если он еще никогда не логинился? Я попробовала вставить Ваш код, он все равно пароль запросил и я пошла искать другие способы. Может что-то не так сделала..

Я пока сделала такой костыль в секции
Код:

[Code]
Exec(ExpandConstant('runas'), ' /user:MyUser cmd.exe', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ErrorCode);

теперь во время установки сообщение командной строки с запросом пароля появляется на экране. Не идеально, но работает :)

El Sanchez 24-10-2018 12:36 2837348

AnastasiyaM, вам нужно создавать пользователя уже с паролем, иначе на первом же логоне система скажет ни-ни, потом создать профиль и получить SID. Вот пример без автологона и с требованием пароля при первом входе. Пароль и прочие настройки вам все равно придется в учетке пользователя делать.
Скрытый текст

Код:

[Registry]
#define UserName "Visitor"
Root: HKU; Subkey: {code:GetUserSid|{#UserName}}\Software\Microsoft\Windows\CurrentVersion\Run; ValueName: {#MyAppExeName}; ValueType: string; ValueData: {app}\{#MyAppExeName}; Check: CheckCreateUser('{#UserName}')

[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
  ERROR_SUCCESS = 0;
  ERROR_INSUFFICIENT_BUFFER = 122;
  LOGON32_LOGON_INTERACTIVE = 2;
  LOGON32_PROVIDER_DEFAULT = 0;

type
  TProfileInfo = record
    dwSize: DWORD;
    dwFlags: DWORD;
    lpUserName: string;
    lpProfilePath: string;
    lpDefaultPath: string;
    lpServerName: string;
    lpPolicyPath: string;
    hProfile: THandle;
  end;

function LookupAccountName(lpSystemName, lpAccountName: string;
  var Sid: Byte; var cbSid: DWORD; ReferencedDomainName: string;
  var cbReferencedDomainName: DWORD; var peUse: LongWord): BOOL; external 'LookupAccountName{#A}@advapi32.dll stdcall';
function ConvertSidToStringSid(var Sid: Byte; var StringSid: LongWord): BOOL; external 'ConvertSidToStringSid{#A}@advapi32.dll stdcall';
function LogonUser(lpszUsername, lpszDomain, lpszPassword: string;
  dwLogonType, dwLogonProvider: DWORD; var phToken: THandle): BOOL; external 'LogonUser{#A}@advapi32.dll stdcall';
function LoadUserProfile(hToken: THandle; var lpProfileInfo: TProfileInfo): BOOL; external 'LoadUserProfile{#A}@userenv.dll stdcall';
function UnloadUserProfile(hToken, hProfile: THandle): BOOL; external 'UnloadUserProfile@userenv.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';

function CheckCreateUser(const UserName: string): Boolean;
var
  TempPassword: string;
  UserToken: THandle;
  ProfileInfo: TProfileInfo;
  ResultCode: Integer;
begin
  Result := False;
  try
    { Create user account. }
    TempPassword := 'PqYDLMAD';
    if not Exec(ExpandConstant('{cmd}'), Format('/c net user "%s" "%s" /add /expires:never', [UserName, TempPassword]), '', SW_HIDE, ewWaitUntilTerminated, ResultCode) or
      (ResultCode <> ERROR_SUCCESS) then Exit;

    { Create user profile. }
    if not LogonUser(UserName, '.', TempPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, UserToken) then
      RaiseException(SysErrorMessage(DLLGetLastError));
    ProfileInfo.dwSize := SizeOf(ProfileInfo);
    ProfileInfo.lpUserName := UserName;
    if not LoadUserProfile(UserToken, ProfileInfo) and
      not UnloadUserProfile(UserToken, ProfileInfo.hProfile) then
      RaiseException(SysErrorMessage(DLLGetLastError));

    { Change user account. }
    if not Exec(ExpandConstant('{cmd}'), Format('/c net user "%s" "" /logonpasswordchg:yes', [UserName]), '', SW_HIDE, ewWaitUntilTerminated, ResultCode) or
      (ResultCode <> ERROR_SUCCESS) then Exit;

    Result := True;
  except
    ShowExceptionMessage;
  finally
    if UserToken <> 0 then
      CloseHandle(UserToken);
  end;
end;

function GetUserSid(const UserName: string): string;
var
  Sid: array of Byte;
  DomainName: string;
  SidSize, DomainNameSize: DWORD;
  Buffer: LongWord;
begin
  Result := '';
  try
    SetArrayLength(Sid, 1);
    if not LookupAccountName('', UserName, Sid[0], SidSize, '', DomainNameSize, Buffer) and
      BOOL(DLLGetLastError <> ERROR_INSUFFICIENT_BUFFER) then Exit;
    SetArrayLength(Sid, SidSize);
    DomainName := StringOfChar(#0, DomainNameSize - 1);
    if not LookupAccountName('', UserName, Sid[0], SidSize, DomainName, DomainNameSize, Buffer) and
      BOOL(DLLGetLastError <> ERROR_SUCCESS) then
      RaiseException(SysErrorMessage(DLLGetLastError));
    if not ConvertSidToStringSid(Sid[0], Buffer) then
      RaiseException(SysErrorMessage(DLLGetLastError));
    Result := CastIntegerToString(Buffer);
  except
    ShowExceptionMessage;
  finally
  end;
end;


Chudmin 24-10-2018 14:34 2837362

Цитата:

Цитата ErikPshat
флаги там работают только при стандартных действиях инсталлятора, т.е. при нажатии кнопки Install на конечном этапе. А у вас до этого не доходит и вы вызываете Taskkill до запуска инсталлятора из секции [ Code ] программы. »

Похоже так и есть - я прикрутил скин, файлы скина делал через Темп, без копирования и с копированием в {app}, с флагом BeforeInstall - TaskKill не отрабатывал, а вот при установке отрабатывает.

AnastasiyaM 24-10-2018 14:36 2837364

Цитата:

Цитата El Sanchez
Вот пример без автологона и с требованием пароля при первом входе. Пароль и прочие настройки вам все равно придется в учетке пользователя делать. »

Это очень круто! Спасибо вам большое за помощь! Я бы такую красоту в жизни не написала :yahoo:

pollipen 28-10-2018 20:37 2838162

Парни скажите как сделать средствами Inno Setup
короче при распаковки инстал. запускается другой с папки tmp, но он запаролен скажем 12345
так вот как мне сделать что бы он автоматом запускался без вода в ручную пароля

Iska 28-10-2018 21:09 2838166

Цитата:

Цитата pollipen
так вот как мне сделать что бы он автоматом запускался без вода в ручную пароля »

Inno Setup command line - Поиск в GoogleSetup Command Line Parameters:
Цитата:

/PASSWORD=password

Specifies the password to use. If the [Setup] section directive Password was not set, this command line parameter is ignored.

When an invalid password is specified, this command line parameter is also ignored.

pollipen 29-10-2018 11:40 2838234

что то ни как ни пойму
wwwww.exe он запаролен
Скрытый текст
#define MyAppName "My Program"
#define MyAppVersion "1.5"
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "http://www.example.com/"
#define MyAppExeName "MyProg.exe"

[Setup]
AppId={{4F1F4C94-0955-42AB-9AEF-23D33908F46C}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes


[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ww\Desktop\wwwww.exe"; DestDir: "{tmp}"; Flags: ignoreversion

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

[Run]
Filename: "{tmp}\wwwww.exe"; Parameters: "/PASSWORD=12345"

ErikPshat 29-10-2018 17:41 2838282

pollipen, чёт мне показалось, что речь шла про секцию [Setup], а не про [RUN].
Хотя и в секции [ Code ] любые параметры запуска приложения имеют возможность выставить параметры запуска.

pollipen 30-10-2018 11:44 2838393

ErikPshat
хорошо тогда как через [ Code ]

ErikPshat 30-10-2018 13:52 2838415

pollipen, ну как мы запускаем любые экзешники через "ShellExec" или "Exec". Там на втором месте указываются параметры к экзешнику.
Вот пример извлечения запароленных архивов 7-Zip:
Код:

; Дефайним переменные
#define  Name      "My_Program_Name"
#define  UserName  "by pollipen"
#define  Version    "1.0.0.0"
#define  Publisher  "pollipen © OsZone Team"
#define  ExeName    "My_Program_Name"
;
; Точка с запятой - это комментарий
;
; Выставляем стандартные параметры программы в секции Setup:
[Setup]
;VersionInfoCompany=Название компании
VersionInfoCompany={#Publisher}

;VersionInfoCopyright=Авторские права
VersionInfoCopyright=(c) 2006-2018 {#Publisher}

;VersionInfoDescription=Описание файла
VersionInfoDescription={#Name} {#UserName}

;VersionInfoProductName=Название продукта
VersionInfoProductName={#Name}

;VersionInfoProductVersion=1.0.0.0 (Версия продукта цифровая)
VersionInfoProductVersion={#Version}

;VersionInfoProductTextVersion=Производитель
VersionInfoProductTextVersion={#Publisher}

;VersionInfoTextVersion=Версия файла текстовая
VersionInfoTextVersion={#Version} Final

;VersionInfoVersion=1.0.0.0 (Версия файла цифровая)
VersionInfoVersion={#Version}
;
; Таскаем (пакуем) с собой экзешник и INI (для примера) в программе:
[Files]
Source: Include\7z.exe; DestDir: {tmp}; Flags: dontcopy
Source: Include\7z.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\RUS\Config_en.ini; DestDir: {tmp}; Flags: dontcopy
Source: Include\ENG\Config_en.ini; DestDir: {tmp}; Flags: dontcopy
;
; Выставляем поддерживаемые языки в программе:
[Languages]
Name: en; MessagesFile: compiler:Default.isl
Name: ru; MessagesFile: compiler:Languages\Russian.isl
;
; Заменяем стандартные диалоги на свои любимые:
[Messages]
SetupAppTitle={#Name}
SelectLanguageTitle={#Name}
ru.SelectLanguageLabel=Выберите язык, который будет использован в программе распаковки:
en.SelectLanguageLabel=Select the language to use in the unpacking program:
;
; Добавляем свои кастомные диалоги:
[CustomMessages]
ru.SelectArch=Выберите файл архива для распаковки
ru.SelectedArch=Выбран архивный файл :
en.SelectArch=Select archive file to unpack
en.SelectedArch=Selected archive file :
;
; //////////////////////////////////////
; А тут пошла секция кода Code (пробелы у Code убираем, т.к. форум их воспринимает как ББ-код):
[ Code ]
// Допустим, берём любой текст из INI-файла, в данном случае название экзешника 7z.exe. Пишем для этого функцию:
// В INI секция [Support], а под ней ключ UNPACK_ARCH=7z.exe.
// Захватываем через переменную тот языковой INI, который язык юзер выбрал при запуске программы:
function UnpackArch(Default:String):String;
  Begin
    Result:=GetIniString('Support', 'UNPACK_ARCH', '', ExpandConstant('{tmp}\Config_{language}.ini'));
  end;

{ Команда кнопки "Распаковать архив". Код самой кнопки приводить не буду, у вас своя кнопка }
procedure UnpackArchButtonClick(Sender: TObject);
// Объявляем новую переменную названия выбранного архива через проводник Windows:
var
  ArchName: String;
begin
// Извлекаем из инсталлятора в {tmp} файлы архиватора:
  ExtractTemporaryFile('7z.exe');
  ExtractTemporaryFile('7z.dll');
// Присваиваем в объявленную выше переменную имя выбранного архива:
  ArchName := '';
// Открываем архив в проводнике Windows:
  if GetOpenFileName(ExpandConstant('{cm:SelectArch}'),ArchName,ExpandConstant('{src}'),ExpandConstant('{cm:ArchFiles}')+' (001,ZIP,RAR,7z)|*.001;*.zip;*.rar;*.7z|'+ExpandConstant('{cm:TOMFile}')+' (*.001)|*.001|'+ExpandConstant('{cm:ZIPFile}')+' (*.zip)|*.zip|'+ExpandConstant('{cm:RARFile}')+' (*.rar)|*.rar|'+ExpandConstant('{cm:RARMFile}')+' (*.part1.rar)|*.part1.rar|'+ExpandConstant('{cm:SevenFile}')+' (*.7z)|*.7z|'+ExpandConstant('{cm:AllFiles}')+'|*.*','001') then
// Затем отображаем в окошке имя выбранного архива и спрашиваем подтверждение или отказ на извлечение:
    if MsgBox(ExpandConstant('{cm:SelectedArch}')+#10#10+ArchName+#10#10+ExpandConstant('{cm:ExtractArch}'), mbInformation, MB_YESNO) = IDYES then
// В случае согласия, травим архив на экзешник 7z.exe, а на втором месте указываются параметры, про которые вы спрашивали, один из параметров (толькодлясвоих) - это пароль:
  if not ShellExec('open',ExpandConstant('{tmp}\{code:UnpackArch}'),'x -y -oExtractedArchive -pтолькодлясвоих '+'"'+ArchName+'"',ExpandConstant('{src}'),SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode) then
  MsgBox(ExpandConstant('{code:NotFileOnDiskMsg}'),mbCriticalError,MB_OK);
  begin ShellExec('open',ExpandConstant('{src}\ExtractedArchive'),'','',SW_SHOWNORMAL,ewWaitUntilIdle,ResultCode) end;
end;


Maratina 05-11-2018 08:57 2839396

как установить punkbuster в тихую? без принятия соглашения и тд?
параметры я нашел в логах...
Код:

--install --install-dlls="D:\Games\Battlefield 2" --i-accept-the-pb-eula --no-prompts --no-display
но {src} не передается как папка где лежит инсталл
пример-
Код:

Exec(ExpandConstant ('{src}\punkbuster\redist\pbsvc.exe'), '--install --install-dlls="{src}" --i-accept-the-pb-eula --no-prompts --no-display', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
и установка punkbuster с ошибкой "не удается найти указанный путь {src}
в логе после этого...

El Sanchez 05-11-2018 11:34 2839411

Цитата:

Цитата Maratina
и установка punkbuster с ошибкой "не удается найти указанный путь {src} »

Maratina, раскрывать нужно константы.
Скрытый текст

Код:

[Run]
Filename: {src}\punkbuster\redist\pbsvc.exe; Parameters: "--install --install-dlls=""{src}"" --i-accept-the-pb-eula --no-prompts --no-display"; Flags: nowait
; или в [Code]
Exec(ExpandConstant('{src}\punkbuster\redist\pbsvc.exe'), '--install --install-dlls=' + ExpandConstant('"{src}"') + ' --i-accept-the-pb-eula --no-prompts --no-display', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);


Chudmin 07-11-2018 20:44 2839750

Здравствуйте! Воспользовался скинами (ISSkinU.dll и *.cjstyle), и заметил, что на странице Лицензионного соглашения, полоса прокрутки не отображается в Win 10 (виртуалка), в Win 7 отображается - как я понял это не лечится?

Chudmin 18-11-2018 20:51 2841373

Здравствуйте! Потихоньку (очень потихоньку) пытаюсь вникнуть в Inno Setup, больше методом научного тыка на примерах, из одного примера взял КОД, в меру своих сил подредактировал его.

Скрытый текст
Код:

[Files]
Source: "{app}\Win_7.txt"; DestDir: "{app}"; Check:
Source: "{app}\Win_10.txt"; DestDir: "{app}"; Check:
Source: "{app}\Win_10_2.txt"; DestDir: "{app}"; Check:
Source: "{app}\Dop_Win_7.txt"; DestDir: "{app}"; Check:


[Code_]
var
Check: array [0..3] of TCheckBox;

procedure Check0(Sender: TObject);
begin
if Check[0].Checked then
begin
Check[1].Checked := False;
Check[2].Checked := False;
end;

if (Check[0].Checked = False) and (Check[1].Checked = False)
and (Check[2].Checked = False) then Check[0].Checked := True;
end;

procedure Check1(Sender: TObject);
begin
if Check[1].Checked then
begin
Check[0].Checked := False;
Check[2].Checked := False;
end;

if (Check[0].Checked = False) and (Check[1].Checked = False)
and (Check[2].Checked = False) then Check[1].Checked := True;
end;

procedure Check2(Sender: TObject);
begin
if Check[2].Checked then
begin
Check[0].Checked := False;
Check[1].Checked := False;
end;

if (Check[0].Checked = False) and (Check[1].Checked = False)
and (Check[2].Checked = False) then Check[2].Checked := True;
end;



procedure Check3(Sender: TObject);
begin
if Check[3].Checked then
end;


procedure InitializeWizard();
begin
Check[0] := TCheckBox.Create(WizardForm);
with Check[0] do
begin
Parent := WizardForm.SelectTasksPage;
Checked := True;
Left:=ScaleX(4);
Top := ScaleY(90);
Width:=ScaleX(280);
OnClick := @Check0;
// Будет Win_7.txt
Caption := ' Стандартные иконки в стиле Win 7';
end;

Check[1] := TCheckBox.Create(WizardForm);
with Check[1] do
begin
Parent := WizardForm.SelectTasksPage;
Left:=ScaleX(4);
Top := ScaleY(115);
Width:=ScaleX(280);
OnClick := @Check1;
// Будет Win_10.txt
Caption := ' Стандартные иконки в стиле Win 10';
end;

Check[2] := TCheckBox.Create(WizardForm);
with Check[2] do
begin
Parent := WizardForm.SelectTasksPage;
Left:=ScaleX(4);
Top := ScaleY(140);
Width:=ScaleX(350);
OnClick := @Check2;
// Будет Win_10_2.txt
Caption := ' Станадартные иконки в стиле Win 7 + Win 10';
end;

Check[3] := TCheckBox.Create(WizardForm);
with Check[3] do
begin
Parent := WizardForm.SelectTasksPage;
Left:=ScaleX(4);
Top := ScaleY(165);
Width:=ScaleX(280);
OnClick := @Check3;
// Будет Dop_Win_7.txt
Caption := ' Дополнительные иконки в стиле Win 7';
end;
end;


А вот как "привязать" чекбоксы к файлам, ума не приложу, что-то мне подсказывает, что через "function" нужно, но вот как, тяму не хватает, картина как разобранная мозаика, там что-то понимаю, здесь о чём-то догадываюсь. Господа, направьте на путь истинный.

nik1967 19-11-2018 21:25 2841569

Chudmin,
Три варианта

Первый: самый простой, но через секцию Components

Код:

[Setup]
AppName = MyApp
AppVerName = MyApp
DefaultDirname = {pf}\MyApp
OutputDir=.

[Types]
Name: full; Description: Full installation; Flags: iscustom;

[Components]
Name: Check0; Description: "Стандартные иконки в стиле Win 7"; Flags: exclusiveTypes: full;
Name: Check1; Description: "Стандартные иконки в стиле Win 10"; Flags: exclusive;
Name: Check2; Description: "Станадартные иконки в стиле Win 7 + Win 10"; Flags: exclusive;
Name: Check3; Description: "Дополнительные иконки в стиле Win 7"; Flags: exclusive;

[Files]
Source: "Win_7.txt"; DestDir: "{app}"; Components: Check0;
Source: "Win_10.txt"; DestDir: "{app}"; Components: Check1;
Source: "Win_10_2.txt"; DestDir: "{app}"; Components: Check2;
Source: "Dop_Win_7.txt"; DestDir: "{app}"; Components: Check3;


Второй: если все же нужны чекбосы, а не радиобаттоны

Код:

[Setup]
AppName = MyApp
AppVerName = MyApp
DefaultDirname = {pf}\MyApp
OutputDir=.

[Tasks]
Name: desktopicon; Description: "Create a &desktop icon";

[Files]
Source: "Win_7.txt"; DestDir: "{app}"; Check: Check_0;
Source: "Win_10.txt"; DestDir: "{app}"; Check: Check_1;
Source: "Win_10_2.txt"; DestDir: "{app}"; Check: Check_2;
Source: "Dop_Win_7.txt"; DestDir: "{app}"; Check:Check_3;

[Code]
var
 
Check: array [0..3] of TCheckBox;

function Check_0(): Boolean;
begin
 
Result:= Check[0].Checked;
end;

function Check_1(): Boolean;
begin
 
Result:= Check[1].Checked;
end;

function Check_2(): Boolean;
begin
 
Result:= Check[2].Checked;
end;

function Check_3(): Boolean;
begin
 
Result:= Check[3].Checked;
end;

procedure Check0(Sender: TObject);
begin
  if
Check[0].Checked then begin
   
Check[1].Checked:= False;
    Check[2].Checked:= False;
    Check[3].Checked:= False;
  end;

  if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[0].Checked:= True;
end;

procedure Check1(Sender: TObject);
begin
  if
Check[1].Checked then begin
   
Check[0].Checked:= False;
    Check[2].Checked:= False;
    Check[3].Checked:= False;
  end;

  if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[1].Checked := True;
end;

procedure Check2(Sender: TObject);
begin
  if
Check[2].Checked then begin
   
Check[0].Checked:= False;
    Check[1].Checked:= False;
    Check[3].Checked:= False;
  end;

  if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[2].Checked:= True;
end;

procedure Check3(Sender: TObject);
begin
  if
Check[3].Checked then begin
   
Check[0].Checked:= False;
    Check[1].Checked:= False;
    Check[2].Checked:= False;
  end;

  if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[3].Checked:= True;
end;

procedure InitializeWizard();
begin
 
Check[0]:= TCheckBox.Create(WizardForm);
  with Check[0] do begin
   
Parent:= WizardForm.SelectTasksPage;
    Checked:= True;
    Left:=ScaleX(4);
    Top:= ScaleY(90);
    Width:=ScaleX(280);
    OnClick:= @Check0;
    // Будет Win_7.txt
   
Caption:= ' Стандартные иконки в стиле Win 7';
  end;

  Check[1]:= TCheckBox.Create(WizardForm);
  with Check[1] do begin
   
Parent:= WizardForm.SelectTasksPage;
    Left:=ScaleX(4);
    Top:= ScaleY(115);
    Width:=ScaleX(280);
    OnClick:= @Check1;
    // Будет Win_10.txt
   
Caption:= ' Стандартные иконки в стиле Win 10';
  end;

  Check[2]:= TCheckBox.Create(WizardForm);
  with Check[2] do begin
   
Parent:= WizardForm.SelectTasksPage;
    Left:=ScaleX(4);
    Top:= ScaleY(140);
    Width:=ScaleX(350);
    OnClick:= @Check2;
    // Будет Win_10_2.txt
   
Caption:= ' Станадартные иконки в стиле Win 7 + Win 10';
  end;

  Check[3]:= TCheckBox.Create(WizardForm);
  with Check[3] do begin
   
Parent:= WizardForm.SelectTasksPage;
    Left:=ScaleX(4);
    Top:= ScaleY(165);
    Width:=ScaleX(280);
    OnClick:= @Check3;
    // Будет Dop_Win_7.txt
   
Caption:= ' Дополнительные иконки в стиле Win 7';
  end;
end;


Третий: если все же нужны чекбосы, а не радиобаттоны, другая реализация

Код:

[Setup]
AppName = MyApp
AppVerName = MyApp
DefaultDirname = {pf}\MyApp
OutputDir=.

[Tasks]
Name: desktopicon; Description: "Create a &desktop icon";

[Code]
var
 
Check: array [0..3] of TCheckBox;

procedure Check0(Sender: TObject);
begin
  if
Check[0].Checked then begin
   
Check[1].Checked:= False;
    Check[2].Checked:= False;
    Check[3].Checked:= False;
  end;

  if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[0].Checked:= True;
end;

procedure Check1(Sender: TObject);
begin
  if
Check[1].Checked then begin
   
Check[0].Checked:= False;
    Check[2].Checked:= False;
    Check[3].Checked:= False;
  end;

  if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[1].Checked := True;
end;

procedure Check2(Sender: TObject);
begin
  if
Check[2].Checked then begin
   
Check[0].Checked:= False;
    Check[1].Checked:= False;
    Check[3].Checked:= False;
  end;

  if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[2].Checked:= True;
end;

procedure Check3(Sender: TObject);
begin
  if
Check[3].Checked then begin
   
Check[0].Checked:= False;
    Check[1].Checked:= False;
    Check[2].Checked:= False;
  end;

  if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[3].Checked:= True;
end;

procedure InitializeWizard();
begin
 
Check[0]:= TCheckBox.Create(WizardForm);
  with Check[0] do begin
   
Parent:= WizardForm.SelectTasksPage;
    Checked:= True;
    Left:=ScaleX(4);
    Top:= ScaleY(90);
    Width:=ScaleX(280);
    OnClick:= @Check0;
    // Будет Win_7.txt
   
Caption:= ' Стандартные иконки в стиле Win 7';
  end;

  Check[1]:= TCheckBox.Create(WizardForm);
  with Check[1] do begin
   
Parent:= WizardForm.SelectTasksPage;
    Left:=ScaleX(4);
    Top:= ScaleY(115);
    Width:=ScaleX(280);
    OnClick:= @Check1;
    // Будет Win_10.txt
   
Caption:= ' Стандартные иконки в стиле Win 10';
  end;

  Check[2]:= TCheckBox.Create(WizardForm);
  with Check[2] do begin
   
Parent:= WizardForm.SelectTasksPage;
    Left:=ScaleX(4);
    Top:= ScaleY(140);
    Width:=ScaleX(350);
    OnClick:= @Check2;
    // Будет Win_10_2.txt
   
Caption:= ' Станадартные иконки в стиле Win 7 + Win 10';
  end;

  Check[3]:= TCheckBox.Create(WizardForm);
  with Check[3] do begin
   
Parent:= WizardForm.SelectTasksPage;
    Left:=ScaleX(4);
    Top:= ScaleY(165);
    Width:=ScaleX(280);
    OnClick:= @Check3;
    // Будет Dop_Win_7.txt
   
Caption:= ' Дополнительные иконки в стиле Win 7';
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  case
CurPageID of
   
wpFinished: begin
      if
Check[0].Checked then FileCopy(ExpandConstant('{src}\Win_7.txt'), ExpandConstant('{app}\Win_7.txt'), false);
      if Check[1].Checked then FileCopy(ExpandConstant('{src}\Win_10.txt'), ExpandConstant('{app}\Win_10.txt'), false);
      if Check[2].Checked then FileCopy(ExpandConstant('{src}\Win_10_2.txt'), ExpandConstant('{app}\Win_10_2.txt'), false);
      if Check[3].Checked then FileCopy(ExpandConstant('{src}\Dop_Win_7.txt'), ExpandConstant('{app}\Dop_Win_7.txt'), false);
    end;
  end;
end;



Chudmin 19-11-2018 22:45 2841594

nik1967, большое Вам спасибо! Теперь более менее понятно как оно организовано.

Через секцию Components я это уже организовал по Справке, но мне захотелось понять, как это организовать через чекбоксы. Правда я забыл сказать, что из первых трёх чекбоксов должен быть выбран обязательно только какой-то один, а четвёртый по желанию, без привязки к первым трём. Надеюсь я правильно сделал?

Скрытый текст
Код:

[Code_]
var
  Check: array [0..3] of TCheckBox;

function Check_0(): Boolean;
begin
  Result:= Check[0].Checked;
end;

function Check_1(): Boolean;
begin
  Result:= Check[1].Checked;
end;

function Check_2(): Boolean;
begin
  Result:= Check[2].Checked;
end;

function Check_3(): Boolean;
begin
  Result:= Check[3].Checked;
end;

procedure Check0(Sender: TObject);
begin
  if Check[0].Checked then begin
    Check[1].Checked:= False;
    Check[2].Checked:= False;
  end;

  if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) then Check[0].Checked:= True;
end;

procedure Check1(Sender: TObject);
begin
  if Check[1].Checked then begin
    Check[0].Checked:= False;
    Check[2].Checked:= False;
  end;

  if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) then Check[1].Checked := True;
end;

procedure Check2(Sender: TObject);
begin
  if Check[2].Checked then begin
    Check[0].Checked:= False;
    Check[1].Checked:= False;
  end;

  if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) then Check[2].Checked:= True;
end;

procedure Check3(Sender: TObject);
begin
  if Check[3].Checked then
end;

procedure InitializeWizard();
begin
  Check[0]:= TCheckBox.Create(WizardForm);
  with Check[0] do begin
    Parent:= WizardForm.SelectTasksPage;
    Checked:= True;
    Left:=ScaleX(4);
    Top:= ScaleY(90);
    Width:=ScaleX(280);
    OnClick:= @Check0;
    // Будет Win_7.txt
    Caption:= ' Стандартные иконки в стиле Win 7';
  end;

  Check[1]:= TCheckBox.Create(WizardForm);
  with Check[1] do begin
    Parent:= WizardForm.SelectTasksPage;
    Left:=ScaleX(4);
    Top:= ScaleY(115);
    Width:=ScaleX(280);
    OnClick:= @Check1;
    // Будет Win_10.txt
    Caption:= ' Стандартные иконки в стиле Win 10';
  end;

  Check[2]:= TCheckBox.Create(WizardForm);
  with Check[2] do begin
    Parent:= WizardForm.SelectTasksPage;
    Left:=ScaleX(4);
    Top:= ScaleY(140);
    Width:=ScaleX(350);
    OnClick:= @Check2;
    // Будет Win_10_2.txt
    Caption:= ' Станадартные иконки в стиле Win 7 + Win 10';
  end;

  Check[3]:= TCheckBox.Create(WizardForm);
  with Check[3] do begin
    Parent:= WizardForm.SelectTasksPage;
    Left:=ScaleX(4);
    Top:= ScaleY(165);
    Width:=ScaleX(280);
    OnClick:= @Check3;
    // Будет Dop_Win_7.txt
    Caption:= ' Дополнительные иконки в стиле Win 7';
  end;
end;


ErikPshat 19-11-2018 23:12 2841603

nik1967, и у меня в нагрузку подобный вопрос.

Как вывести эти же чекбоксы, то только не в главное окно, а в MsgBox?
Могу ли я использовать вместо этого:
Код:

Check[3]:= TCheckBox.Create(WizardForm);
аот это?
Код:

Check[3]:= TCheckBox.Create(MsgBox);

Dodakaedr 19-11-2018 23:29 2841611

Вставлю свои пять копеек:)
Цитата:

Цитата Chudmin
А вот как "привязать" чекбоксы к файлам »

Цитата:

Цитата Chudmin
из первых трёх чекбоксов должен быть выбран обязательно только какой-то один, а четвёртый по желанию »

Example

Код:

[Setup]
AppName=app
AppVersion=app 1.0
DefaultDirName={pf}\app

[Files]
Source: "{app}\Win_7.txt"; DestDir: "{app}"; Check: Check0();
Source: "{app}\Win_10.txt"; DestDir: "{app}"; Check: Check1();
Source: "{app}\Win_10_2.txt"; DestDir: "{app}"; Check: Check2();
Source: "{app}\Dop_Win_7.txt"; DestDir: "{app}"; Check: Check3();

[Code]
var
Check: array [0..3] of TCheckBox;

function Check0(): boolean;
begin
 
Result := Check[0].Checked;
end;

function Check1(): boolean;
begin
 
Result := Check[1].Checked;
end;

function Check2(): boolean;
begin
 
Result := Check[2].Checked;
end;

function Check3(): boolean;
begin
 
Result := Check[3].Checked;
end;

procedure GetCheck(Sender: TObject);
begin
  case
sender of
   
Check[0]: begin if Check[0].Checked then begin Check[1].Checked := False; Check[2].Checked := False; end; end;
    Check[1]: begin if Check[1].Checked then begin Check[2].Checked := False; Check[0].Checked := False; end; end;
    Check[2]: begin if Check[2].Checked then begin Check[1].Checked := False; Check[0].Checked := False; end; end;
  end;
end;

procedure InitializeWizard();
begin
Check[0] := TCheckBox.Create(WizardForm);
with Check[0] do
begin
Parent := WizardForm.SelectDirPage;
Checked := True;
Left:=ScaleX(4);
Top := ScaleY(100);
Width:=ScaleX(280);
OnClick := @GetCheck;
// Будет Win_7.txt
Caption := ' Стандартные иконки в стиле Win 7';
end;

Check[1] := TCheckBox.Create(WizardForm);
with Check[1] do
begin
Parent := WizardForm.SelectDirPage;
Left:=ScaleX(4);
Top := ScaleY(125);
Width:=ScaleX(280);
OnClick := @GetCheck;
// Будет Win_10.txt
Caption := ' Стандартные иконки в стиле Win 10';
end;

Check[2] := TCheckBox.Create(WizardForm);
with Check[2] do
begin
Parent := WizardForm.SelectDirPage;
Left:=ScaleX(4);
Top := ScaleY(150);
Width:=ScaleX(350);
OnClick := @GetCheck;
// Будет Win_10_2.txt
Caption := ' Станадартные иконки в стиле Win 7 + Win 10';
end;

Check[3] := TCheckBox.Create(WizardForm);
with Check[3] do
begin
Parent := WizardForm.SelectDirPage;
Left:=ScaleX(4);
Top := ScaleY(175);
Width:=ScaleX(280);
// Будет Dop_Win_7.txt
Caption := ' Дополнительные иконки в стиле Win 7';
end;
end;


Цитата:

Цитата ErikPshat
Как вывести эти же чекбоксы, то только не в главное окно, а в MsgBox? »

На сколько мне известно, то никак.

nik1967 20-11-2018 11:04 2841657

Dodakaedr,
ну если уж сокращать, то

Код:

procedure GetCheck(Sender: TObject);
begin
  case
sender of
   
Check[0]: if Check[0].Checked then begin Check[1].Checked := False; Check[2].Checked := False; end;
    Check[1]: if Check[1].Checked then begin Check[2].Checked := False; Check[0].Checked := False; end;
    Check[2]: if Check[2].Checked then begin Check[1].Checked := False; Check[0].Checked := False; end;
  end;
end;

Зачем нам лишние begin, end :)


Цитата:

Цитата ErikPshat
Как вывести эти же чекбоксы, то только не в главное окно, а в MsgBox? »

Цитата:

Цитата Dodakaedr
На сколько мне известно, то никак. »

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

ErikPshat 20-11-2018 13:40 2841690

Цитата:

Цитата nik1967
ну если уж сокращать, то »

Согласен, там лишние begin и end;
А ещё лучше и нагляднее сократить без правок начало кода:
Код:

[ Code ]
var
Check: array [0..3] of TCheckBox;

function Check0(): boolean; begin Result := Check[0].Checked; end;
function Check1(): boolean; begin Result := Check[1].Checked; end;
function Check2(): boolean; begin Result := Check[2].Checked; end;
function Check3(): boolean; begin Result := Check[3].Checked; end;


Цитата:

Цитата nik1967
Но, можно сделать собственную форму сообщения при нажатии на нужную кнопку, и на ней уже разместить всё, что нужно.

Да, погуглил это дело и везде предлагают только через создание новой формы. Мне как раз сейчас нужно вставить чекбоксы этого красивого кода, подготовленного выше. И у меня стандартный MessageBox отображает окно выбранной папки, которую я собираюсь разделить на части по 4 ГБ для флешек FAT32 с последующей упаковкой. И как раз здесь мне нужны 3 чекбокса, чтобы дать возможность выбора разделения не только по "4 ГБ", но и по "2 ГБ" и "Без ограничений".
Код:

if MsgBox(ExpandConstant('Выбрана следующая папка :')+#10#10+FolderName+#10#10+ExpandConstant('Вы хотите упаковать папку в PKG менее 4 ГБ?'), mbInformation, MB_YESNO) = IDYES then
Скрин, где вместо 4 ГБ хочу поставить 3 чекбокса:

Есть какой-то готовый вариант для подобного MessageBox? А то у меня уже голова не шарит.

nik1967 20-11-2018 15:10 2841711

Цитата:

Цитата ErikPshat
Есть какой-то готовый вариант для подобного MessageBox? А то у меня уже голова не шарит. »

Набросал на скорую руку пример

Код:

[Setup]
AppName = MyApp
AppVerName = MyApp
DefaultDirname = {pf}\MyApp
OutputDir=.

[Code]
var
 
NewButton1: TNewButton;
  NewForm: TSetupForm;
  YesButton: TNewButton;
  NoButton: TNewButton;
  Check: array [0..3] of TCheckBox;

procedure NewFormButtonClick(Sender: TObject);
begin
  case
TNewButton(Sender) of
   
YesButton: MsgBox('Запустилась упаковка.', mbInformation, MB_OK); //  Сюда вешаешь выполнение, если да
   
NoButton: MsgBox('Ничего не произошло.', mbInformation, MB_OK);  //  Сюда, если нет
 
end;
  NewForm.Close;
end;

procedure GetCheck(Sender: TObject);
begin
  case
sender of
   
Check[0]: if Check[0].Checked then begin Check[1].Checked:= False; Check[2].Checked:= False; end;
    Check[1]: if Check[1].Checked then begin Check[2].Checked:= False; Check[0].Checked:= False; end;
    Check[2]: if Check[2].Checked then begin Check[1].Checked:= False; Check[0].Checked:= False; end;
  end;
end;

procedure TestOnClick(Sender: TObject);
begin
 
NewForm:= CreateCustomForm();
  with NewForm do begin
   
ClientWidth:= ScaleX(473);
    ClientHeight:= ScaleY(233);
    BorderIcons:= [];
    Caption:= 'Тест';
    Color:= clWindow;
    CenterInsideControl(WizardForm, False);
  end;

  with TLabel.Create(NewForm) do begin
   
Parent:= NewForm;
    SetBounds(ScaleX(-1), ScaleY(187), ScaleX(475), ScaleY(47));
    Transparent:= false;
    Color:= clBtnFace;
  end;

  with TLabel.Create(NewForm) do begin
   
Parent:= NewForm;
    SetBounds(ScaleX(60), ScaleY(10), ScaleX(400), ScaleY(80));
    AutoSize:= False;
    Caption:= 'Вы хотите упаковать папку в PKG?';
  end;

  Check[0]:= TCheckBox.Create(NewForm);
  with Check[0] do begin
   
Parent:= NewForm;
    Checked:= True;
    Left:=ScaleX(60);
    Top:= ScaleY(90);
    Width:=ScaleX(280);
    OnClick:= @GetCheck;
    Caption:= ' Тест 1';
  end;

  Check[1]:= TCheckBox.Create(NewForm);
  with Check[1] do begin
   
Parent:= NewForm;
    Left:=ScaleX(60);
    Top:= ScaleY(115);
    Width:=ScaleX(280);
    OnClick:= @GetCheck;
    Caption:= ' Тест 2';
  end;

  Check[2]:= TCheckBox.Create(NewForm);
  with Check[2] do begin
   
Parent:= NewForm;
    Left:=ScaleX(60);
    Top:= ScaleY(140);
    Width:=ScaleX(280);
    OnClick:= @GetCheck;
    Caption:= ' Тест 3';
  end;

  YesButton:= TNewButton.Create(NewForm);
  with YesButton do begin
   
Parent:= NewForm;
    SetBounds(ScaleX(304), ScaleY(200), ScaleX(75), ScaleY(23));
    OnClick:= @NewFormButtonClick;
    Caption:= SetupMessage(msgButtonYes);
  end;

  NoButton := TNewButton.Create(NewForm);
  with NoButton do begin
   
Parent:= NewForm;
    SetBounds(ScaleX(389), ScaleY(200), ScaleX(75), ScaleY(23));
    OnClick:= @NewFormButtonClick;
    Caption:= SetupMessage(msgButtonNo);
  end;

  NewForm.ShowModal;
  NewForm.Free;
end;

procedure InitializeWizard();
begin
 
NewButton1:= TNewButton.Create(WizardForm);
  with NewButton1 do
  begin
   
Parent:= WizardForm;
    SetBounds(ScaleX(10),ScaleY(327),ScaleX(75),ScaleY(23));
    Caption:= 'Тест';
    OnClick:= @TestOnClick;
  end;
end;


И да, зачем ты в MsgBox пихаешь ExpandConstant? Совершенно лишнее.
Код:


if MsgBox('Выбрана следующая папка :'+#10#10+FolderName+#10#10+'Вы хотите упаковать папку в PKG менее 4 ГБ?', mbInformation, MB_YESNO) = IDYES then


ErikPshat 20-11-2018 16:23 2841722

Цитата:

Цитата nik1967
Набросал на скорую руку пример »

Спасибо большое! Вы уже в который раз меня выручаете. Кстати, этот MsgBox как раз из той секции, что в прошлый раз вы для меня написали. Тоже хорошее решение исходного кода и пойдёт в копилку однозначно.

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

У вас же выходит кнопкой, опять же на том окне выбора папки. И мне кажется, тогда открывающееся окно по кнопке будет лишним.
Я решил тогда уж сразу использовать ранее предложенное решение на окне выбора папки с чекбоксами, так будет более разумнее с меньшим количеством телодвижений. То есть, в своей проге я откачусь назад на один шаг, где идёт выбор папки и там сразу буду отмечать размеры делений по ГБ. А в MsgBox, как на скрине, буду автоматом отображать выбранный ранее размер.

Только мне нужно заменить, в окне выбора папки, кнопки "Далее >" и "Отмена" на кнопки "Да" и "Нет", потому что у меня не инсталлятор, а как бы авторан.
Может вы мне подскажете, как это нужно организовать? Я просто сам только пару месяцев, как заинтересовался Inno Setup.

nik1967 20-11-2018 16:33 2841724

Цитата:

Цитата ErikPshat
создать новую форму именно такого же MsgBox под замену с чекбоксами и подменить стандартный. »

Я немного переделал скрипт - как раз сделал похожим на стандартный MsgBox.
Цитата:

Цитата ErikPshat
Только мне нужно заменить, в окне выбора папки, кнопки "Далее >" и "Отмена" на кнопки "Да" и "Нет", потому что у меня не инсталлятор, а как бы авторан. »

Я не знаю, как реализовано окно выбора папки.

ErikPshat 20-11-2018 19:52 2841756

nik1967, в ообщем я сделал вот такую реализацию своей идеи, можете заценить и указать на ошибки:

Готовый примар реализации чекбоксов на странице выбора папки:
Код:

#define  Name      "MyAppName"
#define  Version    "1.0 Build 1234"

[Setup]
AppName={#Name}
AppVersion={#Version}
DefaultDirName={src}

;[Files]
;Source: "{app}\4GB.txt"; DestDir: "{app}"; Check: Check0();
;Source: "{app}\2GB.txt"; DestDir: "{app}"; Check: Check1();
;Source: "{app}\NoLimit.txt"; DestDir: "{app}"; Check: Check2();
;Source: "{app}\Signed.txt"; DestDir: "{app}"; Check: Check3();

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

[Messages]
ru.WizardSelectDir=Выбор папки для разделения
ru.SelectDirDesc=Какую папку вы хотите разделить на части и упаковать их в PKG?
ru.SelectDirLabel3=Программа разделит выбранную папку на части по размерам,%nв зависимости от сделанного вами выбора в чекбоксах.
ru.SelectDirBrowseLabel=Для выбора папки, которую вам необходимо разделить, нажмите «Обзор».
ru.DiskSpaceMBLabel=Требуется как минимум 2 или 4 ГБ свободного дискового пространства.

[CustomMessages]
ru.Check4GB=Разделить папку на части по 4 Гигабайта
ru.Check2GB=Разделить папку на части по 2 Гигабайта
ru.CheckNot=Не разделять папку, упаковать целиком
ru.CheckSig=Подписать PKG (создать "retail_signed.pkg")

[ Code ]
var
Check: array [0..3] of TCheckBox;

function Check0(): boolean; begin Result := Check[0].Checked; end;
function Check1(): boolean; begin Result := Check[1].Checked; end;
function Check2(): boolean; begin Result := Check[2].Checked; end;
function Check3(): boolean; begin Result := Check[3].Checked; end;

procedure GetCheck(Sender: TObject);
begin
  case sender of
    Check[0]: if Check[0].Checked then begin Check[1].Checked := False; Check[2].Checked := False; end;
    Check[1]: if Check[1].Checked then begin Check[2].Checked := False; Check[0].Checked := False; end;
    Check[2]: if Check[2].Checked then begin Check[1].Checked := False; Check[0].Checked := False; end;
  end;
end;

procedure InitializeWizard();
begin
  Check[0] := TCheckBox.Create(WizardForm);
  with Check[0] do
  begin
    Parent := WizardForm.SelectDirPage;
    Checked := True;
    Left:= ScaleX(4);
    Top := ScaleY(115);
    Width:=ScaleX(280);
    OnClick := @GetCheck;
    // Будет 4GB.txt, если имеется в них необходимость, нужно раскомментировать их в секции [Files]
    Caption := ExpandConstant(' {cm:Check4GB}');
  end;

  Check[1] := TCheckBox.Create(WizardForm);
  with Check[1] do
  begin
    Parent := WizardForm.SelectDirPage;
    Left:= ScaleX(4);
    Top := ScaleY(135);
    Width:=ScaleX(280);
    OnClick := @GetCheck;
    // Будет 2GB.txt, если имеется в них необходимость, нужно раскомментировать их в секции [Files]
    Caption := ExpandConstant(' {cm:Check2GB}');
  end;

  Check[2] := TCheckBox.Create(WizardForm);
  with Check[2] do
  begin
    Parent := WizardForm.SelectDirPage;
    Left:= ScaleX(4);
    Top := ScaleY(155);
    Width:=ScaleX(350);
    OnClick := @GetCheck;
    // Будет NoLimit.txt, если имеется в них необходимость, нужно раскомментировать их в секции [Files]
    Caption := ExpandConstant(' {cm:CheckNot}');
  end;

  Check[3] := TCheckBox.Create(WizardForm);
  with Check[3] do
  begin
    Parent := WizardForm.SelectDirPage;
    Left:= ScaleX(4);
    Top := ScaleY(185);
    Width:=ScaleX(280);
    // Будет Signed.txt, если имеется в них необходимость, нужно раскомментировать их в секции [Files]
    Caption := ExpandConstant(' {cm:CheckSig}');
  end;
end;


Только какие потом отлавливать переменные я пока не придумал )))
  • Выбранная папка вроде: {#AppName}
  • Выбранный чекбокс как-то так: Check()

Iska 20-11-2018 19:56 2841758

Цитата:

Цитата ErikPshat
потому что у меня не инсталлятор, а как бы авторан. Может вы мне подскажете, как это нужно организовать?»

Если у Вас не инсталляция, а «как бы авторан» — то используйте в качестве рабочего средства не Inno Setup, а другие, более подходящие для того инструменты, например, AutoPlay Media Studio и т.п.

Chudmin 21-11-2018 11:06 2841834

Здравствуйте всем! Господа-товарищи, я так понимаю, в таком виде

Скрытый текст
Код:

[Code]
var
  Check: array [0..3] of TCheckBox;

function Check_0(): Boolean;
begin
  Result:= Check[0].Checked;
end;

function Check_1(): Boolean;
begin
  Result:= Check[1].Checked;
end;

function Check_2(): Boolean;
begin
  Result:= Check[2].Checked;
end;

function Check_3(): Boolean;
begin
  Result:= Check[3].Checked;
end;

procedure Check0(Sender: TObject);
begin
  if Check[0].Checked then begin
    Check[1].Checked:= False;
    Check[2].Checked:= False;
    Check[3].Checked:= False;
  end;

  if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[0].Checked:= True;
end;

procedure Check1(Sender: TObject);
begin
  if Check[1].Checked then begin
    Check[0].Checked:= False;
    Check[2].Checked:= False;
    Check[3].Checked:= False;
  end;

  if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[1].Checked := True;
end;

procedure Check2(Sender: TObject);
begin
  if Check[2].Checked then begin
    Check[0].Checked:= False;
    Check[1].Checked:= False;
    Check[3].Checked:= False;
  end;

  if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[2].Checked:= True;
end;

procedure Check3(Sender: TObject);
begin
  if Check[3].Checked then begin
    Check[0].Checked:= False;
    Check[1].Checked:= False;
    Check[2].Checked:= False;
  end;

  if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[3].Checked:= True;
end;

procedure InitializeWizard();
begin
  Check[0]:= TCheckBox.Create(WizardForm);
  with Check[0] do begin
    Parent:= WizardForm.SelectTasksPage;
    Checked:= True;
    Left:=ScaleX(4);
    Top:= ScaleY(90);
    Width:=ScaleX(280);
    OnClick:= @Check0;
    // Будет Win_7.txt
    Caption:= ' Стандартные иконки в стиле Win 7';
  end;

  Check[1]:= TCheckBox.Create(WizardForm);
  with Check[1] do begin
    Parent:= WizardForm.SelectTasksPage;
    Left:=ScaleX(4);
    Top:= ScaleY(115);
    Width:=ScaleX(280);
    OnClick:= @Check1;
    // Будет Win_10.txt
    Caption:= ' Стандартные иконки в стиле Win 10';
  end;

  Check[2]:= TCheckBox.Create(WizardForm);
  with Check[2] do begin
    Parent:= WizardForm.SelectTasksPage;
    Left:=ScaleX(4);
    Top:= ScaleY(140);
    Width:=ScaleX(350);
    OnClick:= @Check2;
    // Будет Win_10_2.txt
    Caption:= ' Станадартные иконки в стиле Win 7 + Win 10';
  end;

  Check[3]:= TCheckBox.Create(WizardForm);
  with Check[3] do begin
    Parent:= WizardForm.SelectTasksPage;
    Left:=ScaleX(4);
    Top:= ScaleY(165);
    Width:=ScaleX(280);
    OnClick:= @Check3;
    // Будет Dop_Win_7.txt
    Caption:= ' Дополнительные иконки в стиле Win 7';
  end;
end;


чекбоксы прикрутить нельзя к самостоятельно созданной странице, только к стандартным?

Dodakaedr 21-11-2018 15:13 2841902

Chudmin,
Типа такого
Код:

Check[0].Parent := CustomPage.Surface
CustomPage это созданная страница.

Chudmin 21-11-2018 20:57 2841961

Цитата:

Цитата Dodakaedr
Типа такого »

Благодарствую, - ведь видел и в Справке и примерах, но вылетело из головы.

RbwKz 22-11-2018 11:38 2842066

Дорогие форумчане, интересует следующий вопрос.
Возможно ли как-нибудь уловить ошибки которые возникают при установке программы? Например: если ставить с пацарапанного или грязного диска получим ошибку "The Source file is corrupted",
которая успешно отобразится на экране. Мне же нужно название этой ошибки отправить на сервер (Или возможно есть другой способ).
У кого какие мысли возникают?

Chudmin 22-11-2018 12:33 2842087

Здравствуйте всем! Подскажите пожалуйста, функция UpdateReadyMemo действует только для стандартных страниц, или можно включать сюда и созданные пользователем тоже.

boss911 22-11-2018 17:10 2842132

Цитата:

Цитата RbwKz
Мне же нужно название этой ошибки отправить на сервер »

Разве что отправить лог установки, где, возможно, будет отображена та или иная ошибка установки. Запускать инсталлятор нужно с параметром/ключом командной строки.

Код:

/LOG
Указывает инсталлятору создать log-файл в папке TEMP для подробного отчета о действиях и событиях при установке, обработке записей секции [Run], предпринятых в ходе установки. Применяется при отслеживании ошибок. Например, если вы подозреваете, что файл не был заменен, хотя должен был, log-файл сообщит, что файл был действительно пропущен и почему это произошло.
Log-файлу присваивается уникальное имя на базе текущей даты. (Существующие файлы не перезаписываются и не дополняются.)
Информация, содержащаяся в log-файле, техническая и поэтому не может быть понята пользователем. Формат файла может измениться без уведомления.

/LOG="filename"
Параметр похож на /LOG, но в отличие от него позволяет указать фиксированный путь/имя файла для log-файла. Если файл с указанным именем уже существует, он будет заменен. Если файл не может быть создан, установка прервется и выдаст сообщение об ошибке.


magsood 02-12-2018 11:30 2843681

I want create custom setup with inno setup like this:
https://drive.google.com/open?id=1L2...MJ7viq2KvhR6sA
Please help for iss code!

ToBeLife 06-12-2018 17:18 2844537

Вложений: 1
Всем привет.
Подскажите пожалуйста, как реализуется рабочий вариант бэкапа и возможность отключать деинсталлятор через task.
Прошу готовый пример. Как в этом русификаторе (примеры из справки не очень подходят).
Спасибо.

ADRebus 21-12-2018 11:56 2847329

Доброго,
подскажите, есть ли возможность установить разные значения для VersionInfoDescription (в разделе [Setup]) в зависимости от локализации
данное поле отображается в описании установщика, если выбрать "Свойства", по клику ПКМ

TROY Diamond 22-12-2018 14:05 2847577

Inno Setup - упаковка папок в архивы, в процессе установки
 
Здравствуйте!

Прошу прощения если создал тему НЕ в том разделе, просьба перенести её в соответствующий!

Подскажите, пожалуйста, аналог кода ниже, с использованием консольных библиотек от 7-Zip, WinRAR? библиотек Inno Setup и т.п. , для упаковки, БОЛЬШОГО количества имеющихся папок, в отдельные архивы ZIP, с заданием ОПРЕДЕЛЁННОГО расширения и обычной степенью сжатия, в процессе установки, с последовательным удалением каждой папки СРАЗУ ЖЕ ПОСЛЕ СОЗДАНИЯ АРХИВА, из секции CODE, в Inno Setup, а НЕ с использованием батника и т.п. из секции RUN!

Либо посоветуйте, как модифицировать и доработать данный код, желательно помочь и прислать ПОЛНЫЙ код для секции CODE и Files в Inno Setup:

Скрытый текст

Код:


Секция Files
Source: "Data\Папка_pak\*"; DestDir: "{app}\DATA\ПАПКА_pak"; BeforeInstall: ChangeCaption('Распаковка файлов...'); AfterInstall: ExtLog(); Flags: ignoreversion overwritereadonly recursesubdirs createallsubdirs sortfilesbyextension
Source: "{app}\Файл-пустышка"; DestDir: "{tmp}\"; BeforeInstall: ChangeCaption('Создание ФАЙЛА(архива).pk5...'); AfterInstall: Pack('ПАПКА_pak'); Flags: ignoreversion overwritereadonly
Source: "{app}\Файл-пусиышка"; DestDir: "{tmp}\"; BeforeInstall: ChangeCaption('Удаление временных файлов...'); AfterInstall: RF(ExpandConstant('{app}\Main\pkzip.exe')); Flags: ignoreversion overwritereadonly

Секция Code
procedure Pack(str: string);
var
res : Integer;
begin
Exec(ExpandConstant('{app}\Main\pkzip.exe'), ' -add -dir=relative -NoZipExtension '+str+'.pk3' + ' ' + str + '\*.*', ExpandConstant('{app}\Main\'), SW_HIDE, ewWaitUntilTerminated, Res);
RD(ExpandConstant('{app}\Main\')+str);
end;

procedure RD(Dir:string);
var
res : integer;
begin
Exec('cmd.exe', ' /c rd /S /Q ' + AddQuotes(Dir),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
Exec('cmd.exe', ' /c rd /S /Q ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure RF(file:string);
var
res : Integer;
begin
Exec('cmd.exe', ' /c del /F /Q ' + AddQuotes(file),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
Exec('cmd.exe', ' /c del /F /Q ' + '"'+file+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;



Всё это нужно для создания "игровых" архивов. Все "игровые" - это Архивы ZIP, с переименованным расширением. Сжатие ZIP-архивов - НЕ благодарное дело и НЕ приносит большого выигрыша в весе!
Поэтому я распаковал все, в отдельные, одноимённые папки - всё сжал, теперь нужно чтобы в процессе извлечения (копирования) установщиком Inno Setup, этих папок по окончанию копирования каждой папки создавался архив, а эта папка удалялась, потом копировалась следующая - создавался архив и папка после сразу же удалялась! А НЕ в конце всей установки!

Iska 22-12-2018 14:41 2847586

Цитата:

Цитата TROY Diamond
для упаковки, БОЛЬШОГО количества имеющихся папок, в отдельные архивы ZIP, с заданием ОПРЕДЕЛЁННОГО расширения и обычной степенью сжатия, в процессе установки, с последовательным удалением каждой папки СРАЗУ ЖЕ ПОСЛЕ СОЗДАНИЯ АРХИВА, »

Вы что — решили очередного вымогателя «запилить», коллега ;)?

TROY Diamond 22-12-2018 15:06 2847589

Iska, давайте по существу, я же написал для чего!

Iska 22-12-2018 18:52 2847625

TROY Diamond, эта шутка была.

По существу — я хотел бы уяснить смысл сих действий, которые по существу приводят лишь к увеличению времени установки. В чём глубинный смысл? Чем Вам так не нравятся архивы внутри инсталляции?

P.S. На выбор смотрите раз, два.

TROY Diamond 22-12-2018 19:19 2847629

Iska, что-то вообще не то! Написал вам в Личку - ваш ящик переполнен, посмотрите, пожалуйста!

El Sanchez 23-12-2018 12:05 2847715

Цитата:

Цитата ADRebus
подскажите, есть ли возможность установить разные значения для VersionInfoDescription (в разделе [Setup]) в зависимости от локализации
данное поле отображается в описании установщика, если выбрать "Свойства", по клику ПКМ »

ADRebus, локализации чего?
Цитата:

Цитата TROY Diamond
Подскажите, пожалуйста, аналог кода ниже, с использованием консольных библиотек от 7-Zip, WinRAR? библиотек Inno Setup и т.п. , для упаковки, БОЛЬШОГО количества имеющихся папок, в отдельные архивы ZIP, с заданием ОПРЕДЕЛЁННОГО расширения и обычной степенью сжатия, в процессе установки, с последовательным удалением каждой папки СРАЗУ ЖЕ ПОСЛЕ СОЗДАНИЯ АРХИВА, из секции CODE, в Inno Setup, а НЕ с использованием батника и т.п. из секции RUN! »

TROY Diamond,
Скрытый текст

Код:

[Files]
Source: 7za.exe; Flags: dontcopy
; {app}\data\test01
Source: {app}\test01\*; DestDir: {app}\data\test01; Flags: ignoreversion overwritereadonly recursesubdirs createallsubdirs sortfilesbyextension
Source: dummy; DestDir: {app}\data; AfterInstall: Pack(ExpandConstant('{app}\data\test01')); Flags: deleteafterinstall
; {app}\data\test02
Source: {app}\test02\*; DestDir: {app}\data\test02; Flags: ignoreversion overwritereadonly recursesubdirs createallsubdirs sortfilesbyextension
Source: dummy; DestDir: {app}\data; AfterInstall: Pack(ExpandConstant('{app}\data\test02')); Flags: deleteafterinstall

[Code]
procedure Pack(const APath: string);
var
  ResultCode: Integer;
begin
  if not FileExists(ExpandConstant('{tmp}\7za.exe')) then
    ExtractTemporaryFile('7za.exe');
  if not Exec(ExpandConstant('{tmp}\7za.exe'), Format('a -tzip -sdel -y "%0:s.pk3" .\%0:s\*', [ExtractFileName(APath)]), ExtractFileDir(APath), SW_HIDE, ewWaitUntilTerminated, ResultCode) then
    RaiseException(Format('Add new data from ''%s'' to archive ''%s.pk3'' failed with error 0x%.8x (%s)', [APath, ExtractFileName(APath), ResultCode, SysErrorMessage(ResultCode)]));
  if not RemoveDir(APath) then
  begin
    ResultCode := DLLGetLastError;
    RaiseException(Format('Unable to delete empty folder ''%s''. Error code: 0x%.8x (%s)', [APath, ResultCode, SysErrorMessage(ResultCode)]));
  end;
end;


Цитата:

Цитата Iska
По существу — я хотел бы уяснить смысл сих действий, которые по существу приводят лишь к увеличению времени установки. В чём глубинный смысл? Чем Вам так не нравятся архивы внутри инсталляции? »

Iska, размер инсталлятора по схеме zip + LZMA больше, чем просто LZMA. Хочет сэкономить на размере в ущерб времени установки.

Iska 23-12-2018 13:01 2847730

Цитата:

Цитата El Sanchez
Iska, размер инсталлятора по схеме zip + LZMA больше, чем просто LZMA. »

El Sanchez, сильно больше?

Кстати, почему не рекомендуете коллеге TROY Diamond Вашу собственную разработку, на которую я ссылался выше?!

Цитата:

Цитата TROY Diamond
Написал вам в Личку - ваш ящик переполнен, посмотрите, пожалуйста! »

Пишите прямо здесь.

TROY Diamond 23-12-2018 13:13 2847735

Iska!

Цитата:

Цитата El Sanchez
Iska, размер инсталлятора по схеме zip + LZMA больше, чем просто LZMA. Хочет сэкономить на размере в ущерб времени установки.

Да так и есть! Если пытаться сжать уже сжатое в ZIP, с помощью стандартных средств Inno Setup в LZMA, то почти вообще НЕ сжимается, а если распаковать все ZIP-архивы в отдельные папки, то сжимается существенно в LZMA.

Я привёл вам пример рабочего скрипта! НО там используется старый консольный pkzip, который давным-давно НЕ поддерживается и НЕ развивается разработчиками! ((( На некоторых компах он почему-то НЕ "отрабатывает", (видимо из-за старости или какой-то неправильности скрипта), а также некоторые антивирусы на него "ругаются"! ((

Я просил усовершенствовать-доработать данный скрипт или предложить аналог вместо pkzip, использовать иные библиотеки от RAR, 7-Zip или ещё откуда-то. Сжать в Zip не так сложно ведь? Просто папок 100-ни!

Пример, есть папки Pack01, Pack02, Pack03 - это распакованные одноимённые архивы ZIP (Pack01.pack, Pack02.pack., Pack03.pack) - условно для примера.

Нужно чтобы из установщика Inno Setup папка Pack01 - извлеклась скопировалась в папку установки, после чего заархивировалась в необходимый архив ZIP с обычной степенью сжатия - и именем и расширением, какое нужно, например, Pack01.pack, после чего папка Pack01, была сразу же удалена, и только после этого началось копирование Pack02... - создание из неё архива Pack02.pack, удаление папки Pack02 и т.д...

Iska 23-12-2018 13:35 2847741

TROY Diamond, Вам тот же вопрос: «существенно» — это сколько?

El Sanchez 23-12-2018 15:59 2847770

Цитата:

Цитата Iska
El Sanchez, сильно больше? »

Iska, будет зависеть от степени сжимаемости исходных файлов. Я пока пример писал потестировал на кошках:
1. Берем пару папок с файлами, каждую из них пакуем в zip-архив. Полученные архивы пакуем в test01.7z (LZMA2, Ultra). Тут эмулируем инсталлятор с максимальным сжатием с zip-архивами внутри. Размер архива test01.7z - 241141 байт.
2. Эту же пару папок пакуем в test02.7z (LZMA2, Ultra). Тут эмулируем инсталлятор с максимальным сжатием с файлами внутри. Размер архива test02.7z - 193102 байт.
Цитата:

Цитата Iska
Кстати, почему не рекомендуете коллеге TROY Diamond Вашу собственную разработку, на которую я ссылался выше?! »

Iska, старьё и много букв для TROY Diamond :)

TROY Diamond 23-12-2018 19:24 2847848

El Sanchez, Iska, так как сделать-то?

По поводу размера - игра в установленном конечном виде с игровыми ZIP-архивами занимает 15 ГБ, примерно, если ничего НЕ менять и прям так с этими архивами создать установщик в Inno Setup, с максимальным сжатием (LZMA - LZMA2), то получается около 14 -14,5 ГБ. И то там кроме архивов есть ещё и не запакованные файлы, вот они и сжимаются, - от этого и размер уменьшается!

Кроме того, если НЕ использовать сжатие LZMA - LZMA2, а выбрать сжатие ZIP, то разница НЕ большая, 14,7 ГБ, зато время на сборку (компиляцию) установщика экономится!

А если распаковать все архивы в папки и собрать установщик в Inno Setup, сжав даже просто (LZMA), то получится около 11 ГБ!
А если ещё поставить флаги: сортировать по имени, по расширению все файлы, - то получается около 10,5 ГБ!

vint56 27-12-2018 14:18 2848575

TROY Diamond,
Скачай ISDone 0.6 final там есть возможность распаковать архивы 7zip и FreeArc и поддержка упаковки файлов в архивы zip. многое другое
ну так распакуй zip архивы и запакуй файлы в архив 7zip или FreeArc
после установки укажи за запаковать
if not ISPackZIP ( 0, 0, ExpandConstant('{app}\Pack01\*'), ExpandConstant('{app}\Pack01.pack'), 2, false ) then break;
if not ISPackZIP ( 0, 0, ExpandConstant('{app}\Pack02\*'), ExpandConstant('{app}\Pack02.pack'), 2, false ) then break;
if not ISPackZIP ( 0, 0, ExpandConstant('{app}\Pack03\*'), ExpandConstant('{app}\Pack03.pack'), 2, false ) then break;

TROY Diamond 29-12-2018 02:25 2848893

vint56, мне всё это нужно стандартным установщиком Inno Setup, а не чтобы рядом с setup.exe лежали архивы в 7-zip или FreeArc, переименованные в *.bin! И уж НЕ в коем случае (как многие сборщики делают) - сжать всё что нужно внешним архиваторами 7-zip или FreeArc, и другими, потом всё это "загнать" в Inno Setup, потмо в процессе установки игры, всё это начнёт копироваться на ЖД, потом распаковываться, потом перепаковываться в "игровые архивы" и только потом удаляться! ВОТ ЭТОГО НЕ НАДО!
Это во-первых требует на ЖД раза в 2-3 больше свободного места на ЖД и требует намного больше времени на установку!

Мне нужно по другому! Пример:
В папке Game у меня лежат все файлы игры и все распакованные игровые архивы (по папкам) и я всё это содержимое просто скомпилирую Inno Setup, - стандартного метода сжатия LZMA - вполне хватит!
Начнётся ОБЫЧНЫЙ процесс установки игры (копирование файлов), вот всё что мне нужно, чтобы в процессе установки копирования всех файлов игры, каждая скопированная ОПРЕДЕЛЁННАЯ папка, сразу же после копирования - архивировалась в zip, с конкретным названием, после чего сразу же удалялась, потом копировалась следующая папка...

Iska 29-12-2018 05:29 2848903

Цитата:

Цитата TROY Diamond
El Sanchez, Iska, так как сделать-то? »

TROY Diamond, пинайте про «много букв» коллегу El Sanchez, если сами не разобрались.

El Sanchez 29-12-2018 13:00 2848952

Цитата:

Цитата TROY Diamond
Мне нужно по другому! Пример:
В папке Game у меня лежат все файлы игры и все распакованные игровые архивы (по папкам) и я всё это содержимое просто скомпилирую Inno Setup, - стандартного метода сжатия LZMA - вполне хватит!
Начнётся ОБЫЧНЫЙ процесс установки игры (копирование файлов), вот всё что мне нужно, чтобы в процессе установки копирования всех файлов игры, каждая скопированная ОПРЕДЕЛЁННАЯ папка, сразу же после копирования - архивировалась в zip, с конкретным названием, после чего сразу же удалялась, потом копировалась следующая папка... »

TROY Diamond, рабочий пример я привел в предыдущем своем сообщении, осталось увидеть.

Iska 29-12-2018 16:44 2848983

Неправильно ты, Дядя Фёдор, бутерброд ешь Вы, коллега, ссылку приводите ;), вот так:
Цитата:

Цитата El Sanchez
TROY Diamond, рабочий пример я привел в предыдущем своем сообщении, осталось увидеть. »

надо.

TROY Diamond 30-12-2018 00:44 2849031

El Sanchez, вот теперь увидел, благодаря - Iska! Спасибо!

7za.exe - какой брать и ещё вопрос Inno Setup ANSI или Unicode - имеет значение, какой брать?

Iska 30-12-2018 03:00 2849039

Цитата:

Цитата TROY Diamond
7za.exe - какой брать »

Последний.

Цитата:

Цитата TROY Diamond
Inno Setup ANSI или Unicode - имеет значение, какой брать? »

Разумеется, будет иметь значение. Берите Unicode, не прогадаете.

TROY Diamond 30-12-2018 18:54 2849173

Iska, с DLL-кой такое прокатит или принципиально 7za.exe?

Iska 30-12-2018 19:17 2849178

Цитата:

Цитата TROY Diamond
Iska, с DLL-кой такое прокатит… »

Чтобы прокатило — пинайте коллегу El Sanchez на предмет данной темы, я Вам тут слабый помощник. Сегодня, кстати, 7-Zip обновился.

TROY Diamond 30-12-2018 19:56 2849186

Iska, в 7-Zip, нет 7za.exe, есть DLL-ки и 7z.exe...

mwz 30-12-2018 20:00 2849188

Цитата:

Цитата TROY Diamond
в 7-Zip, нет 7za.exe »

Есть.
Находится в 7z1806-extra, который также лежит на странице загрузок.

Iska 30-12-2018 20:32 2849190

Цитата:

Цитата TROY Diamond
Iska, в 7-Zip, нет 7za.exe, »

Как уже сказал коллега mwz — есть. И Вам нужен именно 7za.exe, standalone-версия, уже статически слинкованная с потребными библиотеками (не 7z.exe).

TROY Diamond 31-12-2018 02:54 2849227

Iska и mwz, я просто уточнил - спасибо за пояснения! Чтобы просто упаковать в обычный zip, нужны такие "заморочки" и "спец-файл"?

Iska 31-12-2018 12:03 2849265

TROY Diamond, что подразумевается под «заморочками» и под «спец-файлом»?

TROY Diamond 31-12-2018 18:42 2849307

Iska , смайлик забыл поставить - всё в порядке, спасибо!

Iska, mwz и El Sanchez, подскажите, пожалуйста:
1. Как во время архивирования файлов "заставить индикатор процесса двигаться" или хотя бы чтобы было написано создание файла и т.п. Идеально бы ещё с процентами соединить! НОВЫЙ липовый (НЕ настоящий) индикатор процесса НЕ нужен!
А то во время упаковки всё замирает, кнопка Отмена НЕ активна, конечный пользователь может решить что всё зависло, а создание некоторых больших архивов может занимает до 5-7 минут!

2. Как внести в список для деинсталляции, эти созданные архивы, установщик ведь о них НЕ знает, при удалении игры все архивы останутся в папки установки? Просто указать все архивы в [UninstallDelete]?

2.1. А если процесс установки, по какой-то причине, будет прерван, тут как сделать? Чтобы ВСЯ папка установки была удалена, если установка завершилась некорректно или вообще была переврана?

3. Есть ещё одна проблема - это те игры, которые хранят свои сейвы, файлы конфигурации и т.п. прям в папке установки, поэтому просто тупо удалить всю папку нельзя, нужно спросить пользователя "Оставить сохранения и т.п.?"

mwz 31-12-2018 20:03 2849320

Цитата:

Цитата TROY Diamond
Чтобы ВСЯ папка установки была удалена, если установка завершилась некорректно или вообще была переврана? »

Как-то у одного знакомого пропало абсолютно всё на диске E:

Разборка с анализом протоколов и дальнейшим "опросом свидетелей" показала, что сын установил пиратскую игру, а затем деинсталлировал её. И всё бы ничего, но установил он её в корень диска Е, а деинсталятор запустил команду, которая в переводе на человеческий язык означала: "Удалить нахрен всю папку установки, и при удалении ни о чём не спрашивать".

С Наступающим!

Iska 01-01-2019 09:48 2849368

TROY Diamond, вооот… Теперь Вы видите, что не всё так просто :)?

Цитата:

Цитата TROY Diamond
1. Как во время архивирования файлов "заставить индикатор процесса двигаться" или хотя бы чтобы было написано создание файла и т.п. Идеально бы ещё с процентами соединить! »

По-хорошему — никак. Это сторонние задачи, никоим образом не привязанные ни к объёму инсталляции, ни к индикатору процесса инсталляции (который определяется как раз её объёмом).

Цитата:

Цитата TROY Diamond
НОВЫЙ липовый (НЕ настоящий) индикатор процесса НЕ нужен! »

Вообще-то — как раз нужен новый индикатор, в отдельном окне. А совсем правильно — новое окно для всех пакуемых архивов, плюс по ещё одному окну с индикатором упаковки каждого отдельного архива. Я так думаю.

Цитата:

Цитата TROY Diamond
А то во время упаковки всё замирает, кнопка Отмена НЕ активна, конечный пользователь может решить что всё зависло, а создание некоторых больших архивов может занимает до 5-7 минут! »

Функция exec() с параметром ewWaitUntilTerminated — она такая ;). Вы что-то запустили из кода и ждёте результата. И пока такая функция полностью не отработает — обновлять форму и обрабатывать приходящие для неё сообщения некому.

Цитата:

Цитата TROY Diamond
2. Как внести в список для деинсталляции, эти созданные архивы, установщик ведь о них НЕ знает, при удалении игры все архивы останутся в папки установки? Просто указать все архивы в [UninstallDelete]? »

Да. Имейте в виду, что они будут удалены на последнем шаге деинсталляции

Цитата:

Цитата TROY Diamond
2.1. А если процесс установки, по какой-то причине, будет прерван, тут как сделать? Чтобы ВСЯ папка установки была удалена, если установка завершилась некорректно или вообще была переврана? »

В общем и целом — сложно. Вы должны внутри процедуры Pack() анализировать код возврата 7za.exe, и при ненулевом коде возврата удалить все ранее созданные архивы.

Цитата:

Цитата TROY Diamond
3. Есть ещё одна проблема - это те игры, которые хранят свои сейвы, файлы конфигурации и т.п. прям в папке установки, поэтому просто тупо удалить всю папку нельзя, нужно спросить пользователя "Оставить сохранения и т.п.?" »

Ну, дык, спрашивайте. Pascal ждёт Вас. Вообще-то, нормальные игры давно уже не хранят пользовательские данные в каталоге установки, а только либо в пользовательском разделе реестре, либо в профиле пользователя.

mwz, пираты — они такие :). Любимое дело — попытаться забросить «свои» библиотеки в системный каталог, забросить «свои» шрифты в каталог со шрифтами, нимало не заботясь о том, что не токмо функционал каких-то сторонних приложений, но и сама операционная система от таких вывертов может накрыться медным тазом.

TROY Diamond 01-01-2019 20:38 2849401

Iska, ну а липовый индикатор установки во время создания архивов как тогда сделать, или просто в момент создания архива, стандартную надпись "Копирование файлов", заменить на "Создание файла и т.п."?

Iska 02-01-2019 00:04 2849421

Не надо липовый. Нужны отдельные и реальные. Как — надеюсь, коллеги Вам помогут.

El Sanchez 04-01-2019 14:39 2849719

Вложений: 1
Цитата:

Цитата TROY Diamond
во время упаковки всё замирает, кнопка Отмена НЕ активна, конечный пользователь может решить что всё зависло, а создание некоторых больших архивов может занимает до 5-7 минут! »

TROY Diamond, ясно, так и знал, что по-простому не выйдет.
Скрытый текст

Код:

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl

[CustomMessages]
ru.SevenZipStatusPackFiles=Упаковка файлов из %1:
ru.SevenZipProgressCaptions=Прогресс:%nСкорость:%nПрошло:%nОсталось:
ru.SevenZipProgressInfo=%1%% (%2 из %3)%n%4%n%5%n%6
ru.SevenZipPackFailed=При создании архива %1 произошла ошибка. Код ошибки: %2
ru.UnableDeleteEmptyFolder=Не удалось удалить пустую папку %1. Код ошибки: %2 (%3)

[Files]
Source: 7-zip32.dll; Flags: dontcopy
#ifndef IS_ENHANCED
; http://restools.hanzify.org/inno/callbackctrl/InnoCallbackCtrl_V1.1.zip
Source: CallbackCtrl.dll; Flags: dontcopy
#endif
; {app}\data\test01
Source: {app}\test01\*; DestDir: {app}\data\test01; Flags: ignoreversion overwritereadonly recursesubdirs createallsubdirs sortfilesbyextension
Source: dummy; DestDir: {app}\data; AfterInstall: Pack(ExpandConstant('{app}\data\test01')); Flags: deleteafterinstall
; {app}\data\test02
Source: {app}\test02\*; DestDir: {app}\data\test02; Flags: ignoreversion overwritereadonly recursesubdirs createallsubdirs sortfilesbyextension
Source: dummy; DestDir: {app}\data; AfterInstall: Pack(ExpandConstant('{app}\data\test02')); Flags: deleteafterinstall

[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
  WM_GETFONT = $0031;
  WM_SETTEXT = $000C;
  WM_USER    = $0400;

  PBM_SETPOS    = WM_USER + 2;
  PBM_SETRANGE32 = WM_USER + 6;

  GWL_STYLE = -16;

  WS_CLIPSIBLINGS = $04000000;
  WS_VISIBLE      = $10000000;
  WS_CHILDWINDOW  = $40000000;
  SS_RIGHT = $2;

  CP_ACP  = 0;
  CP_UTF8 = 65001;

  FNAME_MAX32 = 512;
  MAX_PATH = 260;

  ARCEXTRACT_BEGIN    = 0;
  ARCEXTRACT_INPROCESS = 1;

type
  { 7-zip.dll. }
  TExtractingInfo = record
    szSourceFileName: PAnsiChar;
    szDestFileName: PAnsiChar;
    dwFileSize: DWORD;
    szFileSize: PAnsiChar;
    dwWriteSize: DWORD;
    szWriteSize: PAnsiChar;
    dwProgress: DWORD;
    szSpeed: PAnsiChar;
    szElapsed: PAnsiChar;
    szRemain: PAnsiChar;
  end;

  { User-defined data passed to callback. }
  TArcParam = array of HWND;

#ifndef IS_ENHANCED
 
TPackCallbackProc = function (nState: UINT; var ExtInfo: TExtractingInfo; var ArcParam: TArcParam): BOOL;
#endif

// Unicode and Character Set Functions
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: Integer; lpMultiByteStr: AnsiString; cbMultiByte, lpDefaultChar: Integer; lpUsedDefaultChar: Longint): Integer; external 'WideCharToMultiByte@kernel32.dll stdcall';
function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: AnsiString; cbMultiByte: Integer; lpWideCharStr: string; cchWideChar: Integer): Integer; external 'MultiByteToWideChar@kernel32.dll stdcall';
// Shell Lightweight Utility Functions
function PathCompactPath(hDC: THandle; lpszPath: string; dx: UINT): BOOL; external 'PathCompactPath{#A}@shlwapi.dll stdcall';
// Painting and Drawing Functions
function GetDC(hWnd: HWND): THandle; external 'GetDC@user32.dll stdcall';
// Device Context Functions
function ReleaseDC(hWnd: HWND; hDC: THandle): Integer; external 'ReleaseDC@user32.dll stdcall';
function SelectObject(hdc, hgdiobj: THandle): THandle; external 'SelectObject@gdi32.dll stdcall';
// Window Functions
function GetClientRect(hWnd: HWND; var lpRect: TRect): BOOL; external 'GetClientRect@user32.dll stdcall';
// Message Functions
function SendMessageString(hWnd: HWND; Msg: UINT; wParam: Longint; lParam: string): Longint; external 'SendMessage{#A}@user32.dll stdcall';
// Window Class Functions
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
// 7-zip.dll Functions
function SevenZip(const CmdLine: AnsiString; ArcProc: Longint; var LParam: TArcParam): Integer; external 'SevenZip@files:7-zip32.dll stdcall';
#ifndef IS_ENHANCED
// CallbackCtrl.dll Functions
function WrapPackProc(Callback: TPackCallbackProc; ParamCount: Integer): LongWord; external 'wrapcallbackaddr@files:callbackctrl.dll stdcall';
#endif

var
  ProgressInfoContainer, ProgressInfo: TNewStaticText;
  ArcProc: LongWord;

function UTF8Encode(const Value: string): AnsiString;
var
  Len: Integer;
  UTF16Buffer: string;
begin
  if Value = '' then Exit;
#ifndef UNICODE
 
// на ANSI-версии компилятора сначала переводим строку в UTF-16LE (Unicode)
  Len := MultiByteToWideChar(CP_ACP, 0, Value, -1, '', 0);
  if Len = 0 then Exit;
  UTF16Buffer := StringOfChar(#0, Len shl 1);
  if MultiByteToWideChar(CP_ACP, 0, Value, -1, UTF16Buffer, Len) = 0 then Exit;
#else
 
UTF16Buffer := Value;
#endif
 
// перевод строки UTF-16LE (Unicode) в UTF-8
  Len := WideCharToMultiByte(CP_UTF8, 0, UTF16Buffer, -1, '', 0, 0, 0);
  if Len = 0 then Exit;
  Result := StringOfChar(#0, Len - 1);
  if WideCharToMultiByte(CP_UTF8, 0, UTF16Buffer, -1, Result, Len, 0, 0) = 0 then Exit;
end;

function UTF8Decode(const Value: AnsiString): string;
var
  Len: Integer;
#ifndef UNICODE
 
UTF16Buffer: string;
#endif
begin
  if Value = '' then Exit;
#ifndef UNICODE
 
// на ANSI-версии компилятора сначала переводим строку в UTF-16LE (Unicode)
  Len := MultiByteToWideChar(CP_UTF8, 0, Value, -1, '', 0);
  if Len = 0 then Exit;
  UTF16Buffer := StringOfChar(#0, Len shl 1);
  if MultiByteToWideChar(CP_UTF8, 0, Value, -1, UTF16Buffer, Len) = 0 then Exit;

  // перевод строки UTF-16 в ANSI
  Len := WideCharToMultiByte(CP_ACP, 0, UTF16Buffer, -1, '', 0, 0, 0);
  if Len = 0 then Exit;
  Result := StringOfChar(#0, Len - 1);
  if WideCharToMultiByte(CP_ACP, 0, UTF16Buffer, -1, Result, Len, 0, 0) = 0 then Exit;
#else
 
// на Unicode-версии компилятора перевод строки UTF-8 в UTF-16LE (Unicode)
  Len := MultiByteToWideChar(CP_UTF8, 0, Value, -1, '', 0);
  if Len = 0 then Exit;
  Result := StringOfChar(#0, Len - 1);
  if MultiByteToWideChar(CP_UTF8, 0, Value, -1, Result, Len) = 0 then Exit;
#endif
end;

function PackCallbackProc(nState: UINT; var ExtInfo: TExtractingInfo; var ArcParam: TArcParam): BOOL;
var
  S: string;
  DC, SaveFont: THandle;
  H: HWND;
  R: TRect;
begin
  { Avoid call VCL methods or get/set properties. }
  Result := True;
  case nState of
    ARCEXTRACT_BEGIN:
      begin
        H := ArcParam[0];
        DC := GetDC(H);
        try
          SaveFont := SelectObject(DC, SendMessage(H, WM_GETFONT, 0, 0));
          GetClientRect(H, R);
          S := UTF8Decode(ExtInfo.szDestFileName);
          PathCompactPath(DC, S, R.Right - R.Left);
          SendMessageString(H, WM_SETTEXT, 0, S);
        finally
          if SaveFont <> 0 then
            SelectObject(DC, SaveFont);
          ReleaseDC(H, DC);
        end;
      end;
    ARCEXTRACT_INPROCESS:
      begin
        H := ArcParam[1];
        PostMessage(H, PBM_SETRANGE32, 0, 100);
        PostMessage(H, PBM_SETPOS, ExtInfo.dwProgress, 0);
        H := ArcParam[2];
        S := FmtMessage(CustomMessage('SevenZipProgressInfo'), [IntToStr(ExtInfo.dwProgress), ExtInfo.szWriteSize, ExtInfo.szFileSize, ExtInfo.szSpeed, ExtInfo.szElapsed, ExtInfo.szRemain]);
        SendMessageString(H, WM_SETTEXT, 0, S);
      end;
  end;
end;

procedure Pack(const APath: string);
var
  CmdLine: AnsiString;
  ArcParam: TArcParam;
  ResultCode: Integer;
begin
  { Pack files. }
  try
    WizardForm.StatusLabel.Caption := FmtMessage(CustomMessage('SevenZipStatusPackFiles'), [ExtractFileName(APath)]);
    ProgressInfoContainer.Show;
    CmdLine := UTF8Encode(Format('a -tzip -sdel -y "%0:s.pk3" "%0:s\*"', [APath]));
    SetLength(ArcParam, 3);
    ArcParam[0] := WizardForm.FilenameLabel.Handle;
    ArcParam[1] := WizardForm.ProgressGauge.Handle;
    ArcParam[2] := ProgressInfo.Handle;
    ResultCode := SevenZip(CmdLine, ArcProc, ArcParam);
    if ResultCode <> 0 then
      RaiseException(FmtMessage(CustomMessage('SevenZipPackFailed'), [ExtractFileName(APath), Format('0x%.8x', [ResultCode])]));
    if not RemoveDir(APath) then
    begin
      ResultCode := DLLGetLastError;
      RaiseException(FmtMessage(CustomMessage('UnableDeleteEmptyFolder'), [APath, ResultCode, SysErrorMessage(ResultCode)]));
    end;
  except
    ShowExceptionMessage;
    DelTree(ExtractFileDir(APath) + '\*.pk3', False, True, False);  // Rollback if error occured.
  finally
    ProgressInfoContainer.Hide;
    WizardForm.StatusLabel.Caption := SetupMessage(msgStatusExtractFiles);
    WizardForm.FilenameLabel.Caption := '';
  end;
end;

procedure CreateInstallingPage;
begin
  { ProgressInfoContainer. }
  ProgressInfoContainer := TNewStaticText.Create(WizardForm);
  with ProgressInfoContainer do
  begin
    Parent := WizardForm.InstallingPage;
    Align := alBottom;
    AutoSize := False;
    Caption := CustomMessage('SevenZipProgressCaptions');
    Height := Parent.ClientHeight - WizardForm.ProgressGauge.Top - WizardForm.ProgressGauge.Height - ScaleY(5);
  end;

  { ProgressInfo. }
  ProgressInfo := TNewStaticText.Create(WizardForm);
  with ProgressInfo do
  begin
    Parent := ProgressInfoContainer;
    Align := alRight;
    AutoSize := False;
    Width := Parent.ClientWidth div 2;
    SetWindowLong(Handle, GWL_STYLE, WS_CHILDWINDOW or WS_VISIBLE or WS_CLIPSIBLINGS or SS_RIGHT);
  end;
#ifdef IS_ENHANCED
 
ArcProc := CallbackAddr('PackCallbackProc');
#else
 
ArcProc := WrapPackProc(@PackCallbackProc, 3);
#endif
end;

procedure InitializeWizard;
begin
  CreateInstallingPage;
end;


rashidzhan 06-01-2019 06:44 2850101

Кто платно поможет мне создать инсталлятор?


1) Выбор языка установщика;
2) Проверка на новую версию установщика;
3) Установки некоторых файлов;
4) Тихая установка дополнительных программ и утилит;
5) Установка ярлыков;
6) Показывать описание в отдельной окошке;
7) Интерфейс как на скриншоте.

Скрин я сильно фотошопил.

TROY Diamond 10-01-2019 15:20 2851187

Цитата El Sanchez:
El Sanchez »
Цитата:

ясно, так и знал, что по-простому не выйдет.
1. El Sanchez, пожалуйста, будьте любезны, можно ПОЛНЫЙ скрипт, а также указать какую версию (и где взять) CallbackCtrl.dll и Inno Setip - вы использовали, что-то не получается! ((( То не пакует нормально, то архивы получаются битые, то папка не удаляется сразу после создания архива и перед распаковкой новой... Несколько раз компилировал, каждый раз по новому получалось...

2. Также подскажите, пожалуйста, как в этот скрипт добавить проверку ранее установленного приложения, например, по секции Uninstall, по названию и т.п., НО только с предупреждением, что приложение уже было установлено, БЕЗ запрета устанавливать "поверх"!
ПРОБЛЕМА В ТОМ, ЧТО ПРИЛОЖЕНИЕ МОЖЕТ НАЗЫВАТЬСЯ ПО РАЗНОМУ и в секции Uninstall, оно может быть в различных разделах! Я готов указать в скрипте ВСЕ ВОЗМОЖНЫЕ варианты, только скажите, куда и как это сделать?

El Sanchez 11-01-2019 11:12 2851384

Цитата:

Цитата TROY Diamond
можно ПОЛНЫЙ скрипт, а также указать какую версию (и где взять) CallbackCtrl.dll и Inno Setip - вы использовали, что-то не получается! »

TROY Diamond, пример и так полный, только без секции Setup и с тестовыми папками test01, test02 и файлом-пустышкой dummy в Files. Работает в обычной и в расширенной версиях. Ссылка на CallbackCtrl.dll приведена в Files.
Цитата:

Цитата TROY Diamond
Также подскажите, пожалуйста, как в этот скрипт добавить проверку ранее установленного приложения, например, по секции Uninstall, по названию и т.п., НО только с предупреждением, что приложение уже было установлено, БЕЗ запрета устанавливать "поверх"!
ПРОБЛЕМА В ТОМ, ЧТО ПРИЛОЖЕНИЕ МОЖЕТ НАЗЫВАТЬСЯ ПО РАЗНОМУ и в секции Uninstall, оно может быть в различных разделах! Я готов указать в скрипте ВСЕ ВОЗМОЖНЫЕ варианты, только скажите, куда и как это сделать? »

TROY Diamond,
Скрытый текст

Код:

function InitializeSetup: Boolean;
var
  UninstallSubKeyName: string;
begin
  UninstallSubKeyName := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\';
  if RegKeyExists(HKLM, UninstallSubKeyName + 'AIMP') or
    RegKeyExists(HKLM, UninstallSubKeyName + '{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}') or
    RegKeyExists(HKLM, UninstallSubKeyName + 'Axialis IconWorkshop_is1') then
    MsgBox('Я никому не нужное информационное сообщение.', mbInformation, MB_OK);
end;


TROY Diamond 11-01-2019 15:32 2851419

El Sanchez вместо "AIMP" и "{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}" - писать все возможные варианты?
А в MsgBox - написать что приложение уже было ранее установлено?

А как соединить с тем скриптом правильно?

El Sanchez 11-01-2019 17:34 2851436

Цитата:

Цитата TROY Diamond
вместо "AIMP" и "{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}" - писать все возможные варианты? »

TROY Diamond, да. Я ж не знаю ваших вариантов.
Цитата:

Цитата TROY Diamond
А в MsgBox - написать что приложение уже было ранее установлено? »

TROY Diamond, угу.
Цитата:

Цитата TROY Diamond
А как соединить с тем скриптом правильно? »

TROY Diamond, копировать-вставить. Только я забыл в теле InitializeSetup строку Result := True; добавить, а то форму не увидите.

TROY Diamond 11-01-2019 18:49 2851451

El Sanchez, так вот добавить?

Код:

function InitializeSetup(): Boolean;
begin
Result:= True;
var
  UninstallSubKeyName: string;
begin
  UninstallSubKeyName := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\';
  if RegKeyExists(HKLM, UninstallSubKeyName + 'AIMP') or
    RegKeyExists(HKLM, UninstallSubKeyName + '{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}') or
    RegKeyExists(HKLM, UninstallSubKeyName + 'Axialis IconWorkshop_is1') then
    MsgBox('Я никому не нужное информационное сообщение.', mbInformation, MB_OK);
end;

2. Соединить коды: 1-й со 2-м, сразу поле
Код:

procedure InitializeWizard;
begin
  CreateInstallingPage;
end;

в первом коде вставить второй код?

3. Вы знали, наверное что будет это вопрос? ))) Как теперь подкорректировать размер свободного места на ЖД, который требует установщик? В нём ведь скомпилированы распакованные архивы и он считает их вес, а папки ведь поочередно удаляются после создания архивов, места нужно раза в 2 меньше, чем он хочет!

Iska 12-01-2019 05:12 2851510

Цитата:

Цитата TROY Diamond
Как теперь подкорректировать размер свободного места на ЖД, который требует установщик? »

А куда он, простите, будет извлекать Ваши пока ещё не-архивы?!

El Sanchez 12-01-2019 10:13 2851524

Цитата:

Цитата TROY Diamond
так вот добавить? »

TROY Diamond, нет, после begin.
Цитата:

Цитата TROY Diamond
Соединить коды: 1-й со 2-м, сразу поле в первом коде вставить второй код? »

TROY Diamond, да. Вам бы справку почитать.
Цитата:

Цитата TROY Diamond
Как теперь подкорректировать размер свободного места на ЖД, который требует установщик? В нём ведь скомпилированы распакованные архивы и он считает их вес, а папки ведь поочередно удаляются после создания архивов, места нужно раза в 2 меньше, чем он хочет! »

TROY Diamond, забить на это.

TROY Diamond 19-01-2019 17:14 2853297

El Sanchez, а если НЕ "забивать"? ))

2. Как сделать чтобы по умолчанию полученный установщик требовал для запуска права Администратора? "PrivilegesRequired=admin", - НЕ даёт нужного эффекта, "значка щита" у полученного setup.exe - нет!
Приходится потом редактировать Манифест в полученном файле setup.exe, с помощью редактора ресурсов! Менять на "requireAdministrator".

1specific 20-01-2019 01:56 2853381

Всем привет.
Ищу человека который отлично ладит с inno setup.
Задача: сделать стучалку на сервер при установке программы, чтобы можно было подсчитать количество уникальных установок (подсчет уже на уровне сервера и к задаче не имеет отношения).
Разумеется "не за спасибо".
Скажите пожалуйста в какую тему мне обратиться с этой задачей? Если я по адресу - то пишите в ЛС. Договоримся!

Iska 20-01-2019 02:56 2853383

1specific, «стучалка на сервер» делается в самом приложении, а не в инсталляции. И отрабатывать она должна в момент первого исполнения Вашего приложения. Так что, не страдайте ерундой.

habib2302 20-01-2019 10:21 2853394

1specific, AutoIt в помощь

1specific 20-01-2019 10:42 2853397

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

habib2302, как autoit связан например с post запросом на сервер после установки приложения? Я не понимаю как он применим к моей задаче.

habib2302 20-01-2019 11:26 2853402

1specific, можно добавить проверку на удачную установку инсталлятора и задать запуск autoit скрипта после удачной установки

1specific 20-01-2019 11:49 2853409

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

Iska 20-01-2019 12:17 2853415

Цитата:

Цитата 1specific
Iska, это вы так решили для своих нужд? »

Неа.

Цитата:

Цитата 1specific
У меня цель - отстучать об успешной установке приложения. Не о запуске, а об установке. »

А в чём смысл? Если Вас интересует накрутка («IE установлен на 100% компьютеров с ОС Microsoft Windows!») — делайте, как хотите Вы. Если Вас интересует реальное количество установок — делайте, как советую я. Единственное исключение — приложение не Ваше, доступа к его исходному коду у Вас нет, а Вы просто делаете какое-нибудь очередное поделие в стиле «репак bla-bla-bla». Тут уж выбора нет.

Цитата:

Цитата 1specific
В inno это реализуемо. »

Угу. Тут больше зависит от того, как Вы будете сие реализовывать на стороне сервера. От этого и надо танцевать. Но в общем и целом сие может выглядеть, например, так: проверяете, есть ли соединение с глобальной сетью, создаёте экземпляр объекта «MSXML2.XMLHTTP» («Microsoft.XMLHTTP» и т.п., см., например: XMLHttpRequest — Википедия), заполняете его свойства, указываете метод (POST или GET), отсылаете методом .Send(), анализируете ответ, повторяете пару-тройку раз, если были некритичные ошибки. Коллеги нарисуют готовый код, я думаю. Если Вы со своей стороны опишите серверную часть.

Цитата:

Цитата 1specific
Так к чему вообще ваше замечание не понимаю? »

Просто рекомендация. Разве я могу запретить Вам что-то делать?

Цитата:

Цитата 1specific
habib2302, как autoit связан например с post запросом на сервер после установки приложения? Я не понимаю как он применим к моей задаче. »

Никак.

1specific 20-01-2019 23:39 2853493

Iska, спасибо за ответ.

Цитата:

Цитата Iska
Если Вас интересует реальное количество установок — делайте, как советую я »

Да я бы с удовольствием сделал, если бы мои знания позволяли. Но мой пост о поиске исполнителя именно поэтому и появился - нужен человек который сможет реализовать.

Цитата:

Цитата Iska
Тут больше зависит от того, как Вы будете сие реализовывать на стороне сервера. От этого и надо танцевать »

На стороне сервера всё проще. Туда приходит post запрос с параметрами, мы эти параметры добавляем в БД. Вот у нас и собрана информация об установках в базе.

Цитата:

Цитата Iska
Но в общем и целом сие может выглядеть, например, так: проверяете, есть ли соединение с глобальной сетью, создаёте экземпляр объекта «MSXML2.XMLHTTP» («Microsoft.XMLHTTP» и т.п., см., например: XMLHttpRequest — Википедия), заполняете его свойства, указываете метод (POST или GET), отсылаете методом .Send(), анализируете ответ, повторяете пару-тройку раз, если были некритичные ошибки. »

Вообще для меня тёмный лес. Возможно это гениальная идея, но к сожалению я не в состоянии оценить)))

Цитата:

Цитата Iska
Коллеги нарисуют готовый код, я думаю. Если Вы со своей стороны опишите серверную часть. »

А вот тут легко:
  1. После успешной установки, отсылаем post запрос вида site_ru/success.php?md5=11111&hwid=22222&os=7&ip=1.1.1.1.1
    P.S. важно именно отослать post запрос незаметно для пользователя (т.е. не открыть страницу браузера после установки, а в фоне просто отослать). Причина - бональная защита от дураков которые путем изменения url могут накручивать установки.
  2. Сервер принимает этот запрос, добавляет параметры запроса в базу (каждый в свою колонку таблицы).

Пояснение к параметрам
  • md5 - это md5 установщика, который был успешно установлен (самого install.exe). Он будет всегда уникальный и генерируется на уровне сервера путем добавления байтов, перед тем как отдать его на скачивание.
  • hwd - это hwid железки на которой была произведена установка
  • os - это операционная система на которой была произведена установка
  • ip - это IP адрес устройства на котором была произведена установка (ну это возможно лишнее, т.к. ip мы можем определять при получении post запроса на сервере).

Iska 21-01-2019 00:34 2853495

Цитата:

Цитата 1specific
Вообще для меня тёмный лес. Возможно это гениальная идея, но к сожалению я не в состоянии оценить))) »

Ничего гениального в этом нет, обычная отсылка запроса, использующая готовую библиотеку посредством Automation. Примеры можно найти запросом по тем же ключевым словам, например:
Inno Setup "MSXML2.XMLHTTP"|"Microsoft.XMLHTTP" POST Send - Поиск в Google. Вот типичный образец использования класса (причём, даже с разбором ответа сервера). Если вместо «Inno Setup» укажете «VBScript», или «VB», или «VBA» — найдёте уйму примеров, которые только и останется, что перевести с VBScript на Pascal.

Цитата:

Цитата 1specific
Он будет всегда уникальный и генерируется на уровне сервера путем добавления байтов, перед тем как отдать его на скачивание. »

И этого бы я не советовал делать — на подобные вещи могут весьма нервно реагировать поведенческие анализаторы проактивной защиты антивирусов (вкупе с тем, что планируется, что инсталлятор будет «стучать» в сеть — чую, получится убойный эффект a-la красной тряпки для быка).

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

ErikPshat 21-01-2019 21:36 2853649

Можете подсказать, почему у меня ошибка could not call proc?

Пытаюсь при запуске инсталлятора проверить установленную версию PowerShell и если она меньше 5.1, тогда скачивать и устанавливать её.
Вот такой сокращённый код:
Код скрипта
Код:

[Setup]
AppName=PowerShell
AppVersion=5.1

[Files]
Source: "embedded\ISSkin\ISSkinU.dll"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\ISSkin\Styles\{#Skin}.cjstyles"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\7z.dll"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\7z.exe"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\7z32.dll"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\7z32.exe"; DestDir: {tmp}; Flags: dontcopy

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

[CustomMessages]
ru.Caution7064=На компьютере обнаружена устаревшая версия PowerShell.%nПосле установки программы будет произведено скачивание и установка обновления PowerShell 5.1 для Windows 7 64bit.%n%nПожалуйста, дождитесь завершения обновления!

[_Code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:ISSkinU.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:ISSkinU.dll stdcall';
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';

function IsWindowsVersionOrNewer(Major, Minor: Integer): Boolean;
var
  Version: TWindowsVersion;
begin
  GetWindowsVersionEx(Version);
  Result := (Version.Major > Major) or ((Version.Major = Major) and (Version.Minor >= Minor));
end;

function IsWindows70OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(6, 1); end;
function IsWindows80OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(6, 2); end;
function IsWindows81OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(6, 3); end;
function IsWindows10OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(10,0); end;

function InitializeSetup(): Boolean;
begin
  ExtractTemporaryFile('{#Skin}.cjstyles');
  LoadSkin(ExpandConstant('{tmp}\{#Skin}.cjstyles'), 'normalmystyle.ini');
        Result := True;
end;

// Скачиваем PowerShell 5.1 под нашу версию Windows и битность...
procedure InitializeWizard;
var
  PSVersion: String;
begin
  RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine','PowerShellVersion', PSVersion);
  if ExpandConstant(Copy(PSVersion,1,3)) < ExpandConstant('5.1') then
  begin
    if IsWin64 then
    begin
        idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win7AndW2K8R2-KB3191566-x64.zip',ExpandConstant('{tmp}\Win7AndW2K8R2-KB3191566-x64.zip'),68076477); end else
      if IsWindows80OrNewer and not IsWindows81OrNewer then begin MsgBox(ExpandConstant('{cm:Caution8064}'), mbInformation, MB_OK);
        idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/W2K12-KB3191565-x64.msu',ExpandConstant('{tmp}\W2K12-KB3191565-x64.msu'),21585220); end else
      if IsWindows81OrNewer and not IsWindows10OrNewer then begin MsgBox(ExpandConstant('{cm:Caution8164}'), mbInformation, MB_OK);
        idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win8.1AndW2K12R2-KB3191564-x64.msu',ExpandConstant('{tmp}\Win8.1AndW2K12R2-KB3191564-x64.msu'),19878906); end;
      idpDownloadAfter(wpReady);
    end
    else
    begin
      if IsWindows70OrNewer and not IsWindows80OrNewer then begin MsgBox(ExpandConstant('{cm:Caution7032}'), mbInformation, MB_OK);
        idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win7-KB3191566-x86.zip',ExpandConstant('{tmp}\Win7-KB3191566-x86.zip'),44821734); end else
      if IsWindows81OrNewer and not IsWindows10OrNewer then begin MsgBox(ExpandConstant('{cm:Caution8132}'), mbInformation, MB_OK);
        idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win8.1-KB3191564-x86.msu',ExpandConstant('{tmp}\Win8.1-KB3191564-x86.msu'),15231117); end;
      idpDownloadAfter(wpReady);
    end;
  end;
end;

// Во время показа страницы загрузки открываем по умолчанию скрытые детали загрузки...
procedure CurPageChanged(CurPageID: Integer);
begin
 if not IsWindows10OrNewer then
  begin
    if CurPageID = IDPForm.Page.ID then
    begin
    // Показать детали загрузки
    idpShowDetails(True);
    // Скрываем кнопку Подробно/Скрыть
    IDPForm.DetailsButton.Visible := False;
    end;
  end;
end;

// Распаковываем ранее скачанный ZIP/MSU и запускаем установку...
procedure CurStepChanged(CurStep: TSetupStep);
var
  ResultCode: Integer;
begin
  if CurStep = ssPostInstall then
  begin
    if IsWin64 then
    begin
      if FileExists(ExpandConstant('{tmp}\Win7AndW2K8R2-KB3191566-x64.zip')) then
      begin
        ExtractTemporaryFile('7z.exe');
        ExtractTemporaryFile('7z.dll');
        ShellExec('open',ExpandConstant('{tmp}\7z.exe'),ExpandConstant('x -y -oExtractedArchive ')+ExpandConstant('Win7AndW2K8R2-KB3191566-x64.zip'),'',SW_HIDE,ewWaitUntilTerminated,ResultCode);
        ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\ExtractedArchive\Win7AndW2K8R2-KB3191566-x64.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
      end;
      if FileExists(ExpandConstant('{tmp}\W2K12-KB3191565-x64.msu')) then ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\W2K12-KB3191565-x64.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
      if FileExists(ExpandConstant('{tmp}\Win8.1AndW2K12R2-KB3191564-x64.msu')) then ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\Win8.1AndW2K12R2-KB3191564-x64.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
    end
    else
    begin
      if FileExists(ExpandConstant('{tmp}\Win7-KB3191566-x86.zip')) then
      begin
        ExtractTemporaryFile('7z32.exe');
        ExtractTemporaryFile('7z32.dll');
        ShellExec('open',ExpandConstant('{tmp}\7z32.exe'),ExpandConstant('x -y -oExtractedArchive ')+ExpandConstant('Win7-KB3191566-x86.zip'),'',SW_HIDE,ewWaitUntilTerminated,ResultCode);
        ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\ExtractedArchive\Win7-KB3191566-x86.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
      end;
      if FileExists(ExpandConstant('{tmp}\Win8.1-KB3191564-x86.msu')) then ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\Win8.1-KB3191564-x86.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
    end;
  end;
end;

procedure DeinitializeSetup();
begin
  ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
  UnloadSkin();
end;


Поясняю, ошибка возникает, когда я после скачивания PowerShell вставляю код открытия детализации "Показать" и скрытия кнопки "Скрыть" на странице скачивания.
Без этого кода всё работает нормально.
А при вставке кода, сразу ошибка, причём только при условия меньше или больше, а при равенстве условия сравнения версий, всё отрабатывает правильно.
Вот этот короткий код в скрипте:
Код в скрипте, приводящий к ошибке: "could not call proc"
Код:

// Во время показа страницы загрузки открываем по умолчанию скрытые детали загрузки...
procedure CurPageChanged(CurPageID: Integer);
begin
 if not IsWindows10OrNewer then
  begin
    if CurPageID = IDPForm.Page.ID then
    begin
    // Показать детали загрузки
    idpShowDetails(True);
    // Скрываем кнопку Подробно/Скрыть
    IDPForm.DetailsButton.Visible := False;
    end;
  end;
end;


ErikPshat 22-01-2019 00:40 2853687

Эмм, попробую перефразировать по другому...
Я делаю установку программы, которая требует PowerShell последней версии 5.1 для Windows 7/8.0/8.1 (на 10-ке она стоит из коробки).
Так вот, я хочу в инсталляторе отобразить детализацию скачивания файла обновления и убрать там кнопку "Скрыть/Показать".
Но если я добавляю этот код, тогда программа вылетает с ошибкой "could not call proc".
Поэтому я прошу помощи - что я делаю не так?

Выше наверное никому не понятен мой сокращённый код.
Выкладываю готовый код, тоже сокращённый (выкинул все лишние файлы и строки программы), но код компилируемый и рабочий:В строке №76 выставлено условие сравнения < (меньше)
Код:

if ExpandConstant(Copy(PSVersion,1,3)) < ExpandConstant('5.1') then
Если у вас PowerShell устаревшая меньшей версии, тогда будет скачивание и установка.
А если у вас PowerShell уже обновлена, тогда вам нужно будет поменять на = (равно), иначе ничего происходить не будет.

Далее, нужно раскомментировать код отображения детализированных данных между строками 105 - 120:
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
 if not IsWindows10OrNewer then
  begin
  if CurPageID = IDPForm.Page.ID then
    begin
    // Показать детали загрузки
    idpShowDetails(True);
    // Скрываем кнопку Подробно/Скрыть
    IDPForm.DetailsButton.Visible := False;
    end;
  end;
end;

И при условии < попробовать скомпилировать и найти ошибку, почему в этом случае выскакивает "could not call proc".
Что интересно, при условии = (равенства), никакой ошибки при компиляции не происходит.
Пожалуйста профи, не игнорируйте, помогите...

1specific 22-01-2019 10:53 2853723

Цитата:

Цитата Iska
И этого бы я не советовал делать — на подобные вещи могут весьма нервно реагировать поведенческие анализаторы проактивной защиты антивирусов »

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

Цитата:

Цитата Iska
Я бы нацарапал, но думаю, у более опытных в Pascal коллег сие выйдет гораздо лучше. »

А более опытные коллеги видимо даже не обратят внимание на мой пост)) Таких как вы по пальцам одной руки пересчитать можно)
Так что буду рад сотрудничеству, если вы готовы.

El Sanchez 22-01-2019 11:27 2853729

Цитата:

Цитата TROY Diamond
а если НЕ "забивать"? )) »

TROY Diamond, вы не знаете размер будущих архивов, поэтому DiskSpaceLabel-у вам нечего предложить.
Цитата:

Цитата TROY Diamond
Как сделать чтобы по умолчанию полученный установщик требовал для запуска права Администратора? "PrivilegesRequired=admin", - НЕ даёт нужного эффекта »

TROY Diamond, разработчик руководствуется тупыми гайдами от Microsoft по разработке десктопных приложений, хотя, возможно, баг, но баг слишком уж долгоживущий в официальной версии, чтобы быть багом. Китайская версия данного поведения не имеет.
Цитата:

Цитата 1specific
за что еще можно зацепиться, чтобы был некий уникальный параметр установщика без его пересборки. »

1specific, например, GUID в конец инсталлятора. Но сначала четко определитесь с термином "успешная установка".
Цитата:

Цитата ErikPshat
if ExpandConstant(Copy(PSVersion,1,3)) < ExpandConstant('5.1') then »

ErikPshat, во-первых, нельзя так версионные строки сравнивать. Когда-нибудь PSVersion станет 10.0 и это условие станет истинным. Во-вторых, ExpandConstant лишние, нет там брекетированных констант. В-третьих, ошибка у вас тогда, когда это выражение не истинно -> не выполняются idp-функции -> не создается IDPForm. И уже в CurPageChanged идет обращение к несуществующей IDPForm.

ErikPshat 22-01-2019 15:39 2853778

El Sanchez, ну когда выйдет версия 10, тогда уже меня не будет ))) Да и даже когда она будет, то всё равно она менее сегодняшней 5.1 не станет по условию. Просто прога требует такую версию, но только в меньших версиях её код не срабатывает, поэтому для работы проги требуется не менее 5.1. Я рад, что хоть так работает )). Насчёт 2-го понял, приму к сведению.

Цитата:

Цитата El Sanchez
В-третьих, ошибка у вас тогда, когда это выражение не истинно -> не выполняются idp-функции -> не создается IDPForm. И уже в CurPageChanged идет обращение к несуществующей IDPForm. »

Вот это мне и непонятно, что нужно сделать, чтобы заставить эту функцию отрабатывать именно после инициализации IDP.Form?
Я пихал её и в начало, и в середину, и в конец момента скачивания. Но всё равно одно и то же, либо ошибка, либо никакого эффекта не происходит. Трудно мне до этого догнать, я всего-то пару месяцев как начал осваивать Inno Setup.

El Sanchez 22-01-2019 17:31 2853796

Цитата:

Цитата ErikPshat
Я пихал её и в начало, и в середину, и в конец момента скачивания. Но всё равно одно и то же, либо ошибка, либо никакого эффекта не происходит. »

ErikPshat,
Скрытый текст

Код:

function StrCmpLogicalW(psz1, psz2: string): Integer; external 'StrCmpLogicalW@shlwapi.dll stdcall';

procedure InitializeWizard;
var
  PSVersion: string;
begin
  if not RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine', 'PowerShellVersion', PSVersion) or
    (StrCmpLogicalW(PSVersion, '5.2') < 0) then
  begin
    { ... }
    { IDPForm.Page is create inside idpDownloadAfter. }
    idpDownloadAfter(wpReady);
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if not IsWindows10OrNewer and
    Assigned(IDPForm.Page) then
  begin
    if CurPageID = IDPForm.Page.ID then
    begin
      { ... }
    end;
  end;
end;


Iska 22-01-2019 19:01 2853810

Цитата:

Цитата 1specific
А более опытные коллеги видимо даже не обратят внимание на мой пост)) »

Обратят.

Цитата:

Цитата 1specific
Таких как вы по пальцам одной руки пересчитать можно) »

Это далеко не так.


Цитата:

Цитата 1specific
чтобы был некий уникальный параметр установщика »

Но зачем? Я бы просто генерировал тот же GUID на завершающем этапе установки — вот Вам и уникальность. А файл инсталляции должен быть одинаков для всех.

1specific 22-01-2019 22:28 2853866

Цитата:

Цитата Iska
Но зачем? Я бы просто генерировал тот же GUID на завершающем этапе установки — вот Вам и уникальность. А файл инсталляции должен быть одинаков для всех. »

Потому что это делается для партнерской программы.
Чтобы считать количество уникальных скачиваний и знать от какого из партнеров был скачан и установлен файл делается связка md5+hwid
Где md5 привязывается к партнеру в БД и генерится на сервере путем добавления байтов, а hwid как показатель уникальности установки.
После чего данные проверяются, если установка уникальна (hwid,ip и т п), то партнеру засчитывается +1 установка (партнер определяется по md5).

Сгенерировать отдельный установщик под партнера (или как вы говорите GUID) возможно, если бы партнеров было 5-10 или 30. Но партнеров много, и неизвестно сколько. Под каждого генерить установщик это проблемно. Потом их все залить на хост - это уйма места. И далее если программа обновилась, это что каждому партнеру снова собирать и заливать установщик и закреплять руками md5 для каждого?
Поэтому было принято такое решение - исходный файл один, а далее под партнера при скачивании по его реф. ссылке генерится md5, который записывается в базу.

Надеюсь доступно описал весь процесс)

Цитата:

Цитата Iska
Обратят. »

Ну вот за неделю пока кроме вас даже никто и не ответил.

Цитата:

Цитата Iska
Это далеко не так. »

Наверняка много умных и опытных людей, но как я написал выше - судя по всему у них другие интересы.

ErikPshat 23-01-2019 02:29 2853902

El Sanchez, о, спасибо большое! Как просто решаются сложные вопросы )) и как же сложно решить простые задачи ))

Я так понял, эта функция function StrCmpLogicalW - сравнение строк в Unicode-формате встроенными средствами Win API (String Compare Logical Wide).
И вы мне подкинули решение сравнения версий. Немного не ясна для меня прозрачность логики работы (я так понял 5.2 была выставлена для теста?):
Код:

if not RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine', 'PowerShellVersion', PSVersion) or
    (StrCmpLogicalW(PSVersion, '5.1') < 0) then

Я пытаюсь прочитать это и как-то загадочно это. Предположим у пользователя (у меня) установлена последняя версия PowerShell 5.1, тогда читаю:
  • "Если не 5.1.14409.1005 (возвращает PSVersion из реестра) или 0.0.14409.1005 < 0 тогда... begin" и у меня пошла скачка и установка, даже если мне это не надо.
Первое условие из реестра получается никогда не выполняется, а служит только для доставания ключа из реестра в переменную PSVersion?
Вторым условием производится сравнение версии из реестра с требуемой нами. Но тогда и оно не отрабатывает, тем более, если оставить там 5.2.
Или я не правильно эту конструкцию читаю?

По-моему, моя прежняя конструкция вполне прозрачна (для меня) и отрабатывает правильно, даже если завтра выйдет версия 10.
Этот мой код с учётом вашей поправки насчёт лишнего ExpandConstant:
Код:

RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine','PowerShellVersion', PSVersion);
if Copy(PSVersion,1,3) < '5.1' then

Тут просто первой строкой захватываем из реестра версию в переменную PSVersion и второй строкой производим сравнение. Через Copy отсекаем ненужные нам минорные цифры билда и оставляем для сравнения только первые 2 цифры (3 символа с точкой) и сравниваем с требуемой нам цифрой 5.1. Даже если выйдет версия 7.0 или 10.0 (навряд ли), тогда условие же всё равно будет выполняться, т.к. нам нужно чтобы версия PowerShell была не ниже 5.1, а то что старше и больше уже не важно.
На самом деле моей программе достаточно и PowerShell v5.0. Это прога по разбивке и упаковке папок на части по 4 Гб/2 Гб/Целиком, а так же, по загрузке файлов из интернета из XML со ссылками, контрольными суммами, и пр. тех. данными, и средствами PowerSell это удачно реализовалось.
Для справки: на Win 7 из коробки установлена PS 2.0, на Win 8.0 стоит PS 3.0, на Win 8.1 - PS 4.0, на Win 10 - 5.0. Последняя стабильная 5.1. И больше на Windows 10 мало вероятно что предвидится.

Iska 23-01-2019 08:07 2853915

Цитата:

Цитата ErikPshat
И больше на Windows 10 мало вероятно что предвидится. »

4.7 PowerShell Core 6.0

ErikPshat 23-01-2019 09:00 2853918

Iska, ну допустим, пусть будет даже и так. Это ядро пока ещё не зарелизено на оффсайте, там давно уже лежит версия 5.1 и она давно не обновляется. Но разве это на что-то влияет? Предположим программе требуется для её стабильной работы версия 5.1, не меньше, но конечно же можно старше и если у юзера установлена меньшая версия, тогда ему предлагается обновиться как минимум на требуемую 5.1. И что это меняет, для работы моей программы, даже если завтра выйдет PS 6,0, потом 7.0 и так далее? Но они же будут не меньше 5.1, а если у юзера установлена более свежая версия, тогда логично ему и не будет предлагаться скачать и установить 5.1.

Ну я так понял, это просто опровержение моих слов типа "мало вероятно что предвидится" :)

El Sanchez 23-01-2019 10:44 2853938

Цитата:

Цитата ErikPshat
Я пытаюсь прочитать это и как-то загадочно это. Предположим у пользователя (у меня) установлена последняя версия PowerShell 5.1, тогда читаю:
"Если не 5.1.14409.1005 (возвращает PSVersion из реестра) или 0.0.14409.1005 < 0 тогда... begin" и у меня пошла скачка и установка, даже если мне это не надо. »

ErikPshat, немного я протупил, все-таки там 5.1 должно стоять. Главное, сначала правильно написал, потом переклинило и на 5.2 исправил :).
Цитата:

Цитата ErikPshat
Первое условие из реестра получается никогда не выполняется, а служит только для доставания ключа из реестра в переменную PSVersion?
Вторым условием производится сравнение версии из реестра с требуемой нами. Но тогда и оно не отрабатывает, тем более, если оставить там 5.2. »

ErikPshat, если не прочитали версию, то сравнивать нечего, нет у нас PowerShell, выполняем блок. Если прочитали, то сравниваем то, что прочитали, по результату проверки выполняем блок. Также в блоке пропишите сообщение, когда PowerShell не установлен (выпонилось первое условие).
Цитата:

Цитата ErikPshat
По-моему, моя прежняя конструкция вполне прозрачна (для меня) и отрабатывает правильно, даже если завтра выйдет версия 10. »

ErikPshat, отлично, выходит 10.0.0.1, вы с Copy режете до 3 символов, теперь сравните строки '10.' < '5.1'. Ой.

Iska 23-01-2019 17:19 2854071

ErikPshat, мы уже поимели версию ОС Windows за номером 10.0 сразу после версии 6.3. Так что не зарекайтесь.

ErikPshat 23-01-2019 19:39 2854123

El Sanchez, ещё раз благодарю за помощь и разъяснения! Потихоньку кое-что проясняется.

Есть ещё один один момент, который я оказывается упустил. Дело в том, что на Windows Vista идёт версия PS 1.0, на Windows 7 идёт из коробки версия PS 2.0 и что самое важное, они прописываются по другому пути в реестре, там разница в цифре 1 в пути:
Код:

SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
А, начиная с Windows 8.0 PS 3.0 в пути вместо 1 идёт 3. Получается, что на 7-ке будет возвращаться пустая строка, как и в Vista (но ей пристального внимания уже не уделяем).
Тогда получается, нужно добавить условие проверки ключа реестра под 7-ку. Правильно ли будет, если я сделаю так:
Код:

if not RegQueryStringValue(HKLM,'SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine','PowerShellVersion',PSVersion) or
  not RegQueryStringValue(HKLM,'SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine','PowerShellVersion',PSVersion) or
  (StrCmpLogicalW(PSVersion, '5.1') < 0) then

Либо можно соорудить другую конструкцию через if и else, т.е. провести по отдельности верификацию через первый ключ, в противном случае через второй.

Цитата:

Цитата Iska
ErikPshat, мы уже поимели версию ОС Windows за номером 10.0 сразу после версии 6.3. »

Цитата:

Цитата El Sanchez
ErikPshat, отлично, выходит 10.0.0.1, вы с Copy режете до 3 символов, теперь сравните строки '10.' < '5.1'. Ой. »

Предположим, выйдет версия 10.0123.456, через Copy мы отсекаем первые 3 символа, получится 10. (десять с точкой).
Тогда при сравнении 10. < 5.1 разве система не поймёт, что нужно сравнивать цифры до точки, а потом после точки. Если стоит точка, тогда думаю система должна определять, что это дробная запятая и, если после точки ничего не стоит, то это означает 0, т.е. 10.0 < 5.1. Это конечно можно проверить на практике, но пока это так, размышления и аналитическая деятельность.

Iska 23-01-2019 20:09 2854126

Цитата:

Цитата ErikPshat
Это конечно можно проверить на практике, но пока это так, размышления и аналитическая деятельность. »

Проверяю:
AutoIt
Код:

AutoItSetOption("MustDeclareVars", 1)

ConsoleWrite( _
        "Returns  0 if the strings are identical." & @CRLF & _
        "Returns  1 if the string pointed to by psz1 has a greater value than that pointed to by psz2." & @CRLF & _
        "Returns -1 if the string pointed to by psz1 has a lesser value than that pointed to by psz2."  & @CRLF & @CRLF _
)


ConsoleWrite("1    w/s 5  ==> " & String(_StrCmpLogicalW("1",    "5"  )) & @CRLF)
ConsoleWrite("1    w/s 5.0 ==> " & String(_StrCmpLogicalW("1",    "5.0")) & @CRLF)
ConsoleWrite("1.0  w/s 5  ==> " & String(_StrCmpLogicalW("1.0",  "5"  )) & @CRLF)
ConsoleWrite("1.0  w/s 5.0 ==> " & String(_StrCmpLogicalW("1.0",  "5.0")) & @CRLF)

ConsoleWrite(@CRLF)

ConsoleWrite("10  w/s 5  ==> " & String(_StrCmpLogicalW("10",  "5"  )) & @CRLF)
ConsoleWrite("10  w/s 5.0 ==> " & String(_StrCmpLogicalW("10",  "5.0")) & @CRLF)
ConsoleWrite("10.0 w/s 5  ==> " & String(_StrCmpLogicalW("10.0", "5"  )) & @CRLF)
ConsoleWrite("10.0 w/s 5.0 ==> " & String(_StrCmpLogicalW("10.0", "5.0")) & @CRLF)

ConsoleWrite(@CRLF)

ConsoleWrite("10  w/s 10  ==> " & String(_StrCmpLogicalW("10",  "10"  )) & @CRLF)
ConsoleWrite("10  w/s 10.0 ==> " & String(_StrCmpLogicalW("10",  "10.0")) & @CRLF)
ConsoleWrite("10.0 w/s 10  ==> " & String(_StrCmpLogicalW("10.0", "10"  )) & @CRLF)
ConsoleWrite("10.0 w/s 10.0 ==> " & String(_StrCmpLogicalW("10.0", "10.0")) & @CRLF)

Exit(0)

Func _StrCmpLogicalW($s1, $s2)
        Return DllCall('shlwapi.dll', 'int', 'StrCmpLogicalW', 'wstr', $s1, 'wstr', $s2)[0]
EndFunc

Цитата:

Код:

Returns  0 if the strings are identical.
Returns  1 if the string pointed to by psz1 has a greater value than that pointed to by psz2.
Returns -1 if the string pointed to by psz1 has a lesser value than that pointed to by psz2.

1    w/s 5  ==> -1
1    w/s 5.0 ==> -1
1.0  w/s 5  ==> -1
1.0  w/s 5.0 ==> -1

10  w/s 5  ==> 1
10  w/s 5.0 ==> 1
10.0 w/s 5  ==> 1
10.0 w/s 5.0 ==> 1

10  w/s 10  ==> 0
10  w/s 10.0 ==> -1
10.0 w/s 10  ==> 1
10.0 w/s 10.0 ==> 0



Отдельное внимание на последнюю группу.

El Sanchez 23-01-2019 21:42 2854146

Цитата:

Цитата ErikPshat
огда получается, нужно добавить условие проверки ключа реестра под 7-ку. Правильно ли будет, если я сделаю так: »

ErikPshat, нет. Вы проверяете наличие PS 5.0, так что чтение из PowerShell\1 бессмысленно.
Цитата:

Цитата ErikPshat
Тогда при сравнении 10. < 5.1 разве система не поймёт, что нужно сравнивать цифры до точки, а потом после точки. »

ErikPshat, нет. Строковые литералы сравниваются посимвольно и сравнение закончится на первом символе, т.к. '1' < '5'.
Цитата:

Цитата Iska
10 w/s 10.0 ==> -1
10.0 w/s 10 ==> 1 »

Iska, хе-хе, об этом надо помнить. Кстати, StrCmpLogicalW еще и -2 возвращает, если какой-либо параметр пуст.

ErikPshat 24-01-2019 00:26 2854175

Iska, El Sanchez, ага, спасибо! Понятно, значит идёт посимвольное сравнение как текст, а не как цифры.

Да, я это на практике проверил, поменял в реестре версию PS, просто добавил 1 спереди, получилось 15.1 )))
Оказывается для 64-битки путь автоматически в реестре меняется на Wow6432Node:
Код:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\PowerShell\3\PowerShellEngine
И вывел через MsgBox версию, чтобы воочию убедиться верно ли возвращает:



Ну и далее пошло скачивание и установка, т.е. условие сравнения не выполнилось правильно. То есть, вы правы, сравнение идёт посимвольно и никакие точки, запятые, дроби тут не учитываются. Ещё нашёл функцию в Inno Preprocessor - DecodeVer и EncodeVer, но не понял, почему она не задействуется сразу, хотя вроде бы функция объявлена изначально по умолчанию.

Iska 24-01-2019 06:51 2854198

Цитата:

Цитата El Sanchez
Кстати, StrCmpLogicalW еще и -2 возвращает, если какой-либо параметр пуст. »

Что ж они, заразы, не пишут об том?

Но зато пишут не менее интересное:
Цитата:

Note Behavior of this function, and therefore the results it returns, can change from release to release. It should not be used for canonical sorting applications.
:lol:.


Цитата:

Цитата ErikPshat
Оказывается для 64-битки путь автоматически в реестре меняется на Wow6432Node: »

Да нет. Это только если Ваше приложение — x86 под x64 ОС. А так раздел HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell вполне себе существует под x64 ОС. У меня, например, под Windows 7 SP1 x64 он выглядит так:
Скрытый текст
Код:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell]
"DisablePromptToUpdateHelp"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1]
"Install"=dword:00000001
"PID"="89383-100-0001260-04309"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\0409]
"Install"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine]
"ApplicationBase"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0"
"PSCompatibleVersion"="1.0, 2.0"
"RuntimeVersion"="v2.0.50727"
"ConsoleHostAssemblyName"="Microsoft.PowerShell.ConsoleHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=msil"
"ConsoleHostModuleName"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\Microsoft.PowerShell.ConsoleHost.dll"
"PowerShellVersion"="2.0"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PSConfigurationProviders]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PSConfigurationProviders\Microsoft.PowerShell]
"ApplicationBase"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\"
"AssemblyName"="System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=msil"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell]
"Path"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"
"ExecutionPolicy"="RemoteSigned"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\ScriptedDiagnostics]
"ExecutionPolicy"="Unrestricted"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3]
"ConsoleHostShortcutTargetX86"=hex(2):25,00,50,00,72,00,6f,00,67,00,72,00,61,\
  00,6d,00,44,00,61,00,74,00,61,00,25,00,5c,00,4d,00,69,00,63,00,72,00,6f,00,\
  73,00,6f,00,66,00,74,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,5c,\
  00,53,00,74,00,61,00,72,00,74,00,20,00,4d,00,65,00,6e,00,75,00,5c,00,50,00,\
  72,00,6f,00,67,00,72,00,61,00,6d,00,73,00,5c,00,41,00,63,00,63,00,65,00,73,\
  00,73,00,6f,00,72,00,69,00,65,00,73,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,\
  77,00,73,00,20,00,50,00,6f,00,77,00,65,00,72,00,53,00,68,00,65,00,6c,00,6c,\
  00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,20,00,50,00,6f,00,77,00,\
  65,00,72,00,53,00,68,00,65,00,6c,00,6c,00,20,00,28,00,78,00,38,00,36,00,29,\
  00,2e,00,6c,00,6e,00,6b,00,00,00
"ConsoleHostShortcutTarget"=hex(2):25,00,50,00,72,00,6f,00,67,00,72,00,61,00,\
  6d,00,44,00,61,00,74,00,61,00,25,00,5c,00,4d,00,69,00,63,00,72,00,6f,00,73,\
  00,6f,00,66,00,74,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,5c,00,\
  53,00,74,00,61,00,72,00,74,00,20,00,4d,00,65,00,6e,00,75,00,5c,00,50,00,72,\
  00,6f,00,67,00,72,00,61,00,6d,00,73,00,5c,00,41,00,63,00,63,00,65,00,73,00,\
  73,00,6f,00,72,00,69,00,65,00,73,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,\
  00,73,00,20,00,50,00,6f,00,77,00,65,00,72,00,53,00,68,00,65,00,6c,00,6c,00,\
  5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,20,00,50,00,6f,00,77,00,65,\
  00,72,00,53,00,68,00,65,00,6c,00,6c,00,2e,00,6c,00,6e,00,6b,00,00,00
"Install"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\0409]
"Install"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine]
"ApplicationBase"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0"
"PSPluginWkrModuleName"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\system.management.automation.dll"
"PSCompatibleVersion"="1.0, 2.0, 3.0, 4.0, 5.0, 5.1"
"RuntimeVersion"="v4.0.30319"
"ConsoleHostAssemblyName"="Microsoft.PowerShell.ConsoleHost, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=msil"
"ConsoleHostModuleName"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\Microsoft.PowerShell.ConsoleHost.dll"
"PowerShellVersion"="5.1.14409.1005"


ErikPshat 24-01-2019 08:11 2854206

Iska, ну да, у меня то же самое. Просто я говорю о том, что по обычному пути поменял версию PowerShell, потом удивился, что как на скриншоте выше версия не изменилась. Сначала не понял, что за фокусы, подумал, может быть изменения не применились, перезагрузился, снова скомпилировал и опять показывает мне ответ 5.1, хотя я поменял на 15.1 ))) Потом вспомнил об этой ветке реестра, полез туда и там поменял, тогда оно и показалось во всей красе. Ну это я просто так написал, вдруг кому по ходу дела пригодится. Правда, чтобы сменить версию PS в реестре, пришлось себя владельцем ветки сделать, а потом и права выдать :D.

Iska 24-01-2019 19:23 2854353

Цитата:

Цитата ErikPshat
Правда, чтобы сменить версию PS в реестре, пришлось себя владельцем ветки сделать, а потом и права выдать :D. »

ErikPshat, обзаведитесь Far Manager'ом (и одним-двумя плагинами под него для работы с реестром) — и Вам никогда больше не придётся таким заниматься.

1specific 25-01-2019 14:05 2854525

Всем привет.
Ищу человека который отлично ладит с inno setup.
Задача: сделать стучалку на сервер при установке программы, чтобы можно было подсчитать количество уникальных установок (подсчет уже на уровне сервера и к задаче не имеет отношения). Более подробно писал об этом в этом посте.
Разумеется "не за спасибо".
Пишите в ЛС. Договоримся!

Iska 25-01-2019 17:59 2854583

Цитата:

Цитата 1specific
Ищу человека который отлично ладит с inno setup. »

El Sanchez, беритесь.

El Sanchez 25-01-2019 20:47 2854620


Цитата:

Цитата Iska
El Sanchez, беритесь. »

Iska, вменяемого ТЗ нет, показания меняются. Мне страшно. :)

Цитата:

Цитата 1specific
Задача: сделать стучалку на сервер при установке программы, чтобы можно было подсчитать количество уникальных установок (подсчет уже на уровне сервера и к задаче не имеет отношения) »

1specific, я уже спрашивал про "успешная установка", теперь пришла очередь спросить про "уникальных скачиваний" и "уникальных установок". Что считаем? Количество скачиваний <> количество установок. Скачивания считать бессмысленно, можно скачать установщик 1000 раз и ни разу ничего не поставить. Значит, установки. Чтобы посчитать количество уникальных установок, нужно дать определение уникальной установке. Считать ли установку уникальной, если делается второй раз в другую папку установки, нежели первая? А установка на другой физический диск уникальна?

TROY Diamond 25-01-2019 22:37 2854640

Цитата:

Цитата El Sanchez
вы не знаете размер будущих архивов, поэтому DiskSpaceLabel-у вам нечего предложить.

El Sanchez, а если я знаю, размер будущих архивов, хотя бы примерно, либо если нужен конкретный размер свободного места, например 15 ГБ, вполне хватит, это лучше чем 20-25, сколько хочет установщик с учётом распакованных архивов!

Цитата:

Цитата El Sanchez
разработчик руководствуется тупыми гайдами от Microsoft по разработке десктопных приложений, хотя, возможно, баг, но баг слишком уж долгоживущий в официальной версии, чтобы быть багом. Китайская версия данного поведения не имеет.

Так и какое же решение использовать китайскую версию или продолжать корректировать манифест у готового (скомпилированного) setup.exe?

Мне принципиально нужно чтобы установщик запускался и требовал права Администратора, а тех пользователей у которых нет прав Администратора или которые не хотят запускать с правами Админа установщик - обойдутся! (есть такие даже в 2019 году ещё) странно, - да, что программе которая копирует свои файлы в системные папки, и/или регистрирует какие-то библиотеки, делает записи в реестре - нужны права Администратора? )))

1specific 26-01-2019 00:49 2854659

Цитата:

Цитата El Sanchez
1specific, я уже спрашивал про "успешная установка", теперь пришла очередь спросить про "уникальных скачиваний" и "уникальных установок". Что считаем? Количество скачиваний <> количество установок. Скачивания считать бессмысленно, можно скачать установщик 1000 раз и ни разу ничего не поставить. Значит, установки. Чтобы посчитать количество уникальных установок, нужно дать определение уникальной установке. Считать ли установку уникальной, если делается второй раз в другую папку установки, нежели первая? А установка на другой физический диск уникальна? »

El Sanchez, Я уже косвенно отвечал в других постах на этот вопрос, в общем то уникальная установка = уникальный компьютер.
Разумеется скачивания и запуски установщика считать бессмысленно. Поэтому нужно считать только успешные установки. И после успешной установки выполнять сценарий отправки на сервер hwid пользователя (как идентификатор уникальной железяки = уникальной установки) и md5 установщика (как идентификатор реферала).
Знаю что md5 вариант не самый лучший. Но я исхожу из того, что просто не смогу физически создать и содержать для каждого партнера отдельный установщик, и обновлять его при необходимости. А вот md5 могу генерировать сервером и записывать в базу перед тем как отдать файл на скачивание, практически на лету.

Дополнительным преимуществом защиты от накрутки может быть отправка и других данных, например версия OS, локальная дата и время установки и т.п. - тут уже лучше с вами (исполнителем) пообщаться на эту тему лично.

Если будут еще вопросы - с радостью отвечу.

El Sanchez 26-01-2019 20:14 2854770

Цитата:

Цитата TROY Diamond
а если я знаю, размер будущих архивов, хотя бы примерно, либо если нужен конкретный размер свободного места, например 15 ГБ, вполне хватит, это лучше чем 20-25, сколько хочет установщик с учётом распакованных архивов! »

TROY Diamond, требуемый размер недоступен извне, повлиять на величину можно только в большую сторону.
Цитата:

Цитата TROY Diamond
Так и какое же решение использовать китайскую версию или продолжать корректировать манифест у готового (скомпилированного) setup.exe? »

TROY Diamond, вопрос и является ответом на него.
Цитата:

Цитата 1specific
И после успешной установки выполнять сценарий отправки на сервер hwid пользователя (как идентификатор уникальной железяки = уникальной установки) и md5 установщика (как идентификатор реферала). »

1specific, идентификатор реферала серверу известен и его можно сравнить с тем, что клиент вернет, а вот достоверность полученного HWID сервер не проверит. А еще будут качать, но ставить без Интернет, программа установлена, но сервер подтверждение не получит.

1specific 26-01-2019 22:39 2854797

Цитата:

Цитата El Sanchez
а вот достоверность полученного HWID сервер не проверит »

Верно. Но можно проверить его уникальность по существующим уже в базам. Это уже хоть что-то.
+ если сюда включить OS и возможно какие то другие уникальные данные (например дату установки винды, или какие то данные из реестра) то уже можно хоть какой то портрет пользователя получить.
Вариантов лучше я придумать не смог. Можете что-то предложить?

Цитата:

Цитата El Sanchez
А еще будут качать, но ставить без Интернет, программа установлена, но сервер подтверждение не получит. »

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

Iska 26-01-2019 23:09 2854806

Цитата:

Цитата El Sanchez
а вот достоверность полученного HWID сервер не проверит. »

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

Цитата:

Цитата 1specific
Софт без интернета сам по себе бесполезен, так что ставить его будут те у кого интернет есть. Но если даже кто то поставит без интернета, »

Ещё один плюс в пользу того, что «стучать» надо из самого приложения, а не из инсталляции.

1specific 26-01-2019 23:31 2854816

Цитата:

Цитата Iska
Придумать какую-нибудь простенькую контрольную сумму, которую включать в отсылаемые данные, и по которой сервер сможет судить о том, что переданные данные были сгенерированы программно, а не представляют собой случайную отсебятину для накруток. »

Спасибо. Гениально и просто)) Насколько я знаю это еще называют солью (например в паролях её добавляют:) Ну примерно так, в целом посыл понятен )

Цитата:

Цитата Iska
Ещё один плюс в пользу того, что «стучать» надо из самого приложения, а не из инсталляции. »

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

TROY Diamond 27-01-2019 00:27 2854819

Цитата:

Цитата El Sanchez
требуемый размер недоступен извне, повлиять на величину можно только в большую сторону.

1. El Sanchez А, как же например, в репаках игр указывают Для установки (распаковки) требуется столько-то места и если его меньше установку продолжить невозможно? Это значение ведь указывается вручную?

2. El Sanchez и Iska - НЕ знаю у кого спросить, подскажите, пожалуйста, где можно найти информацию про подписывания цифровой подписью своего дистрибутива? Видел такую реализацию в некоторых репаках сделанных в Inno Setip и аддонах на основе SFX-архивов и Inno Setup. Пусть это будет "НЕ серьезная" цифровая подпись - просто чтобы проверяла целостность и контрольные суммы файла.

Iska 27-01-2019 01:09 2854821

Цитата:

Цитата TROY Diamond
Это значение ведь указывается вручную? »

Нет. Эти значения рассчитываются автоматически при создании инсталлятора в зависимости от объёма результирующих файлов.

TROY Diamond 27-01-2019 02:10 2854828

Iska, нет это нечто иное сделанное с помощью скрипта, т.к. дальнейшая установка невозможна если места не хватает! А "значения рассчитываются автоматически" - только информирует.

P.S. По второму вопросу кто может помочь?

Iska 27-01-2019 05:48 2854833

Цитата:

Цитата TROY Diamond
дальнейшая установка невозможна если места не хватает! »

Естественно. Откуда может взяться возможность что-то записать на раздел, если на нём не осталось свободного места?!

El Sanchez 27-01-2019 11:03 2854846

Цитата:

Цитата 1specific
Но можно проверить его уникальность по существующим уже в базам. Это уже хоть что-то. »

Нет у вас баз.
Цитата:

Цитата 1specific
если сюда включить OS и возможно какие то другие уникальные данные (например дату установки винды, или какие то данные из реестра) то уже можно хоть какой то портрет пользователя получить. »

1specific, OS, MAC, IP, CPUID, BIOS - все не то. Более-менее подходит связка серийный номер MB + код производителя HDD, на котором система лежит. Только серверу от этого HWID ни горячо, ни холодно.
Цитата:

Цитата Iska
Придумать какую-нибудь простенькую контрольную сумму, которую включать в отсылаемые данные, и по которой сервер сможет судить о том, что переданные данные были сгенерированы программно, а не представляют собой случайную отсебятину для накруток. »

Iska, алгоритм должен быть известен и серверу и установщику, а скриптовый движок в Inno штука ненадежная - можно восстановить исходный код секции Code до такого вида, что будет давать идентичный байткод.

1specific 27-01-2019 11:17 2854849

Цитата:

Цитата El Sanchez
Нет у вас баз. »

В смысле нету? Речь о моей базе. HWID туда записывается. Если такой уже есть в базе значит не засчитывается утсановка.

В целом не понятно какие варианты тогда есть чтобы реализовать задумку на уровне inno setup?)

nik1967 27-01-2019 14:24 2854870

Цитата:

Цитата TROY Diamond
где можно найти информацию про подписывания цифровой подписью своего дистрибутива?»

Ответил в PM.

Требуемое место установки

#Define NeedSize 5000
;;Если у вас архивы FreeArc, то здесь укажите сколько необходимо места в Мб
;;Иначе просто закоментируйте строку
;;Автор: Shegorat

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Languages]
Name: ENG; MessagesFile: "compiler:Default.isl"
Name: RUS; MessagesFile: "compiler:Languages\Russian.isl"

[Files]
Source: {win}\help\*.hlp; DestDir: {app}\Files; Flags: external

[CustomMessages]
RUS.FreeSpace=Доступно места на диске:
RUS.NeedSpace=Требуется места на диске:
RUS.MB=Мб
RUS.GB=Гб
RUS.TB=Тб
ENG.FreeSpace=Free space on disk:
ENG.NeedSpace=Need space on disk:
ENG.MB=Mb
ENG.GB=Gb
ENG.TB=Tb

[code]
var
NeedSpaceLabel,FreeSpaceLabel: TLabel;
FreeMB, TotalMB: Cardinal;
SizeStr: String;
SizeInt: Integer;
SymbolNumber: Integer;

function GetSize(): Integer;
begin
SizeStr:= WizardForm.DiskSpaceLabel.Caption;
for SymbolNumber:= 97 to 122 do begin
while (Pos(Chr(SymbolNumber), SizeStr) > 0) do Delete(SizeStr, Pos(Chr(SymbolNumber), SizeStr),1);
while (Pos(AnsiUppercase(Chr(SymbolNumber)), SizeStr) > 0) do Delete(SizeStr, Pos(AnsiUppercase(Chr(SymbolNumber)), SizeStr),1);
end;
for SymbolNumber:= 192 to 255 do begin
while (Pos(Chr(SymbolNumber), SizeStr) > 0) do Delete(SizeStr, Pos(Chr(SymbolNumber), SizeStr),1);
end;
while (Pos('.', SizeStr) > 0) do Delete(SizeStr, Pos('.', SizeStr), 1);
Delete(SizeStr, Pos(',', SizeStr), 5)
Result:= StrToInt(Trim(SizeStr));
end;

function CompareNum(FirstNum, SecondNum: Integer): Boolean;
begin
if FirstNum < SecondNum then Result:= False else Result:= True;
end;

function NumToStr(Float: Extended): String;
begin
Result:= Format('%.2f', [Float]);
StringChange(Result, ',', '.');
while ( Pos('.', Result) > 0 ) and ( (Result[Length(Result)] = '0') or (Result[Length(Result)] = '.') ) do
SetLength(Result, Length(Result) - 1);
end;

function MbOrTb(Float: Extended): String;
begin
if
Float < 1024 then Result:= NumToStr(Float)+ExpandConstant(' {cm:MB}') else
if
Float/1024 < 1024 then Result:= NumToStr(Float/1024)+ExpandConstant(' {cm:GB}') else
Result:= NumToStr(Float/(1024*1024))+ExpandConstant(' {cm:TB}');
end;

procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path:= ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
FreeSpaceLabel.Caption:= ExpandConstant('{cm:FreeSpace} ') + MbOrTb(FreeMB);
NeedSpaceLabel.Caption:= ExpandConstant('{cm:NeedSpace} ') + MbOrTb(SizeInt);
if WizardForm.CurPageID = wpSelectDir then begin
WizardForm.NextButton.Enabled:= CompareNum(FreeMB, SizeInt);
end;
end;

procedure InitializeWizard();
begin
WizardForm.DiskSpaceLabel.Hide;
#ifdef NeedSize
SizeInt:= {#NeedSize}
#else
SizeInt:= GetSize;
#endif

NeedSpaceLabel:= TLabel.Create(WizardForm);
NeedSpaceLabel.SetBounds(ScaleX(0), ScaleY(198), ScaleX(209), ScaleY(13))
NeedSpaceLabel.Parent:= WizardForm.SelectDirPage;
NeedSpaceLabel.Transparent:= true;

FreeSpaceLabel:= TLabel.Create(WizardForm);
FreeSpaceLabel.SetBounds(ScaleX(0), ScaleY(216), ScaleX(209), ScaleY(13))
FreeSpaceLabel.Parent:= WizardForm.SelectDirPage;
FreeSpaceLabel.Transparent:= true;

WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectDir then GetFreeSpaceCaption(nil);
end;

Iska 27-01-2019 14:50 2854879

Цитата:

Цитата El Sanchez
Iska, алгоритм должен быть известен и серверу и установщику »

Конечно. Иначе — какой смысл?!

Цитата:

Цитата El Sanchez
а скриптовый движок в Inno штука ненадежная - можно восстановить исходный код секции Code до такого вида, что будет давать идентичный байткод. »

Ото ж. Третий довод в пользу того, что:
Цитата:

Цитата Iska
…«стучать» надо из самого приложения, а не из инсталляции. »

:).

1specific 27-01-2019 18:49 2854923

Цитата:

Цитата Iska
Ото ж. Третий довод в пользу того, что:
Цитата Iska:
…«стучать» надо из самого приложения, а не из инсталляции. » »

Возможности такой нет.
Значит делаем как можем.
Кто готов - пожалуйста, буду рад обсудить детали и приступить.
На данный момент нужно хоть какое то решение, дальше уже можно будет переделывать и улучшать.

TROY Diamond 27-01-2019 19:36 2854933

Цитата:

Цитата Iska
Естественно. Откуда может взяться возможность что-то записать на раздел, если на нём не осталось свободного места?!

Iska, почему-то nik1967 - понял о чём речь и как сделать?

Iska 27-01-2019 20:23 2854943

TROY Diamond, значит, я был не прав. Однако сие никак не поможет изменить ситуацию, если места действительно не хватает.

El Sanchez 27-01-2019 20:41 2854946

Цитата:

Цитата 1specific
Значит делаем как можем. »

1specific, можно ограничиться серверной частью примерно так:
1. Компилируется мастер-копия установщика.
2. Клиент по партнерской ссылке запрашивает файл.
3. Сервер делает копию мастер-файла, генерирует GUID и записывает его в конец копии.
4. Копия отдается клиенту.
5. Если ошибок при приеме-передаче не было, GUID заносится в таблицу партнера в БД.
6. Сервер удаляет копию.
7. Установщик в конце установки считывает GUID и посылает его на сервер GET-запросом в параметрах.
8. Сервер проверяет GUID в БД. Если есть, то гут, партнеру +1, GUID удаляется из БД. Если нет, то попытка накрутки, баловство и прочие ништяки, с которыми скоро придется познакомиться.
Цитата:

Цитата TROY Diamond
почему-то nik1967 - понял о чём речь и как сделать »

TROY Diamond, а толку? Установщик посчитает 15 ГБ, а вы отобразите 10 ГБ. Если у юзера будет свободного места от 10 до 15 ГБ, то он увидит ругань, что нет места, а в ваш адрес полетит ругань уже юзерскыя, мол, "у миня 14 гигов ессть еще, какого оно 10 пишит тада?" (орфография пользователя сохранена)

1specific 27-01-2019 23:17 2854969

Цитата:

Цитата El Sanchez
Компилируется мастер-копия установщика. »

Каким образом сделать это на php? Я не встречал такого компилятора inno setup для php (а веб часть будет на php)

Цитата:

Цитата El Sanchez
Сервер делает копию мастер-файла, генерирует GUID и записывает его в конец копии. »

Какие в этом преимущества? md5 всё-ровно поменяется для каждой копии.


По сути вся схема реализации уже понятна.
От инсталлятора просто требуется отправить нужные данные на сервер и всё (+ возможно добавление контрольной суммы к каким то данным) . Это небольшой кусок кода. Возьметесь?

TROY Diamond 27-01-2019 23:51 2854971

Цитата:

Цитата El Sanchez
а толку? Установщик посчитает 15 ГБ, а вы отобразите 10 ГБ. Если у юзера будет свободного места от 10 до 15 ГБ, то он увидит ругань, что нет места, а в ваш адрес полетит ругань уже юзерскыя, мол, "у миня 14 гигов ессть еще, какого оно 10 пишит тада?" (орфография пользователя сохранена)

El Sanchez, поэтому я вас ОЧЕНЬ и просил такой скрипт, который будет удалять сразу все временные папки в процессе установки по её ходу, а НЕ по её окончании, как это делается в большинстве репаков игр!

Например, один архив (УСЛОВНО) весит в упакованном виде 700 МБ, распакованная папка, которая будет скопирована в процессе установки, будет занимать на ЖД 1,5 ГБ (условно), через 1-2 минуты ЭТА ПАПКА, будет упакована в архив и СРАЖУ ЖЕ УДАЛЕНА, останется только 700 МБ архив на ЖД пользователя, начнётся копирование следующей папки, которая также упакуется в архив и удалится. Поэтому 15 ГБ, с запасом хватит, а если бы папки НЕ удалялись бы сразу же, то тогда нужно было бы как раз 30 ГБ места на ЖД.

Игра в конечном итоге (в готовом к "употреблению" виде), по окончании установки, занимает на ЖД - всего 12 ГБ (условно) - я хочу задать 15 ГБ, с запасом, вместо 20-25 ГБ, сколько хочет Inno Setip из расчёта скомпилированного...

El Sanchez, мы друг друга правильно поняли? Теперь когда всё ясно можете, помочь?

El Sanchez 28-01-2019 13:12 2855011

Цитата:

Цитата 1specific
Каким образом сделать это на php? Я не встречал такого компилятора inno setup для php (а веб часть будет на php) »

1specific, мастер-копия - это то, что вы в Inno Setup сделаете и на свой сервер закинете. Измененные копии этого файла идут клиентам.
Цитата:

Цитата 1specific
Какие в этом преимущества? md5 всё-ровно поменяется для каждой копии. »

1specific, клиенту перед отправкой подтверждения установки необходимо будет эту MD5 посчитать, а это небыстрая операция, если файл большой.
Цитата:

Цитата 1specific
От инсталлятора просто требуется отправить нужные данные на сервер и всё (+ возможно добавление контрольной суммы к каким то данным) . Это небольшой кусок кода. »

1specific, отправляйте:
Скрытый текст

Код:

[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
  SXH_PROXY_SET_PROXY = 2;

procedure SendID;
var
  XMLHTTP: Variant;
  ProxyEnable: Cardinal;
  ProxyServer, ProxyOverride: string;
  Data: AnsiString;
begin
  XMLHTTP := CreateOleObject('MSXML2.ServerXMLHTTP');
  try
    if RegQueryDWordValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Internet Settings', 'ProxyEnable', ProxyEnable) and (ProxyEnable = 1) then
    begin
      if RegQueryStringValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Internet Settings', 'ProxyServer', ProxyServer) and
        RegQueryStringValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Internet Settings', 'ProxyOverride', ProxyOverride) then
          XMLHTTP.setProxy(SXH_PROXY_SET_PROXY, ProxyServer, ProxyOverride);
    end;
    XMLHTTP.open('POST', 'https://httpbin.org/post'{'http://site.ru/success.php'}, False);
    XMLHTTP.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    Data := 'id=12345678'// custom data
    XMLHTTP.send(Data);
    Log(Format('Error Code: %s %s', [XMLHTTP.status, XMLHTTP.statusText]));
  except
    Log(GetExceptionMessage);
  finally
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssPostInstall: SendID;
  end;
end;


Цитата:

Цитата TROY Diamond
один архив (УСЛОВНО) весит в упакованном виде 700 МБ, распакованная папка, которая будет скопирована в процессе установки, будет занимать на ЖД 1,5 ГБ (условно), через 1-2 минуты ЭТА ПАПКА, будет упакована в архив и СРАЖУ ЖЕ УДАЛЕНА, останется только 700 МБ архив на ЖД пользователя, начнётся копирование следующей папки, которая также упакуется в архив и удалится. Поэтому 15 ГБ, с запасом хватит, а если бы папки НЕ удалялись бы сразу же, то тогда нужно было бы как раз 30 ГБ места на ЖД. »

TROY Diamond, я это и сделал.
Цитата:

Цитата TROY Diamond
Игра в конечном итоге (в готовом к "употреблению" виде), по окончании установки, занимает на ЖД - всего 12 ГБ (условно) - я хочу задать 15 ГБ, с запасом, вместо 20-25 ГБ, сколько хочет Inno Setip из расчёта скомпилированного »

TROY Diamond, уменьшить требуемый размер 20-25 ГБ вы не сможете, величина рассчитывается в run-time и зависит от выбранных компонентов (если есть). Можно только увеличить через директиву ExtraDiskSpaceRequired. На знак "минус" в ее значении Inno ругается, отрицательное число в 16-тиричном представлении тоже не фурычит.

TROY Diamond 28-01-2019 21:12 2855079

El Sanchez и что никак не решаемо?

GrezeeBal 01-02-2019 19:32 2855790

Привет! Сразу скажу, что очень плохо разбираюсь в коде.

В общем, делаю установщик модификации для игры GTA и при установке данной игры в реестре создаётся путь к файлу gta_sa.exe(исполняемый файл). Я указываю в установщик путь к данному значению в реестр, чтобы в установщике автоматически указалась папка с игрой в качестве пути, но так как значение в реестре ведет прямо к exe файлу - он указывается в пути по умолчанию.

Вопрос: как исключить этот файл из значения, чтобы указывалась только папка с игрой?





Код:

DefaultDirName={reg:HKCU\Software\SAMP,gta_sa_exe|}

El Sanchez 01-02-2019 21:39 2855820

Цитата:

Цитата GrezeeBal
Вопрос: как исключить этот файл из значения, чтобы указывалась только папка с игрой? »

GrezeeBal,
Код:

DefaultDirName={code:ExtractFileDir|{reg:HKCU\Software\SAMP,gta_sa_exe|}}


GrezeeBal 01-02-2019 22:04 2855825

Цитата:

Цитата El Sanchez
DefaultDirName={code:ExtractFileDir|{reg:HKCU\Software\SAMP,gta_sa_exe|}} »

Спасибо большое!

OldGamer 12-02-2019 15:15 2857509

Здравствуйте!

Помогите, пожалуйста, разобраться с функцией AnimateWindow+прозрачностью окна при перемещении.

Проблема в следующем:

1) Плавное закрытие инсталлятора при выходе - работает (или работало) на отлично!

2) Добавил прозрачность окна при перемещении - работает, но плавное закрытие окна инсталлятора при нажатии на кнопку "Отмена" работать перестаёт.

Заранее Большое Спасибо!!!

Скрипт:

Код:

const
  WM_NCLBUTTONDOWN = $00A1;
  HTCAPTION = 2;
  WM_NCMOUSEMOVE = $00A0;
  GWL_EXSTYLE = -20;
  WS_EX_LAYERED = $80000;
  LWA_ALPHA = 2;
  TransparentPercent = 50;

var
  ComponentPage : TWizardPage;
  InstallGroupBox : TNewGroupBox;
  Installer    : TNewRadioButton;
  Portable      : TNewRadioButton;

function InstallerCheck: Boolean;
 begin
  Result := Installer.Checked;
 end;

function PortableCheck: Boolean;
 begin
  Result := Portable.Checked;
 end;

type TGUID          = record Data1: Cardinal; Data2, Data3: Word; Data4: array [0..8] of Char; end;

const PlayTask    = 0;
        SupportTask = 1;
var GameuxGUID: TGUID;

function GenerateGUID(var GUID: TGUID): Cardinal; external 'GenerateGUID@files:GameuxInstallHelper.dll stdcall setuponly';
function AddToGameExplorer(Binary: String; Path: String; InstallType: Integer; var GUID: TGUID): Cardinal; external 'AddToGameExplorerA@files:GameuxInstallHelper.dll stdcall setuponly';
function CreateTask(InstallType: Integer; var GUID: TGUID; TaskType: Integer; TaskNumber: Integer; TaskName: String; Binary: String; Parameters: String): Cardinal; external 'CreateTaskA@files:GameuxInstallHelper.dll stdcall setuponly';
function RetrieveGUIDForApplication(Binary: String; var GUID: TGUID): Cardinal; external 'RetrieveGUIDForApplicationA@{localappdata}\GameuxInstallHelper.dll stdcall uninstallonly';
function RemoveFromGameExplorer(var GUID: TGUID): Cardinal; external 'RemoveFromGameExplorer@{localappdata}\GameuxInstallHelper.dll stdcall uninstallonly';
function RemoveTasks(var GUID: TGUID): Cardinal; external 'RemoveTasks@{localappdata}\GameuxInstallHelper.dll stdcall uninstallonly';
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall';

function IntToHex(Int: Cardinal; Digits: Integer): String; var i, Digit: Integer; ch: Byte;
begin
  result:='';
  for i:=0 to Digits-1 do
    begin
    digit:=Int mod 16;
    Int:=Int div 16;
    if digit<0 then
      digit:=digit+16;
      ch:=Ord('0')+digit;
        if digit>9 then
        ch:=ch+7;
        result:=chr(ch)+result;
    end;
end;

function GetGUID(GGUID: TGUID): String; var i: Integer;
begin
  result:='{'+IntToHex(GGUID.Data1, 8)+'-'+IntToHex(GGUID.Data2, 4)+'-'+IntToHex(GGUID.Data3, 4)+'-'+IntToHex(Ord(GGUID.Data4[0]), 2)+IntToHex(Ord(GGUID.Data4[1]), 2)+'-';
  for i:=2 to 7 do result:=result+IntToHex(Ord(GGUID.Data4[i]), 2); result:=result+'}';
end;

procedure GDFInstall(Binary, MainExe: String);
begin
  GenerateGUID(GameuxGUID);
  AddToGameExplorer(ExpandConstant(Binary), ExpandConstant('{app}'), 3, GameuxGUID);

  CreateTask(3, GameuxGUID, PlayTask, 0, 'Play', ExpandConstant(MainExe), '');
end;

procedure win7fix;
  var regGDF: Cardinal;
  var GUXPath: string;
begin
GUXPath := 'Software\Microsoft\Windows\CurrentVersion\GameUX\Games\' + GetGUID(GameuxGUID);
  if isWin64 then
  begin
    if RegQueryDWordValue(HKLM64, GUXPath, 'IsSigned', regGDF) then
      if regGDF=0 then
        if RegDeleteValue(HKLM64, GUXPath, 'IsSigned') then
          RegWriteDWordValue(HKLM64, GUXPath, 'IsSigned', 1);
  end
  else
  begin
    if RegQueryDWordValue(HKLM, GUXPath, 'IsSigned', regGDF) then
      if regGDF=0 then
        if RegDeleteValue(HKLM, GUXPath, 'IsSigned') then
          RegWriteDWordValue(HKLM, GUXPath, 'IsSigned', 1);
  end;
end;

type
  TPBProc = function (h:hWnd;Msg,wParam,lParam:Longint):Longint;
 
var
  TimeLeftLabel : TLabel;

  PBOldProc    : Longint;
  eTime, sTime  : DWORD;

var
  BASS_Initialized: Boolean;

const
  AW_BLEND = $00080000;
  AW_HIDE = $00010000;
const
    LOAD_LIBRARY_AS_DATAFILE = $2;

#define A = (Defined UNICODE) ? "W" : "A"

function AnimateWindow(hWnd: HWND; dwTime: DWORD; dwFlags: DWORD): Boolean;
external 'AnimateWindow@user32 stdcall';
function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';
function SHGetNewLinkInfo(pszLinkTo, pszDir: String; var pszName: Char; var pfMustCopy: Longint; uFlags: UINT): BOOL; external 'SHGetNewLinkInfo{#A}@shell32.dll stdcall';
function PinToTaskbar(const szFilename: String; IsPin: Boolean): Boolean;

var
    hInst: THandle;
    buf: array [0..255] of Char;
    i, res: Integer;
    strLnk, strVerb: String;
    objShell, colVerbs: Variant;
begin
    Result := False;
    if (GetWindowsVersion < $06010000) or not FileExists(szFilename) then Exit; { below Windows 7 }

    { String resources }
    if IsPin then
    begin
        if SHGetNewLinkInfo(szFilename, ExpandConstant('{tmp}'), buf[0], res, 0) then
        begin
            while buf[Length(strLnk)] <> #0 do Insert(buf[Length(strLnk)], strLnk, Length(strLnk)+1);
            if FileExists(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName(strLnk)) then Exit;
        end;
        res := 5386;        { Pin to Tas&kbar }
    end else res := 5387;  { Unpin from Tas&kbar }

    { Load string resource }
    hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
    if hInst <> 0 then
    try
        for i := 0 to LoadString(hInst, res, buf[0], 255)-1 do Insert(buf[i], strVerb, i+1);
        try
            objShell := CreateOleObject('Shell.Application');
            colVerbs := objShell.Namespace(ExtractFileDir(szFilename)).ParseName(ExtractFileName(szFilename)).Verbs;
            for i := 1 to colVerbs.Count do if CompareText(colVerbs.Item[i].Name, strVerb) = 0 then
            begin
                colVerbs.Item[i].DoIt;
                Result := True;
                Break;
            end;
        except
            Exit;
        end;
    finally
        FreeDLL(hInst);
    end;
end;

type
    TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);
var
  PercentsTimer: LongWord;
  PercentsLabel: TLabel;

function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall delayload';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function SetLayeredWindowAttributes(hwnd: HWND; crKey: TColor; bAlpha: BYTE; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function CallBackProc(P:TPBProc;ParamCount:integer):LongWord; external 'wrapcallbackaddr@files:CallbackCtrl.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';

procedure EnableTransparencyOnDrag(var Msg: TMsg; var Handled: Boolean);
begin
  if (Msg.message = WM_NCLBUTTONDOWN) and (Msg.wParam = HTCAPTION) then
  begin
    SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
    SetLayeredWindowAttributes(WizardForm.Handle, 0, (255 * TransparentPercent) / 100, LWA_ALPHA);
    Handled := False;
  end;
  if  Msg.message = WM_NCMOUSEMOVE then
  begin
    SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
    SetLayeredWindowAttributes(WizardForm.Handle, 0, 255, LWA_ALPHA);
    Handled := False;
  end;
end;

function LongintToStringTime(t:Longint):string;
var
  h,m,s:integer;
begin
  h:=t div 3600;
  t:=t-h*3600;
  m:=t div 60;
  s:=t-m*60;
  Result:='';
  if h>0 then Result:=Result+IntToStr(h)+' ÷. ';
  if (m>0) or (h>0) then Result:=Result+IntToStr(m)+' ìèí. ';
  if (m>0) or (h>0) or (s>0) then Result:=Result+IntToStr(s)+' ñåê.';
end;

function PBProc(h:hWnd;Msg,wParam,lParam:Longint):Longint;
var
  lt:Longint;
  dt,at,pr,i1,i2:Extended;
  p:string;
  tc:DWORD;
begin
  Result:=CallWindowProc(PBOldProc,h,Msg,wParam,lParam);
  if (Msg=$402) and (WizardForm.ProgressGauge.Position>WizardForm.ProgressGauge.Min) then begin
    i1:=WizardForm.ProgressGauge.Position-WizardForm.ProgressGauge.Min;
    i2:=WizardForm.ProgressGauge.Max-WizardForm.ProgressGauge.Min;

    tc:=GetTickCount;
    if (tc-eTime)>=1000 then begin //???????????? ????? ?????????? ?? ????? ????????? ?? ????, ??? ??? ? 1 ???????
      dt:=(tc-sTime)/1000;
      at:=i2*dt/i1;
      lt:=Round(at-dt)
      TimeLeftLabel.Caption:='Îñòàëîñü - '+LongintToStringTime(lt);
      eTime:=tc;
    end;

    pr:=i1*100/i2;
    p:=' - ['+Format('%f',[pr])+'%]';
    StringChange(p,',','.');
  end;
end;

procedure AllCancel;
begin
  SetWindowLong(WizardForm.ProgressGauge.Handle,-4,PBOldProc);
  TimeLeftLabel.Free;
end;

function InitializeSetup:boolean;
begin
ExtractTemporaryFile('steam.cjstyles');
  if not FileExists(ExpandConstant('{tmp}\CallbackCtrl.dll')) then ExtractTemporaryFile('CallbackCtrl.dll');
  LoadSkin(ExpandConstant('{tmp}')+'\steam.cjstyles', '');
  Result:=True;
end;

Function NumToStr(Float: Extended): String;
Begin
    Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
    while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
        SetLength(Result, Length(Result)-1);
End;

Procedure PercentsProc(h, msg, idevent, dwTime: Longword);
Begin
  with WizardForm.ProgressGauge do
  begin
    PercentsLabel.Caption:= 'Âûïîëíåíî ' + NumToStr((Position*100)/Max) + ' %';
  end;
End;

const
  Indent=25;

function ssInitialize(hParent:HWND;ssTimeShow:integer;FadeOut:boolean;StretchMode:integer;BkgColor:DWORD):boolean; external 'ssInitialize@files:isgsg.dll stdcall delayload';
procedure ssDeInitialize; external 'ssDeInitialize@files:isgsg.dll stdcall delayload';
procedure ssSetBkgImage(FileName:PChar); external 'ssSetBkgImage@files:isgsg.dll stdcall delayload';
procedure ssAddImage(FileName:PChar); external 'ssAddImage@files:isgsg.dll stdcall delayload';
procedure ssStartShow; external 'ssStartShow@files:isgsg.dll stdcall delayload';
procedure ssStopShow; external 'ssStopShow@files:isgsg.dll stdcall delayload';
procedure ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
function GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';

procedure RunListClickCheck(Sender: TObject);
var
  i:integer;
begin
  if WizardForm.RunList.Checked[WizardForm.RunList.ItemIndex] then begin
    for i:=0 to WizardForm.RunList.Items.Count-1 do
      WizardForm.RunList.Checked[i]:=False;
    WizardForm.RunList.Checked[WizardForm.RunList.ItemIndex]:=True;
  end;
end;

procedure InitializeWizard();
begin
Application.OnMessage:=@EnableTransparencyOnDrag;
begin
  ComponentPage := CreateCustomPage(wpInfoBefore, 'Âûáîð âåðñèè èãðû', 'Ïîæàëóéñòà, ñäåëàéòå âûáîð ïåðåä òåì, êàê ïðîäîëæèòü.');

  { InstallGroupBox }
InstallGroupBox := TNewGroupBox.Create(WizardForm);
with InstallGroupBox do
begin
Parent := ComponentPage.Surface;
SetBounds(ScaleX(0),ScaleY(0),ScaleX(63),ScaleY(70));
Caption := 'Version:';
end;

  { Installer }
  Installer := TNewRadioButton.Create(WizardForm);
  with Installer do
  begin
    Parent := ComponentPage.Surface;
    SetBounds(ScaleX(9),ScaleY(19),ScaleX(45),ScaleY(17));
    Caption := '32-bit';
  end;

  { Portable }
  Portable := TNewRadioButton.Create(WizardForm);
  with Portable do
  begin
    Parent := ComponentPage.Surface;
    SetBounds(ScaleX(9),ScaleY(43),ScaleX(45),ScaleY(17));
    Caption := '64-bit';
    Checked := True;
end;
begin
  ExtractTemporaryFile('Bass.dll');
  ExtractTemporaryFile('botva2.dll');
  ExtractTemporaryFile('volmax.png');
  ExtractTemporaryFile('volmin.png');
  ExtractTemporaryFile('volpb.png');
  ExtractTemporaryFile('voldote.png');
  ExtractTemporaryFile('Music.mp3');
  ExtractTemporaryFile('MusicButton.png');
  ExtractTemporaryFile('EG.png');
 
  ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\EG.png',5000,4000,3000,0,255,False,$FFFFFF,10);
  ssInitialize(GetWindowLong(MainForm.Handle,-8),18,True,2,$FF000000);

  WizardForm.RunList.OnClickCheck:=@RunListClickCheck;
  BASS_Init('{tmp}\Music.mp3')
  BASS_CreateMediaPlayer(WizardForm, '{tmp}\volmax.png', '{tmp}\volmin.png', '{tmp}\volpb.png', '{tmp}\voldote.png', 20, 325)
  BASS_Initialized := True;
  ExtractTemporaryFile('0.png');
  ssSetBkgImage(ExpandConstant('{tmp}')+'\0.png');
  WizardForm.TypesCombo.ItemIndex:=0;
 
  PercentsLabel:= TLabel.Create(WizardForm);
  with PercentsLabel do
  begin
    Left:= WizardForm.ProgressGauge.Left;
    Top:= WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10);
    Width:= WizardForm.StatusLabel.Width;
    Height:= WizardForm.StatusLabel.Height;
    AutoSize:= False;
    Transparent := True;
    Parent:= WizardForm.InstallingPage;
  end;
end;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var Version: TWindowsVersion;
begin
  GetWindowsVersionEx(Version);
  if (CurStep = ssPostInstall) and Version.NTPlatform and (Version.Major > 5) then begin
    GDFInstall('{#GDFBinary}', '{#GDFExe}');
      win7fix;
  end;
begin
  case CurStep of
    ssInstall: begin
      TimeLeftLabel:=TLabel.Create(nil);
      with TimeLeftLabel do begin
        Parent:=WizardForm.InstallingPage;
        AutoSize:=True;
        SetBounds(WizardForm.ProgressGauge.Left + ScaleX(250),WizardForm.ProgressGauge.Top + ScaleY(30),ScaleY(80),ScaleY(21));
      end;
sTime:=GetTickCount;
      eTime:=sTime;

      PBOldProc:=SetWindowLong(WizardForm.ProgressGauge.Handle,-4,CallBackProc(@PBProc,4));
    end;
    ssPostInstall: AllCancel;
  end;
begin
  if CurStep=ssInstall then begin
    ExtractTemporaryFile('1.png');
    ssAddImage(ExpandConstant('{tmp}')+'\1.png');
    ExtractTemporaryFile('2.png');
    ssAddImage(ExpandConstant('{tmp}')+'\2.png');
    ExtractTemporaryFile('3.png');
    ssAddImage(ExpandConstant('{tmp}')+'\3.png');
    ExtractTemporaryFile('4.png');
    ssAddImage(ExpandConstant('{tmp}')+'\4.png');
    ExtractTemporaryFile('5.png');
    ssAddImage(ExpandConstant('{tmp}')+'\5.png');
    ExtractTemporaryFile('6.png');
    ssAddImage(ExpandConstant('{tmp}')+'\6.png');
    ExtractTemporaryFile('7.png');
    ssAddImage(ExpandConstant('{tmp}')+'\7.png');;
    ExtractTemporaryFile('8.png');
    ssAddImage(ExpandConstant('{tmp}')+'\8.png');
    ExtractTemporaryFile('9.png');
    ssAddImage(ExpandConstant('{tmp}')+'\9.png');
    ExtractTemporaryFile('10.png');
    ssAddImage(ExpandConstant('{tmp}')+'\10.png');
PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));
    ExtractTemporaryFile('0.png');
    ssAddImage(ExpandConstant('{tmp}')+'\0.png');
    ssStartShow;
  end;
  if CurStep=ssPostInstall then ssStopShow;
end;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
    wpFinished: end
  if IsTaskSelected('Pin') then
        PinToTaskbar(ExpandConstant('{app}\Eternal Darkness-Sanitys Requiem.exe'), True);
  if CurPageID=wpInstalling then begin;
    WizardForm.MainPanel.Visible:=False;
    WizardForm.Bevel1.Visible:=False;
    WizardForm.Width:=ScaleX(395);
    WizardForm.Height:=ScaleY(142);
    WizardForm.Left:=ScaleX(GetSystemMetrics(0)-WizardForm.Width-Indent);
    WizardForm.Top:=ScaleY(GetSystemMetrics(1)-WizardForm.Height-Indent);
    WizardForm.InnerNotebook.Left:=ScaleX(10);
    WizardForm.InnerNotebook.Top:=ScaleY(10);
    WizardForm.InnerNotebook.Width:=ScaleX(370);
    WizardForm.StatusLabel.Left:=ScaleX(0);
    WizardForm.StatusLabel.Top:=ScaleY(0);
    WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
    WizardForm.FileNameLabel.Left:=ScaleX(0);
    WizardForm.FileNameLabel.Top:=ScaleY(20);
    WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
    WizardForm.ProgressGauge.Top:=ScaleY(40);
    WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
    WizardForm.CancelButton.Left:=ScaleX(154);
    WizardForm.CancelButton.Top:=ScaleY(80);
  end;
  if (CurPageID=wpFinished) or (CurPageID=wpInfoAfter) then begin
    WizardForm.RunList.Checked[0]:=True;
    if WizardForm.Width<>502 then begin
      WizardForm.Visible:=False;
      WizardForm.Width:=ScaleX(502);
      WizardForm.Height:=ScaleY(392);
      WizardForm.Left:=(GetSystemMetrics(0)-WizardForm.Width) div 2;
      WizardForm.Top:=(GetSystemMetrics(1)-WizardForm.Height) div 2;
      WizardForm.MainPanel.Visible:=True;
      WizardForm.Bevel1.Visible:=True;
      WizardForm.InnerNotebook.Left:=ScaleX(40);
      WizardForm.InnerNotebook.Top:=ScaleY(72);
      WizardForm.InnerNotebook.Width:=ScaleX(417);
      WizardForm.Visible:=True;
    end;
  end;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  Result := True;
  if CurPageID=wpFinished then
  begin
    if WizardForm.RunList.Checked[0] then
    Result := True;
  end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_OKCANCEL) = IDOK then
  begin
    Confirm := False;
    AnimateWindow(WizardForm.Handle, 2500, AW_BLEND or AW_HIDE);
    Cancel := True;
  end else
  Cancel := False;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
Binary: String;
GUID: TGUID;
begin
if CurUninstallStep=usUninstall then
begin
Binary:=ExpandConstant('{#GDFBinary}');
RetrieveGUIDForApplication(Binary, GUID);
RemoveFromGameExplorer(GUID);
RemoveTasks(GUID);
UnloadDll(ExpandConstant('{localappdata}\GameuxInstallHelper.dll'));
end;
  begin
    if (CurUninstallStep=usUninstall) then
      begin
    case CurUninstallStep of
      usUninstall: begin
        PinToTaskbar(ExpandConstant('{app}\Eternal Darkness-Sanitys Requiem.exe'), False);
      end;
  end;
end;
end;
end;

procedure DeinitializeSetup();
begin
if BASS_Initialized then
begin
KillTimer(0, PercentsTimer);
UnloadSkin();
  ssDeInitialize;
  BASS_DeInit;
    gdipShutdown
end;
end;


pollipen 19-02-2019 09:10 2858715

парни подскажите, как сделать что бы после установки в тихом режиме с ключом (/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-) программа не запускалась?
потому что там стоит галачка
Скрытый текст

El Sanchez 19-02-2019 09:51 2858722

Цитата:

Цитата pollipen
как сделать что бы после установки в тихом режиме с ключом (/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-) программа не запускалась?
потому что там стоит галачка »

pollipen, в скрипте флаг skipifsilent выставлен, запускаться не должна.

pollipen 19-02-2019 10:20 2858732

нет всё равно запуск идёт программы

mariolast 24-02-2019 22:57 2859741

Есть пример скрипта для обработки своих параметров при установке через /silent?
Скажем /1 задает одни умолчальные параметры чекбоксов, /2 другие.
Давно уже не занимался Inno

FiRmaN 01-03-2019 19:07 2860739

Всем привет. Кто может помочь, как снять обводку с кнопок. В скриптинге нуб:)

Вот архив с скриптом. http://rgho.st/6hwhMlbnC

Iska 01-03-2019 19:31 2860749

FiRmaN, значит, пора учиться.

FiRmaN 01-03-2019 20:06 2860756

Цитата:

Цитата Iska
FiRmaN, значит, пора учиться. »

Есть материал где можно прочесть как убрать эту обводку?

Nordek 02-03-2019 11:36 2860864

Цитата:

Цитата FiRmaN
как убрать эту обводку? »

Пример:
Код:

[Code]
procedure InitializeWizard();
begin
  WizardForm.NextButton.Default := False;
end;

А также (Вдруг тоже приспичит):
Код:

[Code]
procedure InitializeWizard();
begin
  WizardForm.GroupEdit.AutoSelect := False;
  WizardForm.NextButton.AutoSelect := False;
end;

Дальше сами.

habib2302 03-03-2019 21:01 2861093

Доброе время суток. Нужно, чтобы при выборе или отмене компонента и задачи добавлялась или удалялась часть команды из секции run?
Например: При выборе задачи "Создать ярлык на РС" добавлялась команда SHORTCUT_DESKTOP=1.

Код:

[Run]
Filename: msiexec.exe; Parameters: "/I Setup.msi /qf ALL_USERS=1 SHORTCUT_DESKTOP=1 INSTALLDIR=""{app}"""; Check: not WizardSilent; Flags: waituntilterminated hidewizard;


Iska 03-03-2019 22:33 2861108

habib2302, нет, нельзя. Файл инсталляции формируется в момент его создания. Работайте с набором задач, для которых будут разные параметры у исполняемой команды, либо работайте непосредственно в коде.

P.S. Я надеюсь, Ваша инсталляция не состоит только из одного этого файла?

habib2302 03-03-2019 22:46 2861113

Цитата:

Цитата Iska
либо работайте непосредственно в коде »

В принципе я надеялся на помощь т.к я в коде не силен. (Если есть возможность сделать код)
Цитата:

Цитата Iska
P.S. Я надеюсь, Ваша инсталляция не состоит только из одного этого файла? »

Нет

boss911 04-03-2019 02:00 2861134

Цитата:

Цитата habib2302
Например: При выборе задачи "Создать ярлык на РС" добавлялась команда SHORTCUT_DESKTOP=1. »

Код:

[Tasks]
Name: DesktopIcon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Run]
Filename: {sys}\msiexec.exe; Parameters: "/I Setup.msi /qf ALL_USERS=1 SHORTCUT_DESKTOP=1 INSTALLDIR=""{app}"""; Check: not WizardSilent; Flags: waituntilterminated hidewizard; Tasks: DesktopIcon
Filename: {sys}\msiexec.exe; Parameters: "/I Setup.msi /qf ALL_USERS=1 INSTALLDIR=""{app}"""; Check: not WizardSilent; Flags: waituntilterminated hidewizard; Tasks: not DesktopIcon

В зависимости от выбора или не выбора задачи (по умолчанию не выбрано, флаг 'unchecked'), будет выполняться только один из указанных запусков (по умолчанию без параметра 'SHORTCUT_DESKTOP=1'). С компонентом можно сделать аналогично.

habib2302 04-03-2019 02:15 2861139

boss911, помимо ярлыков на рс есть 4 компонента и ярлык в пуск

Iska 04-03-2019 04:09 2861143

Начинают выясняться интересные подробности…
Цитата:

Цитата habib2302
boss911, помимо ярлыков на рс есть 4 компонента и ярлык в пуск »

habib2302, о которых мы, конечно, должны были догадаться? Вы написали конкретный пример «например» — Вам дали на него конкретный ответ. Хотите чего-то сложного с кучей условий и зависимостей — изучайте и берите в руки PascalScript.

habib2302 04-03-2019 04:30 2861145

Iska, уже сделал. посредством записи команд в ini файл через секцию [Ini] и чтение из ini файла через код

OldGamer 05-03-2019 22:39 2861608

Вложений: 1
Ребята, подскажите пожалуйста, как можно изменить стандартное окно с выбором языков установки?
Чтобы было похоже на то, что во вложении.

usermode 08-03-2019 20:36 2862170

помогите забороть странный колбек:

Скрытый текст

[Setup]
AppName=DeltaMAX
AppVerName=DeltaMAX 2.0.1.0
DefaultDirName={tmp}
OutputDir=c:\Files\

[code]
type
EnumCallback=procedure(retcode: integer;lpUser:Longint);

function WrapMyCallback(callback:EnumCallback; paramcount:integer):longword;
external 'wrapcallback@{sd}\Files\innocallback.dll stdcall';

type
DELTAMAX_ENCODE_OPTIONS = record
lpszLicensedTo: ansistring;
lpszLicenseKey: ansistring;
nMemoryMax: Integer;
nMemoryMaxPercent: Integer;
nFreeMemoryMin: Integer;
nLowMemMode: Integer;
nFootprintSize: Integer;
bAutoIncreaseFootprintSize: bool;
bEnableMultiPass: bool;
nMultiPassThreshold: Integer;
nMultiPassMaxAdditionalPasses: Integer;
pProgressCallback: longword;
lpUserData: integer;
end;

procedure DeltaMAXInitEncodeOptions(pOptions: DELTAMAX_ENCODE_OPTIONS);
external 'DeltaMAXInitEncodeOptions@{sd}\Files\DeltaMAX.dll cdecl';

function DeltaMAXEncode(szSource: ansistring; szTarget: ansistring; szDiff: ansistring; pOptions: DELTAMAX_ENCODE_OPTIONS): Integer;
external 'DeltaMAXEncode@{sd}\Files\DeltaMAX.dll cdecl';

procedure ProcessDiff(code: integer; lpUser:Longint);
begin
MsgBox('data', mbError, MB_OK);
end;

var
Data: PAnsiChar;
Options: DELTAMAX_ENCODE_OPTIONS;
callback:longword;
userdata:ansistring;

function initializesetup():boolean;
var
err: Integer;
n,s: ansistring;
begin
callback:=WrapMyCallback(@ProcessDiff,2);

n := 'DEMO';
s := 'DEMO';

DeltaMAXInitEncodeOptions(Options);

Options.lpszLicensedTo := n;
Options.lpszLicenseKey := s;
Options.nMemoryMax := 0;
Options.nMemoryMaxPercent := 80;
Options.nFreeMemoryMin := 8;
Options.nLowMemMode := 1;
Options.nFootprintSize := 0;
Options.bAutoIncreaseFootprintSize := true;
Options.bEnableMultiPass := false;
Options.nMultiPassThreshold := 0;
Options.nMultiPassMaxAdditionalPasses := 1;

//Options.lpUserData := 0;
//Options.pProgressCallback := callback;

err := DeltaMAXEncode('D:\1.txt', 'D:\2.txt', 'D:\patch.diff', Options);

if err <> 0 then
MsgBox('Bad! ' + IntToStr(err), mbError, MB_OK) else
MsgBox('Success! ' + IntToStr(err), mbError, MB_OK);
end;


сам sdk в аттаче. нужно, чтобы в структуре параметр pProgressCallback корректно исполнял колбек для обсчета процентов согласно документации SDK. полагаю, у меня ошибка в данных lpUserData, я не знаю какой указатель и куда должен быть использован.

для использования надо из папки SDK\Redist скопировать ANSI версию DeltaMAX.dll в C:\Files, туда же InnoCallback.dll.
также нужно поместить 1.txt и 2.txt с различающимися данными. D:\patch.diff - сюда будут записаны файл с изменениями.
из соображений копирайтов, серийный номер не прикладываю, нужно будет подождать пять секунд и нажать OK для запуска процесса.

El Sanchez 10-03-2019 12:17 2862348

Цитата:

Цитата usermode
помогите забороть странный колбек »

usermode,
Скрытый текст

Код:

[Setup]
AppName=DeltaMAX
AppVerName=DeltaMAX 2.0.1.0
DefaultDirName={tmp}
OutputDir=.

[Files]
Source: {#ifdef UNICODE}Unicode\{#endif}DeltaMAX.dll; Flags: dontcopy;
Source: InnoCallback.dll; Flags: dontcopy

[Code]
type
  TMessageCallback = function(nMessageCode: Integer; lpUserData: LongWord): BOOL;
  TProgressCallback = function(dPercentDone: Single; lpUserData: LongWord): BOOL;

  TDeltaMAXEncodeOptions = record
    lpszLicensedTo: string;
    lpszLicenseKey: string;
    nMemoryMax: Integer;
    nMemoryMaxPercent: Integer;
    nFreeMemoryMin: Integer;
    nLowMemMode: Integer;
    nFootprintSize: Integer;
    bAutoIncreaseFootprintSize: BOOL;
    bEnableMultiPass: BOOL;
    nMultiPassThreshold: Integer;
    nMultiPassMaxAdditionalPasses: Integer;
    pProgressCallback: LongWord;
    pMessageCallback: LongWord;
    lpUserData: LongWord;
  end;

function WrapMessageCallback(Callback: TMessageCallback; ParamCount: Integer): LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function WrapProgressCallback(Callback: TProgressCallback; ParamCount: Integer): LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
procedure DeltaMAXInitEncodeOptions(var pOptions: TDeltaMAXEncodeOptions); external 'DeltaMAXInitEncodeOptions@files:DeltaMAX.dll cdecl';
function DeltaMAXEncode(szSource, szTarget, szDiff: string; var pOptions: TDeltaMAXEncodeOptions): Integer; external 'DeltaMAXEncode@files:DeltaMAX.dll cdecl';

function ProgressCallback(dPercentDone: Single; lpUserData: LongWord): BOOL;
begin
  Result := True;
  Log(Format('Progress: %n%%', [dPercentDone]));
end;

function MessageCallback(nMessageCode: Integer; lpUserData: LongWord): BOOL;
begin
  Result := True;
  Log(Format('Message code: %d', [nMessageCode]));
end;

function InitializeSetup: Boolean;
var
  LOptions: TDeltaMAXEncodeOptions;
  LResultCode: Integer;
begin
  try
    DeltaMAXInitEncodeOptions(LOptions);
    LOptions.lpszLicensedTo := 'DEMO';
    LOptions.lpszLicenseKey := 'DEMO';
    LOptions.bEnableMultiPass := False;
    LOptions.nMultiPassThreshold := 0;
    LOptions.nMultiPassMaxAdditionalPasses := 1;
    LOptions.pProgressCallback := WrapProgressCallback(@ProgressCallback, 2);
    LOptions.pMessageCallback := WrapMessageCallback(@MessageCallback, 2);
    LResultCode := DeltaMAXEncode(ExpandConstant('{src}\1.txt'), ExpandConstant('{src}\2.txt'), ExpandConstant('{src}\patch.diff'), LOptions);
    if LResultCode <> 0 then
      RaiseException(Format('Encode failed with error code: %d', [LResultCode]));
  except
    ShowExceptionMessage;
  finally
  end;


usermode 10-03-2019 15:02 2862366

El Sanchez, благодарю! :victory:

Давно не кодил и ошибка основная у меня была в том, что я полностью не описал структуру, почему то решил, что можно некоторые параметры не описывать и оставить себе только нужные - а так делать нельзя, такое можно только в коде функции. К тому же не выполнил главного условия True функции колбека, без которого это дело тоже не заведется. Также прошляпил var в прототипах, хотя использовал почему-то out и работало..

Вопрос у меня следующий, проценты выполнения привязаны только к прогресс бару? Вообще я хотел бы адаптировать под консольное приложение на дельфи и мне там было бы неплохо прогресс выполнения привязать к строке, отображающей проценты в числовом виде. Пока не могу придумать как описать проценты от 0 до 100 в ProgressCallback, ибо даже если вручную указать min 0, max 100, step 1, то общее количество вызовов в колбеке мы не знаем, их может быть 250, 400 и т.д.

по идее в dPercentDone должно лежать число максимального цикла колбека, чтобы выполнить обсчет процентов? может быть потому что другой тип данных Single, а не Double? а с Double работать не хочет. надо будет с дельфи повозиться, посмотреть как там дела будут обстоять с Double.

добавлено
вобщем, проблема решена на дельфи:
Скрытый текст
function DiffProgressCallback(nn:double; lpUserData:pointer): bool; stdcall;
begin
Application.ProcessMessages;
Form1.edt1.Text := IntToStr(round(nn));
Form1.pb1.position:=round(nn);
Result:=True;
end;

double нормально отрабатывает, только сначала не понял, почему по третьему кругу прогресс бар и проценты идут. оказалось, так надо :) разные этапы так разделяются.

я проверил код на Inno и на Delphi, что-то типа:
ppos:=0;
...
в колбеке:
inc(ppos);
и считаем проценты по ppos, минусуя 100 процентов при превышении интервала.
сравнив выполнение с double на дельфи и там же рядом inc кода на Inno - абсолютно одинаково считает, единственное на Inno надо учитывать "переполнение" счетчика процентов, когда идет вторая и третяя стадия выполнения. извращаться с Single в данном случае не обязательно :)

El Sanchez 10-03-2019 19:18 2862405

Цитата:

Цитата usermode
Также прошляпил var в прототипах, хотя использовал почему-то out и работало.. »

usermode, в данном случае без разницы.
Цитата:

Цитата usermode
Вопрос у меня следующий, проценты выполнения привязаны только к прогресс бару? »

usermode, прогресс там привязан к разным операциям в течении сессии. Запустите Bin\MFC60Client.exe и увидите, что прогресс там несколько раз полностью доходит до конца, общего нет.
Цитата:

Цитата usermode
по идее в dPercentDone должно лежать число максимального цикла колбека, чтобы выполнить обсчет процентов? может быть потому что другой тип данных Single, а не Double? а с Double работать не хочет. надо будет с дельфи повозиться, посмотреть как там дела будут обстоять с Double. »

usermode, нормально в Delphi должно быть, это в PascalScript флоаты дурные. Single я поставил, потому что с другими типами ошибки, с ним же без ошибок, но проценты не считает :).

usermode 10-03-2019 19:46 2862408

El Sanchez, да, я это уловил и отредактировал предыдущее сообщение, вопрос полностью решен, спасибо еще раз!

там кстати на количество проходов влияют параметры:

LOptions.bEnableMultiPass := true;
LOptions.nMultiPassThreshold := 0;
LOptions.nMultiPassMaxAdditionalPasses := 3;

если мультипроходы отключены или выставлены в 1, то только один раз до 100 процентов выполняется. а на образце по дефолту 3 прохода выставляется, поэтому чуть не запутался с этим, думал глюки снова :)

mdli 28-03-2019 19:51 2865618

Подскажите каким способом можно скрыть кнопку Inno Setup из панели задач ? Окно я скрываю, а кнопка остается и показывает прогресс распаковки, мне это не нужно.
SetWindowLong пробовал, не помогает.

Iska 29-03-2019 04:05 2865711

Цитата:

Цитата mdli
каким способом можно скрыть кнопку Inno Setup из панели задач ? »

Зачем?

El Sanchez 31-03-2019 10:24 2866062

Цитата:

Цитата mdli
Подскажите каким способом можно скрыть кнопку Inno Setup из панели задач ? »

mdli,
Код:

#ifndef IS_ENHANCED
const
  GW_OWNER = 4;

function GetWindow(hWnd: HWND; uCmd: UINT): HWND; external 'GetWindow@user32.dll stdcall';
#endif
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';

procedure FormActivate(Sender: TObject);
begin
  ShowWindow({#ifdef IS_ENHANCED}Application.Handle{#else}GetWindow(MainForm.Handle, GW_OWNER){#endif}, SW_HIDE);
end;

procedure InitializeWizard;
begin
  WizardForm.OnActivate := @FormActivate;
end;


SBalykov 01-04-2019 15:05 2866203

Вложений: 1
Добрый день!
Помогите решить проблему сохранения файлов SlideShow в память и последующей их воспроизведения из памяти:
Код:

#ifndef IS_ENHANCED
#error Для компиляции данного скрипта необходимо расширенное издание Inno Setup (restools)!
#endif

#define SLIDE "4"

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={sd}\My Application

[Files]
Source: Sourse\*; Flags: dontcopy

[_Code]
type
#ifdef UNICODE
  PChar = PAnsiChar;
#else
  AnsiChar = Char;
#endif

var
i: Integer;

function ssInitialize(hParent: HWND; ssTimeShow: Integer; FadeOut: Boolean; StretchMode: Integer; BkgColor: DWORD): Boolean; external 'ssInitialize@{tmp}\isgsg.dll stdcall delayload';
procedure ssAddImage(FileName: PChar); external 'ssAddImage@files:isgsg.dll stdcall delayload';
procedure ssDeInitialize; external 'ssDeInitialize@files:isgsg.dll stdcall delayload';
procedure ssStartShow; external 'ssStartShow@files:isgsg.dll stdcall delayload';
procedure ssStopShow; external 'ssStopShow@files:isgsg.dll stdcall delayload';

{* Запуск отображения слайдшоу *}
function InitializeSlideShow: Boolean;
begin
  ExtractTemporaryFile('isgsg.dll');
  Result := ssInitialize(WizardForm.Handle, 2, True, 0, 0);
for i := 1 to {#SLIDE} do begin
  ExtractTemporaryFile(IntToStr(i)+'.jpg');
  ssAddImage(ExpandConstant('{tmp}\'+IntToStr(i)+'.jpg'));
  end;
  Sleep(5);
  ssStartShow;
end;

procedure InitializeWizard();
begin
  InitializeSlideShow;
end;

procedure DeinitializeSetup();
begin
  ssStopShow;
  ssDeInitialize;
end;


El Sanchez 01-04-2019 21:05 2866233

Цитата:

Цитата SBalykov
Помогите решить проблему сохранения файлов SlideShow в память и последующей их воспроизведения из памяти »

SBalykov, а пущай для начала автор библиотеки реализует ssAddImage с загрузкой из TStream.

SBalykov 02-04-2019 02:40 2866264

El Sanchez
Понял.
Спасибо за ответ...

ErikPshat 10-04-2019 08:34 2867260

Здравствуйте! Есть ли способ извлечения файлов из инсталлятора во время запуска не в папку {tmp)?
Предположим в секции [Files] помещаю файл:
Код:

[Files]
Source: "Include\utility.exe"; DestDir: "{tmp}"; Flags: dontcopy

Затем, при запуске инсталлятора я извлекаю этот файл во временную директорию как обычно такой командой:
Код:

ExtractTemporaryFile('utility.exe');
Но, если мне нужно извлекать не в {tmp}, а допустим, в папку "С:\Tools\utility.exe", тогда это просто так не получится? Что-то пробовал менять путь, выдаёт ошибку.

Пока ничего не приходит в голову, как копировать файл из временной папки, типа так:
Код:

ExtractTemporaryFile('utility.exe');
FileCopy(ExpandConstant('{tmp}\utility.exe'), ExpandConstant('С:\Tools\utility.exe'), True);


Irenis 10-04-2019 17:40 2867318

Добрый день. Подскажите пожалуйста, как сделать так, чтоб при установке приложения, на рабочем столе создавался ярлык со ссылкой, которую можно открыть через указанный браузер?
Например, чтоб сайт yandex.ru открывался через Explorer, нужно создать на рабочем столе такой ярлык
«C:\Program Files\Internet Explorer\iexplore.exe» //yandex.ru

Можно ли в inno setyp сделать подобное, чтоб создавался ярлык со ссылкой, которая открывалась бы через указанный браузер?

usermode 10-04-2019 17:58 2867324

ErikPshat, а с помощью ExtractTemporaryFiles(s) никак это не сделаешь. Если посмотреть исходники, то там код для этих функций работает только в пределах временной папки.
Так что способ копирования вполне себе, только не забудь перед копированием файла создать нужные папки, если они не существуют, например: ForceDirectories(ExpandConstant('{sd}\Tools'))

Iska 10-04-2019 18:23 2867334

Цитата:

Цитата usermode
там код для этих функций работает только в пределах временной папки. »

И это правильно.

Irenis 10-04-2019 20:12 2867347

Цитата:

Цитата Irenis
Например, чтоб сайт yandex.ru открывался через Explorer, нужно создать на рабочем столе такой ярлык
«C:\Program Files\Internet Explorer\iexplore.exe» //yandex.ru

Можно ли в inno setyp сделать подобное, чтоб создавался ярлык со ссылкой, которая открывалась бы через указанный браузер? »

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

ErikPshat 10-04-2019 21:25 2867357

Цитата:

Цитата usermode
только не забудь перед копированием файла создать нужные папки, если они не существуют, например: ForceDirectories(ExpandConstant('{sd}\Tools')) »

Ага, это я понял, т.к., если папки не существует, тогда копирование файлов само не создаёт папки.
Правда я создаю папку такой командой: CreateDir(ExpandConstant('{src}\Tools'));

Цитата:

Цитата Iska
И это правильно. »

Странно, почему-бы не сделать извлечение из экзешника по указанному пути. Тут такое дело и просто уже надоело бороться со школьниками, которые создают на компе профиль на кириллице. Получается путь к папке %TEMP% по умолчанию в таком виде: C:\Users\Вася Пупкин\AppData\Local\Temp
А используемая конфиденциальная утилита, от именитого производителя Sony, не понимает кириллицу и аналогов не имеет.
Так вот такие юзеры постоянно жалуются, типа нифига не работает ваша прога. И это довольно частая проблема. Надоело каждый день по 10 раз объяснять, что не надо называть комп и имя профиля, создавать почтовые ящики, исполььзовать пароли - на кириллице.

ErikPshat 10-04-2019 22:41 2867369

Цитата:

Цитата Irenis
Ну или как то по другому. Например, запакую я браузер хромиум (или любой другой браузер) через inno setyp, затем нужно, чтоб после установки этого браузера на другом компьютере и последующего запуска, открывалась не домашняя страница браузера, а та сслыка, которую я указала. Возможно ли так сделать? Подскажите, плиз. »

А с каким умыслом устанавливать на комп юзера свой браузер? Дкмаю никому не понравится, если у него на компе вдруг появится Internet Explorer или Opera, либо мазила, и зачем-то именно в этом стороннем браузере будет открываться ссылка.

Выводите просто ярлык интернета на рабрчий стол. А при его запуске, будет у юзера открываться его браузер, выставленный у него по умолчанию. Воспользуйтесь официальной функцией Inno Setup по созданию ярлыков. Укажите секцию [Icons] и выводите URL-ярлык, например так:
Код:

[Icons]
Name: "{commondesktop}\Открыть в Яндекс"; Filename: "https://yandex.ru"


Dodakaedr 10-04-2019 22:42 2867370

Цитата:

Цитата Irenis
Например, чтоб сайт yandex.ru открывался через Explorer, нужно создать на рабочем столе такой ярлык »

Цитата:

Цитата Irenis
Ну или как то по другому. »

Как вариант

Код:

[Setup]
AppName=App
AppverName=App v1.0
DefaultDirName={pf}\App
OutputDir=.

// 1 вариант
[ini]
Filename: "{userdesktop}\HomePageWeb.url"; Section: "InternetShortcut"; Key: "URL"; String: "https://yandex.ru";

// 2 вариант
[icons]
Name: "{userdesktop}\HomePageWeb2"; Filename: """C:\Program Files\Internet Explorer\iexplore.exe"""; Parameters: "//yandex.ru";


Цитата:

Цитата ErikPshat
Есть ли способ извлечения файлов из инсталлятора во время запуска не в папку {tmp)? »

Есть такой (расширенная версия inno setup):
Скрытый текст
Код:

[Setup]
AppName=App
AppverName=App v1.0
DefaultDirName={pf}\App
OutputDir=.

[Files]
Source: "Include\utility.exe"; DestDir: "{tmp}"; Flags: dontcopy

[Code]
function InitializeSetup(): Boolean;
begin
  Result := True;
  CreateDir(ExpandConstant('{src}\Tools'));
  ExtractTemporaryFileEx('utility.exe', ExpandConstant('{src}\Tools'));
end;


Iska 11-04-2019 03:36 2867393

Цитата:

Цитата ErikPshat
Тут такое дело и просто уже надоело бороться со школьниками, которые создают на компе профиль на кириллице. Получается путь к папке %TEMP% по умолчанию в таком виде: C:\Users\Вася Пупкин\AppData\Local\Temp
А используемая конфиденциальная утилита, от именитого производителя Sony, не понимает кириллицу и аналогов не имеет. »

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

Irenis 11-04-2019 11:31 2867417

Цитата:

Цитата Dodakaedr
Как вариант »

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

Dodakaedr 11-04-2019 15:47 2867444

Irenis, Только если через планировщик. Но вообще такое не рекомендуется.

alexander-mex 18-04-2019 08:32 2868200

Всем привет! На работе дали задание сделать сборник инсталляторов. Этим я никогда не занимался. Есть 2 основные программы и 2 файла которые устанавливают службы (ярлыки). Можно ли сделать с помощью этой программы сборник, чтобы открывалось окно и я мог выбрать, что хочу установить?

usermode 18-04-2019 10:47 2868224

Цитата:

Цитата alexander-mex
Можно ли сделать с помощью этой программы сборник, чтобы открывалось окно и я мог выбрать, что хочу установить? »

Имеется в виду оболочку как в старых добрых авторанах на дисках? В Inno можно, но лучше в "гуевых" программах типа AutoPlay Menu Builder или AutoPlay Media Studio.

alexander-mex 18-04-2019 15:09 2868257

Спасибо! Попробую

ZVSRus 18-04-2019 16:06 2868264

Цитата:

Цитата alexander-mex
Можно ли сделать с помощью этой программы сборник, чтобы открывалось окно и я мог выбрать, что хочу установить?

Сделано на Inno Setup

Сделано на Inno Setup

ROMKA-1977 27-04-2019 01:04 2869368

Здраствуйте. Подскажите пож. константу папки Сохраненные игры (C:\Users\XXX\Saved Games). В справке такой нет.

habib2302 27-04-2019 01:39 2869371

ROMKA-1977, как вариант
Код:

{sd}\Users\{username}\Saved Games

или

Код:

[Code]
  if RegValueExists(HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', '{4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4}') then
  begin
   
// The value exists
 
end;
end;

или

Код:

{reg:HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders,%7B{4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4}}

{4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4} = это путь к папке в случае если пользователь изменит путь через свойства. Проверил от 7 и до 10. Везде один и тот же {4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4}

habib2302 27-04-2019 14:07 2869410

ROMKA-1977, или же
%USERPROFILE%\Saved Games

ErikPshat 27-04-2019 19:43 2869435

Цитата:

Цитата Iska
Так здесь проблема с программистами, которые в XXI веке продолжают считать, что в мире не существует никакого иного языка, кроме английского. »

Ага, тут в продолжение разговора, я всё-таки решил использовать эту злополучную утилиту, которая не понимает в путях не только символы кириллицы, но и другие нестандартные символы, отличные от букв и цифр ANSI алфавита: [A-z0-9]. Вообщем мне удалось соорудить проверку на символы кириллицы и оно прекрасно работает.
IsAnsi
Наверху кода создаю такую функцию:
Код:

function IsAnsi(S: String): Boolean; var S1, S2: string;
begin S1 := AnsiUppercase(S); S2 := Uppercase(S); if CompareStr(S1, S2) = 0 then
  begin S1 := Lowercase(S); S2 := AnsiLowercase(S); if CompareStr(S1, S2) = 0 then
    Result := True;
  end;
end;

А потом, там где я хочу произвести проверку, вставляю код проверки символов в пути к папке программы и при обнаружении вывожу предупреждение с завершением работы:
Код:

if not (IsAnsi(ExpandConstant('{src}'))) then
  begin MsgBox(ExpandConstant('{cm:CirillicPATH}')+#10#10+ExpandConstant('{src}'),mbError,MB_OK);
  Exit;
end;

Но теперь я хочу дополнить проверку и на нестандартные символы, типа !, "@, #, $, %, ^, &, *,...
В инете нашёл такую интересную процедуру определения символов по их номерам и даже по диапазонам номеров в десятичном виде:
Код:

procedure justNumbers(Sender: TObject; var Key: Char);
begin
  if not ((Key = #8) or (Key = #43) or ((Key >= #48) and (Key <= #57))) then
  begin
    Key := #0;
  end;
end;

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

usermode 28-04-2019 22:54 2869538

Для одного из проектов искал самый быстрый подсчет crc32 для файлов и решил сделать dll, кому интересно забирайте в аттаче.
подробнее...
Алгоритм работает так: если поддержку SSE 4.2 процессор имеет, срабатывает аппаратный подсчет crc32c (с - использование Intel полинома: $1EDC6F41), в противном случае, если процессор слишком старый и не имеет поддержку SSE 4.2, то срабатывает crc32cfast с оптимизацией на ассемблере (имеет тот же результат подсчета). отличие результата подсчета от стандартного crc32 только из-за использования другого инициализационного полинома.

По заверению авторов кода, результаты подсчета следующие:
- Our optimized unrolled x86 version - aka crc32cfast() - performs the test at a very good pace of 1.7 GB/s;
- SSE 4.2 version - aka crc32csse42() - gives an amazing 3.7 GB/s speed (on both Win32 and Win64 platforms);
- simple rolled version of the algorithm (similar to the one in Delphi zlib unit) runs at 330 MB/s.

Основано на:
https://synopse.info/fossil/info/8fe7cc53b7

ErikPshat 29-04-2019 09:01 2869560

usermode, ещё одна DLL конечно никогда не помешает. Только в наши времена подсчёт CRC32 имеет актуальность на маленьких файлах, пускай даже самый быстрый подсчёт CRC32. По крайней мере даже MD5 быстрее подсчитывается стандартной функцией препроцессора GetMD5OfFile, не говоря уже про более точный SHA-1 и более быстрый подсчёт больших файлов по 1-4-10-20 Гига стандартной функцией препроцессора GetSHA1OfFile. Может быть я ошибаюсь, вашу утилиту не пробовал, но на практике часто приходится подсчитывать файлы по 4 и более Гб, так вот, какой бы быстрый не был бы CRC32, так это можно уснуть надолго, тогда как SHA-1 обычно замечено мною, что на несколько махов быстрее подсчитывается :)

Кстати, стоит мне изменить путь s:='D:\somebigfile.dat'; или подсунуть по этому пути реальный файл, как прога тут же выдаёт ошибку:



Ну а мне никто так и не поможет?

usermode 29-04-2019 11:32 2869572

ErikPshat, у меня dll на всех ОС, включая Windows 10, работает нормально. Может причина в "неуниверсальных" параметрах выделения или освобождения памяти.
Можно попросить протестировать "болванку" на дельфи? Нужно прописать путь к существующему файлу, нажать каждую кнопку и сообщить, на каких будут ошибки. Заодно сравните на гигабайтных файлах скорость подсчета сравнительно md5 и sha-1 (предпочтительно на ssd при наличии) и убедитесь в обратном :)
У меня на ssd подсчитывает фильм 2.22 Gb стандартной системной реализацией за 4.8sec, sse4.2 за 0.8sec, fast assembler за 1.2 sec.

Цитата:

Ну а мне никто так и не поможет?
когда-то давно писал такой "дурацкий" код на проверку символов, которые указаны в abc, все остальные несуществующие символы будут отсчитывать ошибку.
Скрытый текст
Код:

procedure InitializeWizard;     
var
  i,j: integer;   
  s,abc: string;                                             
begin
  j  := 0;
  abc := '0123456789абв%*@abc';

  s:='012';

  for i:=1 to Length(s) do
  begin
    if Pos(s[i],abc) = 0 then
    inc(j);
  end;

  if j >= 1 then
  begin
    MsgBox('Error! 0123456789абв%*@abc chars only are allowed!', mbInformation, MB_OK);
    Exit;
  end;
end;


лучше учесть те символы, что можно, чем учитывать все, что нельзя.

add
причина ошибки dll в некорректном определении технологии SSE 4.2, там где ее нет, например на CPU с SSE 4.1, она определяется что есть.

ErikPshat 29-04-2019 14:26 2869582

Цитата:

Цитата usermode
причина ошибки dll в некорректном определении технологии SSE 4.2, там где ее нет, например на CPU с SSE 4.1, она определяется что есть. »

Ну вот, значит нужно над совместимостью поработать ;)



За код спасибо, правда я видел подобные варианты, но видимо это самый универсальный вариант, правда я хотел бы взять диапазон через Key: Char по нумерации в таблице ASCII-символов.

usermode 29-04-2019 15:01 2869586

Вложений: 1
CRC32-C Ansi/Unicode Dlls *fixed*
Пришлось исправлять косяки разработчиков, плохо работало определение наличия технологии SSE 4.2 (кто ж мог подумать :) )
в оригинале:
test edx,$100000 // перепутали регистр, по которому берется информация для SSE 4.2
setz al // неправильная установка флага
исправленный:
test ecx,$100000 // fix
setne al // fix

фикс основан на интеловских доках, где достаточно сделать проверку только на поддержку SSE 4.2:
https://software.intel.com/en-us/art...struction-sets

ErikPshat 29-04-2019 17:24 2869611

usermode, окей, теперь работает. Но так не честно. Чтобы быть объективным, тогда уж надо подсчитать время и потом сравнивать посекундно, какая функция ведёт подсчёт быстрее. Вот так я подсчитал время перед стартом подсчёта контрольной суммы и после, заодно можно сравить по времени подсчёт MD5 и SHA-1 того же файла:
Скрипт
Код:

;InnoSetupVersion=5.6.1 (Unicode)
#define CP = (Defined UNICODE) ? "unicode" : "ansi"

[Setup]
AppName=test
AppVerName=test
OutputDir=...
OutputBaseFilename=HachCheck
CreateAppDir=no
Uninstallable=no
CreateUninstallRegKey=no

[Files]
Source: crc32c_{#CP}.dll; Flags: dontcopy;

[*Code*]
function GetCRC32COfFile(FilePath: String): Cardinal;
external 'GetCRC32COfFile@files:crc32c_{#CP}.dll stdcall';

procedure InitializeWizard;
var
  md5, sha1, t1, t2, t3, t4, t5, t6, f1, FileName: string;
  crc: cardinal;
begin
  if GetOpenFileName(ExpandConstant('Выберите файл'),FileName,ExpandConstant('{src}'),ExpandConstant('Выбрать любой файл ')+'(*.*)|*.*','*') then
    if MsgBox(ExpandConstant('Выбран файл')+#10#10+FileName+#10#10+ExpandConstant('Подсчитать контрольную сумму файла "'+ExtractFileName(FileName)+'" ?'), mbInformation, MB_YESNO) = IDYES then
  begin
  if FileExists(FileName) then
    begin
      t1:=GetDateTimeString('hh:nn:ss', '-', ':');
      crc:=GetCRC32COfFile(FileName);
      t2:=GetDateTimeString('hh:nn:ss', '-', ':');
      f1:=Format('%.8x',[crc]);
      MsgBox(ExpandConstant('Старт вычисления:  '+t1)+#10+#10+ExpandConstant('Хэш сумма CRC32:  '+f1)+#10#10+ExpandConstant('Конец вычисления:  '+t2), mbInformation, MB_OK);
    end;
    begin
      t3:=GetDateTimeString('hh:nn:ss', '-', ':');
      md5:=GetMD5OfFile(FileName);
      t4:=GetDateTimeString('hh:nn:ss', '-', ':');
      MsgBox(ExpandConstant('Старт вычисления:  '+t3)+#10+#10+ExpandConstant('Хэш сумма MD5:  '+md5)+#10#10+ExpandConstant('Конец вычисления:  '+t4), mbInformation, MB_OK);
    end;
    begin
      t5:=GetDateTimeString('hh:nn:ss', '-', ':');
      sha1:=GetSHA1OfFile(FileName);
      t6:=GetDateTimeString('hh:nn:ss', '-', ':');
      MsgBox(ExpandConstant('Старт вычисления:  '+t5)+#10+#10+ExpandConstant('Хэш сумма SHA-1:  '+sha1)+#10#10+ExpandConstant('Конец вычисления:  '+t6), mbInformation, MB_OK);
    end;
    MsgBox(ExpandConstant('CRC32 :'+#10#10+'Старт вычисления:  '+t1)+#10+#10+ExpandConstant('Конец вычисления:  '+t2)+#10+#10+#10+
          ExpandConstant('MD5  :'+#10#10+'Старт вычисления:  '+t3)+#10+#10+ExpandConstant('Конец вычисления:  '+t4)+#10+#10+#10+
          ExpandConstant('SHA-1 :'+#10#10+'Старт вычисления:  '+t5)+#10+#10+ExpandConstant('Конец вычисления:  '+t6), mbInformation, MB_OK);
  end;
end;


Лучше видно будет на больших файлах, где-то 2-4 Гб, чем больше - тем очевиднее. Вот тогда можно и рассудить.
Вот пример вычисления чек-сумм файла 3,80 ГБ:

  • CRC32: 01 мин 32 сек
  • M D 5 : 00 мин 39 сек
  • SHA-1 : 01 мин 52 сек
MD5 у меня всегда почему-то быстрее всего подсчитывает.

Dodakaedr 29-04-2019 19:58 2869619

Цитата:

Цитата ErikPshat
Но вот что-то никак ума не приложу, как бы мне теперь объединить эти две конструкции, чтобы и символы кириллицы анализировала, и нестандартные символы определяла? »

Такой вариант сойдет?
Скрытый текст
Код:

function IsAnsiOrSym(S: String): Boolean;
var
  n: string;
  i,j: integer;
begin
  if CompareStr(AnsiUppercase(S), Uppercase(S)) = 0 then
  if CompareStr(Lowercase(S), AnsiLowercase(S)) = 0 then Result := True;
  if result then
  begin
    n := '!"@#$%^&*';
    for i:=1 to length(s) do
    for j:=1 to length(n) do
    begin
      if s[i] = n[j] then
      begin
        Result := False;
        exit;
      end;
    end;
    end;
end;


usermode 30-04-2019 01:16 2869665

ErikPshat, а у меня такие результаты на ssd на файле в 2.22Gb:
Скрытый текст
Код:

#define CP = (Defined UNICODE) ? "unicode" : "ansi" 

[Setup]
AppName=test
AppVerName=test
DefaultDirName={tmp}
CreateAppDir=no
Uninstallable=no
CreateUninstallRegKey=no
                                           
[Files]
Source: crc32c_{#CP}.dll; Flags: dontcopy;                             
                                                             
[.Code]                                                         
function GetCRC32COfFile(FilePath: String): Cardinal;                   
external 'GetCRC32COfFile@files:crc32c_{#CP}.dll stdcall';
                   
function GetTickCount: Dword;
external 'GetTickCount@kernel32.dll stdcall'; 
   
function FormatTime(time: int64): string;
 var
  Ms : Int64;
  H, M, S : Integer;
begin
  Ms := time;
  H := Ms div (60 * 60 * 1000);
  Ms := Ms mod (60 * 60 * 1000);
  M := Ms div (60 * 1000);
  Ms := Ms mod (60 * 1000);
  S := Ms div 1000;
  Ms := Ms mod 1000;
  Result := Format('%.2dh:%.2dm:%.2ds:%.3dms',[H,M,S,Ms]);
end; 
                                                     
///////////////////////////                                                   
procedure InitializeWizard;     
var
  s: string; 
  c: cardinal; 
  Elapsed,Start,Stop:int64;                                               
begin
  s:='C:\44.txt';
  if FileExists (s) then
  begin
    Elapsed := 0;
    Start:=GetTickCount;
    c:=GetCRC32COfFile(s);
    Stop:=GetTickCount;
    Elapsed:=Stop-Start;
    MsgBox(Format('%.8x',[c])+' Time: '+FormatTime(Elapsed), mbInformation, MB_OK);
    /////////////
    Elapsed := 0;
    Start:=GetTickCount;
    s:=GetMD5OfFile(s);
    Stop:=GetTickCount;
    Elapsed:=Stop-Start;
    MsgBox(s+' Time: '+FormatTime(Elapsed), mbInformation, MB_OK);
  end;
end;


C5433036 Time: 00h:00m:00s:842ms
---------------------------
9e7592826a085607311cd0a38f17ef19 Time: 00h:00m:04s:602ms

p.s. там еще может быть момент "первого чтения". когда доступ к диску замедлен, либо тот же диск интенсивно задействован прриложениями, тогда изначально может показаться что CRC32 "тормозит", но на самом деле оно всяко быстрее md5, по крайней мере на моем Core i7 процессоре.

ErikPshat 30-04-2019 02:48 2869667

Цитата:

Цитата Dodakaedr
Такой вариант сойдет? »

О, да! Думаю, самый оптимальный и самый хитрый и короткий вариант. Как раз то, что надо. Я ещё отдельно выставил 2 разные переменные в первой и второй проверке и вывожу 2 разных сообщения: по поводу символов кириллицы и по поводу нестандартных символов. То есть, теперь распознавание получается более точнее, нежели одно общее. Спасибо ещё раз!!!

Цитата:

Цитата usermode
C5433036 Time: 00h:00m:00s:842ms
---------------------------
9e7592826a085607311cd0a38f17ef19 Time: 00h:00m:04s:602ms »

Видимо у вас процессор использует инструкции процессора SSE 4.2 и код DLL просто заточен и оптимизирован под эти инструкции, вот и получается у вас подсчёт CRC32 быстрее, т.к. инструкции MD5 не оптимизированы.
А у меня, как я ранее выкладывал скриншот своего процессора на нетбуке Asus Eee PC 1215N Intel Atom D525, то у него SSE3 максимум, поэтому MD5 вычисляется намного быстрее. Вот результаты на файле 3,77 ГБ:Так что, ваш код DLL получается только для избранных выигрышный. Может быть его как-то оптимизировать под SSE3?

usermode 30-04-2019 11:06 2869698

Цитата:

Цитата ErikPshat
Может быть его как-то оптимизировать под SSE3? »

только начиная с SSE 4.2 есть аппаратная инструкция crc32. в dll используется самый оптимизированный подсчет на ассемблере даже без SSE 4.2, не знаю в чем магия, утверждать и спорить не буду, но в очередной раз предположу: скорость чтения с ноутбучного hdd, до 110-120 мегабайт в секунду, ssd до 550 mb/s. По заявлениям разработчиков на современных Intel процессорах скорость подсчета алгоритма crc32cfast - 1.7 Gb/s, crc32csse42 - 3.5 Gb/s. Такого чтения не может обеспечить любой адекватный носитель.

А попробуйте еще виндовый апишный подсчет crc32, будет ли он у вас быстрее, чем подсчет в dll (у меня виндовый подсчет медленнее в 10 раз):
Скрытый текст
Код:

#define CP = (Defined UNICODE) ? "unicode" : "ansi" 
#define AW = (Defined UNICODE) ? "W" : "A" 
[Setup]
AppName=test
AppVerName=test
DefaultDirName={tmp}
CreateAppDir=no
Uninstallable=no
CreateUninstallRegKey=no
                                           
[Files]
Source: crc32c_{#CP}.dll; Flags: dontcopy;                             
                                                             
[.Code] 
type
  TMyMsg = record hWnd: HWND; msg, wParam: Word; lParam: LongWord; Time: TFileTime; pt: TPoint; end;
                                                         
function GetCRC32COfFile(FilePath: String): Cardinal;                   
external 'GetCRC32COfFile@files:crc32c_{#CP}.dll stdcall';
                   
function GetTickCount: Dword;
external 'GetTickCount@kernel32.dll stdcall'; 
   
function RtlComputeCrc32(dwInitial: Cardinal; const pData: Longint; iLen: Integer): Cardinal;
external 'RtlComputeCrc32@ntdll.dll stdcall';

function ReadFile(hFile: THandle; lpBuffer: Longint; nNumberOfBytesToRead: DWORD; var lpNumberOfBytesRead: DWORD; lpOverlapped: Longint): BOOL;
external 'ReadFile@kernel32.dll stdcall';

function GetProcessHeap: THandle;
external 'GetProcessHeap@kernel32.dll stdcall';

function HeapAlloc(hHeap: THandle; dwFlags, dwBytes: DWORD): Longint;
external 'HeapAlloc@kernel32.dll stdcall';

function HeapSize(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): DWORD;
external 'HeapSize@kernel32.dll stdcall';

function HeapFree(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): BOOL;
external 'HeapFree@kernel32.dll stdcall';

function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL;
external 'PeekMessage{#AW}@user32.dll stdcall';

function TranslateMessage(const lpMsg: TMyMsg): BOOL;
external 'TranslateMessage@user32.dll stdcall';

function DispatchMessage(const lpMsg: TMyMsg): Longint;
external 'DispatchMessage{#AW}@user32.dll stdcall';

function CreateFile(lpFileName: String; dwDesiredAccess: DWORD; dwShareMode: DWORD; lpSecurityAttributes: DWORD; dwCreationDisposition: DWORD; dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle;
external 'CreateFile{#AW}@kernel32.dll stdcall';

function CloseHandle(hObject: THandle): BOOL;
external 'CloseHandle@kernel32.dll stdcall';

const
  PAGE_READONLY = $0002;
  FILE_MAP_READ = $0004;
  HEAP_ZERO_MEMORY = $0008;
  FILE_FLAG_SEQUENTIAL_SCAN = $08000000;

  GENERIC_READ        = $80000000;
  GENERIC_WRITE      = $40000000;
  GENERIC_EXECUTE    = $20000000;
  GENERIC_ALL        = $10000000;
  FILE_SHARE_READ    = 1;
  FILE_SHARE_WRITE    = 2;
  FILE_SHARE_DELETE  = 4;
  CREATE_NEW          = 1;
  CREATE_ALWAYS      = 2;
  OPEN_EXISTING      = 3;
  OPEN_ALWAYS        = 4;
  TRUNCATE_EXISTING  = 5;

  INVALID_HANDLE_VALUE = (-1);

procedure AppProcessMessage;
var
  Msg: TMyMsg;
begin
  while PeekMessage(Msg, 0, 0, 0, 1) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end;

function GetCRC32OfFile(FileName: string): Cardinal;
var
  hFile, hHeap: THandle;
  lpBuffer: Longint;
  dwBufferSize, dwRead: DWORD;                         
begin
  Result := 0;
  hFile := CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, 0);
  if hFile = INVALID_HANDLE_VALUE then Exit;
  try
    hHeap := GetProcessHeap;
    if hHeap = 0 then Exit;
    lpBuffer := HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 32*1024);
    if lpBuffer = 0 then Exit;
    dwBufferSize := HeapSize(hHeap, 0, lpBuffer);
    if dwBufferSize = 0 then Exit;
    while ReadFile(hFile, lpBuffer, dwBufferSize, dwRead, 0) and BOOL(dwRead > 0) do
    begin
      AppProcessMessage; 
      Result := RtlComputeCrc32(Result, lpBuffer, dwRead);
    end;
  finally
    if hHeap <> 0 then
      HeapFree(hHeap, 0, lpBuffer);
    CloseHandle(hFile);
  end;
end;

function FormatTime(time: cardinal{int64}): string;
 var
  Ms : cardinal{int64};
  H, M, S : Integer;
begin
  Ms := time;
  H := Ms div (60 * 60 * 1000);
  Ms := Ms mod (60 * 60 * 1000);
  M := Ms div (60 * 1000);
  Ms := Ms mod (60 * 1000);
  S := Ms div 1000;
  Ms := Ms mod 1000;
  Result := Format('%.2dh:%.2dm:%.2ds:%.3dms',[H,M,S,Ms]);
end; 
                                                     
///////////////////////////                                                   
procedure InitializeWizard;     
var
  s: string; 
  c: cardinal; 
  Elapsed,Start,Stop:cardinal{int64};                                               
begin
  s:='C:\44.txt';
  if FileExists (s) then
  begin
    Elapsed := 0;
    Start:=GetTickCount;
    c:=GetCRC32OfFile(s);
    Stop:=GetTickCount;
    Elapsed:=Stop-Start;
    MsgBox(Format('%.8x',[c])+' Api CRC32 Time: '+FormatTime(Elapsed), mbInformation, MB_OK);
    /////////////
    Elapsed := 0;
    Start:=GetTickCount;
    c:=GetCRC32COfFile(s);
    Stop:=GetTickCount;
    Elapsed:=Stop-Start;
    MsgBox(Format('%.8x',[c])+' Fast CRC-32C Time: '+FormatTime(Elapsed), mbInformation, MB_OK);
    /////////////
    Elapsed := 0;
    Start:=GetTickCount;
    s:=GetMD5OfFile(s);
    Stop:=GetTickCount;
    Elapsed:=Stop-Start;
    MsgBox(s+' Inno MD5 Time: '+FormatTime(Elapsed), mbInformation, MB_OK);
  end;
end;



В интернетах должна быть реализация md5 под sse2, хотя некоторые разработчики для своих брутилок тоже делали на ассемблере очень быстрые алгоритмы :)

ErikPshat 30-04-2019 11:53 2869727

Цитата:

Цитата usermode
А попробуйте еще виндовый апишный подсчет crc32, будет ли он у вас быстрее, чем подсчет в dll (у меня виндовый подсчет медленнее в 10 раз) »

Ну на файле 3,8 Гб
  • API: 01:53:085
  • Fast CRC-32C: 00:07:801
  • MD5: 00:15:787
Пару раз прогонял, результаты почти практически такие же. Fast CRC-32C конечно намного быстрее считает, только почему-то CRC разные показывает :)

Цитата:

Цитата Dodakaedr
if s[i] = n[j] then »

Эмм, что-то у меня это равенство ни при каких условиях не выполняется, хоть есть нестандартные символы, хоть нет.

usermode 30-04-2019 12:05 2869728

Цитата:

Цитата ErikPshat
Fast CRC-32C конечно намного быстрее считает »

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

Цитата:

Цитата ErikPshat
только почему-то CRC разные показывает »

это потому, что в CRC-32C используется другой Intel-овский полином (приставка С намекает), но сам алгоритм абсолютно идентичный.

ErikPshat 30-04-2019 12:30 2869735

usermode, переместил MD5 на первое место, то же самое: 00:15:678
А вот API CRC32: 00:00:015 - как так возможно? :)
А Fast CRC-32C: 00:00:000 :)
В общем, на первом результате происходит долгое ожидание, такое впечатление, что файл просто сначала кэшируется во временную память, ну и на раскрутку цилиндров видимо тратится время. А второй и третий результат выдаётся практически тут же.

usermode 30-04-2019 12:49 2869738

Цитата:

Цитата ErikPshat
А вот API CRC32: 00:00:015 - как так возможно?
А Fast CRC-32C: 00:00:000 »

сказывается 3 день Пасхи :) не назначил отдельную переменную для имени файла, и s потом вместо файла указывало на посчитанную ранее md5 сумму.
Скрытый текст
Код:

#define CP = (Defined UNICODE) ? "unicode" : "ansi" 
#define AW = (Defined UNICODE) ? "W" : "A" 
[Setup]
AppName=test
AppVerName=test
DefaultDirName={tmp}
CreateAppDir=no
Uninstallable=no
CreateUninstallRegKey=no
                                           
[Files]
Source: crc32c_{#CP}.dll; Flags: dontcopy;                             
                                                             
[.Code] 
type
  TMyMsg = record hWnd: HWND; msg, wParam: Word; lParam: LongWord; Time: TFileTime; pt: TPoint; end;
                                                         
function GetCRC32COfFile(FilePath: String): Cardinal;                   
external 'GetCRC32COfFile@files:crc32c_{#CP}.dll stdcall';
                   
function GetTickCount: Dword;
external 'GetTickCount@kernel32.dll stdcall'; 
   
function RtlComputeCrc32(dwInitial: Cardinal; const pData: Longint; iLen: Integer): Cardinal;
external 'RtlComputeCrc32@ntdll.dll stdcall';

function ReadFile(hFile: THandle; lpBuffer: Longint; nNumberOfBytesToRead: DWORD; var lpNumberOfBytesRead: DWORD; lpOverlapped: Longint): BOOL;
external 'ReadFile@kernel32.dll stdcall';

function GetProcessHeap: THandle;
external 'GetProcessHeap@kernel32.dll stdcall';

function HeapAlloc(hHeap: THandle; dwFlags, dwBytes: DWORD): Longint;
external 'HeapAlloc@kernel32.dll stdcall';

function HeapSize(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): DWORD;
external 'HeapSize@kernel32.dll stdcall';

function HeapFree(hHeap: THandle; dwFlags: DWORD; lpMem: Longint): BOOL;
external 'HeapFree@kernel32.dll stdcall';

function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL;
external 'PeekMessage{#AW}@user32.dll stdcall';

function TranslateMessage(const lpMsg: TMyMsg): BOOL;
external 'TranslateMessage@user32.dll stdcall';

function DispatchMessage(const lpMsg: TMyMsg): Longint;
external 'DispatchMessage{#AW}@user32.dll stdcall';

function CreateFile(lpFileName: String; dwDesiredAccess: DWORD; dwShareMode: DWORD; lpSecurityAttributes: DWORD; dwCreationDisposition: DWORD; dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle;
external 'CreateFile{#AW}@kernel32.dll stdcall';

function CloseHandle(hObject: THandle): BOOL;
external 'CloseHandle@kernel32.dll stdcall';

const
  PAGE_READONLY = $0002;
  FILE_MAP_READ = $0004;
  HEAP_ZERO_MEMORY = $0008;
  FILE_FLAG_SEQUENTIAL_SCAN = $08000000;

  GENERIC_READ        = $80000000;
  GENERIC_WRITE      = $40000000;
  GENERIC_EXECUTE    = $20000000;
  GENERIC_ALL        = $10000000;
  FILE_SHARE_READ    = 1;
  FILE_SHARE_WRITE    = 2;
  FILE_SHARE_DELETE  = 4;
  CREATE_NEW          = 1;
  CREATE_ALWAYS      = 2;
  OPEN_EXISTING      = 3;
  OPEN_ALWAYS        = 4;
  TRUNCATE_EXISTING  = 5;

  INVALID_HANDLE_VALUE = (-1);

procedure AppProcessMessage;
var
  Msg: TMyMsg;
begin
  while PeekMessage(Msg, 0, 0, 0, 1) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end;

function GetCRC32OfFile(FileName: string): Cardinal;
var
  hFile, hHeap: THandle;
  lpBuffer: Longint;
  dwBufferSize, dwRead: DWORD;                         
begin
  Result := 0;
  hFile := CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, 0);
  if hFile = INVALID_HANDLE_VALUE then Exit;
  try
    hHeap := GetProcessHeap;
    if hHeap = 0 then Exit;
    lpBuffer := HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 32*1024);
    if lpBuffer = 0 then Exit;
    dwBufferSize := HeapSize(hHeap, 0, lpBuffer);
    if dwBufferSize = 0 then Exit;
    while ReadFile(hFile, lpBuffer, dwBufferSize, dwRead, 0) and BOOL(dwRead > 0) do
    begin
      AppProcessMessage; 
      Result := RtlComputeCrc32(Result, lpBuffer, dwRead);
    end;
  finally
    if hHeap <> 0 then
      HeapFree(hHeap, 0, lpBuffer);
    CloseHandle(hFile);
  end;
end;

function FormatTime(time: int64): string;
 var
  Ms : int64;
  H, M, S : Integer;
begin
  Ms := time;
  H := Ms div (60 * 60 * 1000);
  Ms := Ms mod (60 * 60 * 1000);
  M := Ms div (60 * 1000);
  Ms := Ms mod (60 * 1000);
  S := Ms div 1000;
  Ms := Ms mod 1000;
  Result := Format('%.2dh:%.2dm:%.2ds:%.3dms',[H,M,S,Ms]);
end; 
                                                     
///////////////////////////                                                   
procedure InitializeWizard;     
var
  s,fs: string; 
  c: cardinal; 
  Elapsed,Start,Stop:int64;                                               
begin
  fs:='C:\44.txt';
  if FileExists (fs) then
  begin
    Elapsed := 0;
    Start:=GetTickCount;
    s:=GetMD5OfFile(fs);
    Stop:=GetTickCount;
    Elapsed:=Stop-Start;
    MsgBox(s+' Inno MD5 Time: '+FormatTime(Elapsed), mbInformation, MB_OK);
    /////////////
    Elapsed := 0;
    Start:=GetTickCount;
    c:=GetCRC32OfFile(fs);
    Stop:=GetTickCount;
    Elapsed:=Stop-Start;
    MsgBox(Format('%.8x',[c])+' Api CRC32 Time: '+FormatTime(Elapsed), mbInformation, MB_OK);
    /////////////
    Elapsed := 0;
    Start:=GetTickCount;
    c:=GetCRC32COfFile(fs);
    Stop:=GetTickCount;
    Elapsed:=Stop-Start;
    MsgBox(Format('%.8x',[c])+' Fast CRC-32C Time: '+FormatTime(Elapsed), mbInformation, MB_OK);
  end;
end;


ErikPshat,
http://qaru.site/questions/332124/crc32-vs-crc32c

Dodakaedr 30-04-2019 18:46 2869785

Цитата:

Цитата ErikPshat
Эмм, что-то у меня это равенство ни при каких условиях не выполняется, хоть есть нестандартные символы, хоть нет. »

На какой символ проверяете?
Цитата:

Цитата ErikPshat
Я ещё отдельно выставил 2 разные переменные в первой и второй проверке »

они не могли испортить функцию?
Попробуйте еще так:
Скрытый текст
Код:

[Setup]
AppName=App
AppverName=App v1.0
DefaultDirName={pf}\App
OutputDir=.

[Code]
var
  errorcode: integer;

function IsAnsiOrSym(S: String; var ResultError: integer): Boolean;
var
  n: string;
  i,j: integer;
begin
  if CompareStr(AnsiUppercase(S), Uppercase(S)) = 0 then
  if CompareStr(Lowercase(S), AnsiLowercase(S)) = 0 then Result := True else Result := False;
  if not result then ResultError := 1;
  if result then
  begin
    n := '!"@#$%^&*';
    for i:=1 to length(s) do
    for j:=1 to length(n) do
    begin
      if s[i] = n[j] then
      begin
        Result := False;
        ResultError := 2;
        exit;
      end;
    end;
    end;
end;

procedure InitializeWizard();
begin
  if not (IsAnsiOrSym(ExpandConstant('{src}'), errorcode)) then if (errorcode=1) then MsgBox('Найдена кириллица в: '+ExpandConstant('{src}'),mbError,MB_OK);
  if not (IsAnsiOrSym(ExpandConstant('{src}'), errorcode)) then if (errorcode=2) then MsgBox('Найден спецсимвол в: '+ExpandConstant('{src}'),mbError,MB_OK);
end;


ErikPshat 30-04-2019 20:50 2869800

Цитата:

Цитата Dodakaedr
На какой символ проверяете?
они не могли испортить функцию? »

Вполне может быть я что-то не так подхимичил. Вроде бы по логике всё так же должно было остаться.
Я разделил ту функцию на 2 отдельные функции. Ну там переменную "n" поменял на "m", т.к. первая у меня уже используется в коде.
Вот моя химия:
Код:

function IsAnsi(S: String): Boolean;
begin if CompareStr(AnsiUppercase(S), Uppercase(S)) = 0 then
begin if CompareStr(Lowercase(S), AnsiLowercase(S)) = 0 then Result := True; end; end;

function IsSymb(S: String): Boolean; var m: String; i, j: Integer;
begin
  m := '!"@#$%^&*';
  for i:=1 to length(S) do
  for j:=1 to length(m) do
  begin if S[i] = m[j] then Result := False; end;
end;

procedure InitializeWizard();
if not(IsAnsi(ExpandConstant('{src}'))) then begin MsgBox(ExpandConstant('{cm:CirillicPATH}')+#10#10+ExpandConstant('{src}'), mbError, MB_OK);Exit;end;
if not(IsSymb(ExpandConstant('{src}'))) then begin MsgBox(ExpandConstant('{cm:SimbolsPATH}')+#10#10+ExpandConstant('{src}'), mbError, MB_OK);Exit;end;


Проверил ваш код. Всё отлично работает! Из функции exit; перенёс в исполняемый код, т.к. мне нужно, чтобы после оповещения, окно закрывалось и прекращало работу.
Спасибо большое!!!

vk_k14m@vk 08-06-2019 20:28 2874898

Народ, у меня вопрос по секции [UninstallDelete]. При удалении приложения нужно так же удалять конфиг приложения. Но можно ли сделать, что б уинсталлер просил подтверждение при удалении?

Dodakaedr 08-06-2019 21:58 2874904

Цитата:

Цитата vk_k14m@vk
можно ли сделать, что б уинсталлер просил подтверждение при удалении? »

Код:

[Setup]
AppName=App
AppverName=App v1.0
DefaultDirName={pf}\App
OutputDir=.

[Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usPostUninstall then
    if MsgBox('Также удалить настройки программы?', mbConfirmation, MB_YESNO)=IDYES then DeleteFile(ExpandConstant('{commonappdata}\Proga\config.cfg'));
end;


Iska 08-06-2019 22:56 2874915

Dodakaedr, лучше бы вопрос задавался в самом начале процесса деинсталляции, а не в конце (если я правильно понял логику кода).

vk_k14m@vk 08-06-2019 23:30 2874919

Цитата:

Цитата Iska
лучше бы вопрос задавался в самом начале процесса деинсталляции, а не в конце (если я правильно понял логику кода). »

Мне нужно что б удалилось само приложение, и в конце деинсталлер уточнял, удалять ли и конфиг тоже. Или оставить...

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

Изменил код на как мне казалось рабочий вариант.
[code]
Код:

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usPostUninstall then
    if MsgBox('Также удалить настройки программы?', mbConfirmation, MB_YESNO)=IDYES then DelTree('{app}\config', True, True, True);
end;

Но нет. Установщик спросил удалять или нет, и при согласии файлы остались на месте. Что я сделал не так?

Dodakaedr 08-06-2019 23:49 2874922

Цитата:

Цитата vk_k14m@vk
И наверно нужно было уточнять, что конфиг не один а несколько »

Уточняйте все и сразу: какого рода ваши конфиги, маска файлов подойдет?

Цитата:

Цитата Iska
лучше бы вопрос задавался в самом начале процесса деинсталляции »

Если пользователь удаляет прогу, то ему, я думаю, все равно где задавать вопрос.

И судя по ответу
Цитата:

Цитата vk_k14m@vk
Мне нужно что б удалилось само приложение, и в конце деинсталлер уточнял »

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

Iska 09-06-2019 00:46 2874926

Цитата:

Цитата Dodakaedr
Если пользователь удаляет прогу, то ему, я думаю, все равно где задавать вопрос. »

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

Цитата:

Цитата Dodakaedr
И судя по ответу я предоставил пример что требовалось. И сейчас будем пол страницы узнавать подробности конфигов. »

Ну, это как обычно ;).

vk_k14m@vk 09-06-2019 00:51 2874927

Цитата:

Цитата Dodakaedr
Уточняйте все и сразу: какого рода ваши конфиги, маска файлов подойдет? »

3 маски нужно. Там конфиги трех разных расширений...

Dodakaedr 09-06-2019 07:56 2874940

Цитата:

Цитата vk_k14m@vk
Что я сделал не так? »

Указали не правильную константу.

vk_k14m@vk 09-06-2019 17:41 2874984

Цитата:

Цитата Dodakaedr
Указали не правильную константу. »

Ясно...

vk_k14m@vk 12-06-2019 20:04 2875412

Народ. Есть игра, в корне которой лежит текстовый файл config.ksc, с текстом
Код:

(const) %[
 "saveDataLocation" => "file://./d/документы/fateavedata"
]

d/документы/fateavedata - это папка в которую игра будет сохранятся.

Так вот как бы настроить создание этого файла в установщике?

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

Как бы это провернуть? Надеюсь на вашу помощь...

El Sanchez 13-06-2019 16:20 2875495

Цитата:

Цитата vk_k14m@vk
Так вот как бы настроить создание этого файла в установщике? »

Скрытый текст

Код:

[Code]
procedure RtlMoveMemory(Dest: PAnsiChar; Source: string; Len: Integer); external 'RtlMoveMemory@kernel32.dll stdcall';

var
  SaveDataLocationPage: TInputDirWizardPage;

procedure SetSaveDataLocation;
var
  S1: string;
  S2: AnsiString;
begin
  S1 := SaveDataLocationPage.Values[0];
  StringChangeEx(S1, ':', '', True);
  StringChangeEx(S1, '\', '/', True);
  S1 := '%["saveDataLocation" => "file://./' + S1 + '"]';
  S2 := StringOfChar(#0, Length(S1) shl 1);
  RtlMoveMemory(S2, S1, Length(S2));
  S2 := Chr($FF) + Chr($FE) + S2;
  SaveStringToFile(ExpandConstant(CurrentFileName), S2, False);
end;

procedure CreateSaveDataLocationPage;
begin
  SaveDataLocationPage := CreateInputDirPage(wpSelectDir, 'caption', 'description', 'subcaption', False, 'fateavedata');
  SaveDataLocationPage.Add('prompt');
end;

procedure InitializeWizard;
begin
  CreateSaveDataLocationPage;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    SaveDataLocationPage.ID:
      if SaveDataLocationPage.Values[0] = '' then
        SaveDataLocationPage.Values[0] := ExpandConstant('{app}\fateavedata');
  end;
end;


Dodakaedr 13-06-2019 19:32 2875508

Цитата:

Цитата El Sanchez
S2 := Chr($FF) + Chr($FE) + S2; »

А какие начальные байты у ANSI?

Iska 13-06-2019 20:53 2875518

Dodakaedr, никаких. Для ANSI и OEM нет BOM.

vk_k14m@vk 14-06-2019 00:13 2875522

El Sanchez, к сожалению твой код не работает. Или правильнее будет сказать, работает не до конца. Страница в выбором папки установки и правда появилась.
https://i106.fastpic.ru/big/2019/061...eabf7dd4c8.png

Вот только файл config.ksc с текстом
Код:

(const) %[
 "saveDataLocation" => "file://./{app}\fateavedata"
]

в папке с игрой не появляется. Может я что-то не так сделал?
Скрытый текст
Код:

; Скрипт создан при помощи мастера создания скриптов.
; СМ. ДОКУМЕНТАЦИЮ ДЛЯ ИЗУЧЕНИЯ ДЕТАЛЕЙ ОТНОСИТЕЛЬНО СОЗДАНИЯ ФАЙЛОВ СКРИПТА INNO SETUP!

#define MyAppName "Fate/Stay Night [Realta Nua] - Ultimate Edition"
#define MyAppVerName "Fate/Stay Night [Realta Nua] - Ultimate Edition v0.9.1"
#define MyAppPublisher "Type-Moon"
#define MyAppExeName "Fate.exe"

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
DefaultDirName=D:\Games\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir=D:\
OutputBaseFilename=setup
DisableWelcomePage=no
SetupIconFile=D:\Fate/Stay Night [Realta Nua] - Ultimate Edition\icon.ico
WizardImageFile=D:\Fate/Stay night\WizardImageFile.bmp
WizardSmallImageFile=D:\Fate/Stay night\WizardSmallImageFile.bmp
Compression=lzma/ultra64
SolidCompression=yes
DiskSpanning=yes
DiskSliceSize=1073741824

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "D:\Fate/Stay Night [Realta Nua] - Ultimate Edition\Fate.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Fate/Stay Night [Realta Nua] - Ultimate Edition\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; ОТМЕТЬТЕ: Не используйте "Флажки: Проигнорировать версию" на любых общедоступных системных файлах

[Code ]
procedure RtlMoveMemory(Dest: PAnsiChar; Source: string; Len: Integer); external 'RtlMoveMemory@kernel32.dll stdcall';

var
  SaveDataLocationPage: TInputDirWizardPage;

procedure SetSaveDataLocation;
var
  S1: string;
  S2: AnsiString;
begin
  S1 := SaveDataLocationPage.Values[0];
  StringChangeEx(S1, ':', '', True);
  StringChangeEx(S1, '\', '/', True);
  S1 := '%["saveDataLocation" => "file://./' + S1 + '"]';
  S2 := StringOfChar(#0, Length(S1) shl 1);
  RtlMoveMemory(S2, S1, Length(S2));
  S2 := Chr($FF) + Chr($FE) + S2;
  SaveStringToFile(ExpandConstant(CurrentFileName), S2, False);
end;

procedure CreateSaveDataLocationPage;
begin
  SaveDataLocationPage := CreateInputDirPage(wpSelectDir, 'Выбор папки сохранений', 'В какую папку должна сохраняться игра Fate/Stay Night [Realta Nua] - Ultimate Edition?', 'Программа настроит сохранения игры Fate/Stay Night [Realta Nua] - Ultimate Edition в следующую папку.', False, 'fateavedata');
  SaveDataLocationPage.Add('Нажмите «Далее», что бы продолжить. Если вы хотите выбрать другую папку, нажмите «Обзор».');
end;

procedure InitializeWizard;
begin
  CreateSaveDataLocationPage;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    SaveDataLocationPage.ID:
      if SaveDataLocationPage.Values[0] = '' then
        SaveDataLocationPage.Values[0] := ExpandConstant('{app}\fateavedata');
  end;
end;

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent



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

ErikPshat 14-06-2019 01:01 2875526

vk_k14m@vk, ну свою прогу вы можете распаковать этим: Inno Setup Unpacker
Секцию Code вы конечно не дизассемблируете, т.к. она в бинарном виде изначально будет упакована, но всё остальное прекрасно извлекается.
А вот надо сначала узнать, в какой программе был создан экзешник, потом извлекать соответствующим софтом.

vk_k14m@vk 14-06-2019 01:04 2875528

Цитата:

Цитата ErikPshat
ну свою прогу вы можете распаковать этим: Inno Setup Unpacker
Секцию Code вы конечно не дизассемблируете, т.к. она в бинарном виде изначально будет упакована, но всё остальное прекрасно извлекается.
А вот надо сначала узнать, в какой программе был создан экзешник, потом извлекать соответствующим софтом. »

Жаль. Тот установщик который я хочу распаковать не содержит в себе файлов. Он качает их откуда-то в интернете. Так что скорее всего мне именно секция Code и нужна.

А можно как то узнать в какой программе был создан установщик?

ErikPshat 14-06-2019 01:33 2875529

Цитата:

Цитата vk_k14m@vk
А можно как то узнать в какой программе был создан установщик? »

Вот вам список прог в помощь: PEiD, DiE (Detect It Easy), Bit Detector, SCANiT, ExeScan, FastScanner и PE Tools
Ну или вот вам пару ресурсов:
  1. https://exelab.ru/download.php
  2. http://www.manhunter.ru/underground/...ih_faylov.html

El Sanchez 14-06-2019 09:54 2875539

Цитата:

Цитата vk_k14m@vk
Вот только файл config.ksc с текстом в папке с игрой не появляется. Может я что-то не так сделал? »

vk_k14m@vk, ой, не все скопировал у себя, когда пост оформлял. Добавить в [Files] пустышку config.ksc:
Код:

[Files]
Source: config.ksc; DestDir: {app}; AfterInstall: SetSaveDataLocation


vk_k14m@vk 14-06-2019 10:24 2875540

Цитата:

Цитата El Sanchez
ой, не все скопировал у себя, когда пост оформлял. Добавить в [Files] пустышку config.ksc: »

Теперь файл создается. Это уже хорошо. Но ошибка все еще есть.

Создается файл с таким содержимым
Код:

%["saveDataLocation" => "file://./D/Games/Fate/Stay Night [Realta Nua] - Ultimate Edition/fateavedata"]
А должно быть такое
Код:

(const) %[
 "saveDataLocation" => "file://./D/Games/Fate/Stay Night [Realta Nua] - Ultimate Edition/fateavedata"
]

Из-за чего игра крашится после первого запуска. А при втором запуске крашится моментально...

El Sanchez 14-06-2019 14:39 2875556

Цитата:

Цитата vk_k14m@vk
Из-за чего игра крашится после первого запуска. А при втором запуске крашится моментально »

vk_k14m@vk, а (const) добавить к S1 := '(const) %["saveDataLocation" => "file://./' + S1 + '"]';?

Dodakaedr 14-06-2019 19:25 2875571

Цитата:

Цитата vk_k14m@vk
А должно быть такое »

Код:

S1 := '(const) %['+#13' "saveDataLocation" => "file://./' + S1 + '"'+#13+']';
и добавьте еще это
Код:

if not DirExists(s1) then ForceDirectories(s1);
после
Код:

S1 := SaveDataLocationPage.Values[0];
в процедуре SetSaveDataLocation.

Bio_Hazard 07-07-2019 22:36 2878683

Здравствуйте!
Есть небольшой простой скрипт для установки мода в игру. Он делает бекап оригинальных файлов, копирует новые и создает деинсталлятор.
Его необходимо немного усовершенствовать:
1. Создать резервную копию файлов Game.dll и Game_DX11.dll.
2. Скопировать в корень игры 4 файла XVI32 .cmd/.exe/.ini/.xsc
3. Выполнить XVI32.cmd
4. Удалить эти 4 файла.
5. При деинсталляции вернуть исходные Game.dll и Game_DX11.dll.
Можете помочь с такой задачей?
P.S. с Inno Setup (да и в принципе с программированием) не дружу совсем.
Файл 158063

El Sanchez 09-07-2019 11:01 2878880

Bio_Hazard, а пункты 2-4 это и есть усовершенствования по сравнению с "копирует новые"?
Скрытый текст

Код:

#define AppName "Game Name"

[Setup]
AppName={#AppName} Mod
AppVersion=1.0
DefaultDirName={pf}\{#AppName}
DirExistsWarning=no

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl

[Files]
Source: {app}\Game.dll; DestDir: {app}; DestName: Game.dll.bkp; Flags: external skipifsourcedoesntexist
Source: {app}\Game_DX11.dll; DestDir: {app}; DestName: Game_DX11.dll.bkp; Flags: external skipifsourcedoesntexist
Source: xvi32.*; DestDir: {app}; Flags: deleteafterinstall

[Run]
Filename: {app}\xvi32.cmd; Flags: runhidden shellexec skipifdoesntexist

[UninstallDelete]
Type: files; Name: {app}\Game.dll.bkp
Type: files; Name: {app}\Game_DX11.dll.bkp

[Code]
procedure RestoreFromBackup(const AFileName: string);
var
  LFileName: string;
begin
  LFileName := ChangeFileExt(AFileName, '');
  if FileExists(LFileName) then
    FileCopy(AFileName, ChangeFileExt(AFileName, ''), False);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  case CurUninstallStep of
    usUninstall:
      begin
        RestoreFromBackup(ExpandConstant('{app}\Game.dll.bkp'));
        RestoreFromBackup(ExpandConstant('{app}\Game_DX11.dll.bkp'));
      end;
  end;
end;


Bio_Hazard 09-07-2019 15:37 2878922

Цитата:

Цитата Bio_Hazard
Есть небольшой простой скрипт для установки мода в игру. Он делает бекап оригинальных файлов, копирует новые и создает деинсталлятор. »

Это делает текущий скрипт.

Я не знаю, почему мой архив не подгрузился (Файл 158063), но взяв большую часть Вашего кода, совместил его со "своим" и немного доработав XVI32.cmd, я получил рабочий, полностью удовлетворяющий мои цели скрипт. Может получилось немного топорно, но работает.

Вот что получилось:
Код:

#define ModName "TQRagnarökMod by BioHazardN7"
#define ModVersion "2.3.27"
#define ModShortDescription "Модификация для Titan Quest"

[Setup]
AppId={{70653654-6624-42B4-B9A4-CAE370D75364}
AppName={#ModName} {#ModVersion}
AppVerName={#ModName} {#ModVersion}
// AppPublisher=http://tqrm.zzz.com.ua
// AppPublisherURL=http://tqrm.zzz.com.ua
// AppSupportURL=http://tqrm.zzz.com.ua
// AppUpdatesURL=http://tqrm.zzz.com.ua
DefaultDirName={code:GetInstallationPath}
DefaultGroupName={#ModName}
DirExistsWarning=no
DisableWelcomePage=no
AllowNoIcons=true
InfoBeforeFile=Data\Description.rtf
OutputDir=Release
OutputBaseFilename=TQRagnarokMod2327a_Installer
SetupIconFile=Data\Icon.ico
// Степень сжатия. Сильное: lzma/ultra
Compression=none
SolidCompression=true
VersionInfoVersion={#ModVersion}
// VersionInfoCompany=http://tqrm.zzz.com.ua
VersionInfoDescription={#ModShortDescription}
WizardImageFile=Data\Poster.bmp
// VersionInfoCopyright=(c) http://tqrm.zzz.com.ua
WizardSmallImageFile=Data\Logo.bmp

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

[Files]
Source: Files\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: CreateBackup
Source: {app}\Game.dll; DestDir: {app}; DestName: Game.dll.bak; Flags: external skipifsourcedoesntexist
Source: {app}\Game_DX11.dll; DestDir: {app}; DestName: Game_DX11.dll.bak; Flags: external skipifsourcedoesntexist

[Run]
Filename: {app}\xvi32.cmd; Flags: runhidden shellexec skipifdoesntexist

[UninstallDelete]
Type: files; Name: {app}\Game.dll.bak
Type: files; Name: {app}\Game_DX11.dll.bak

[Icons]
Name: {group}\{cm:ProgramOnTheWeb,{#ModName} {#ModVersion}}; Filename: http://tqrm.zzz.com.ua
Name: {group}\Последняя версия {#ModName}; Filename: http://tqrm.zzz.com.ua/ru/#download
Name: {group}\The latest version of {#ModName}; Filename: http://tqrm.zzz.com.ua/en/#download
Name: {group}\www.titanquest.org.ua; Filename: https://titanquest.org.ua/tqragnarokmod_by_biohazardn7
Name: {group}\vk.com; Filename: https://vk.com/tqrm_n7
Name: {group}\Telegram; Filename: https://t.me/TQRM_N7
Name: {group}\{cm:UninstallProgram,{#ModName} {#ModVersion}}; Filename: {uninstallexe}

// [Messages]
// BeveledLabel=http://tqrm.zzz.com.ua

[code]

procedure RestoreFromBackup(const AFileName: string);
var
  LFileName: string;
begin
  LFileName := ChangeFileExt(AFileName, '');
  if FileExists(LFileName) then
    FileCopy(AFileName, ChangeFileExt(AFileName, ''), False);
end;

// DETECT PREVIOUS VERSION

function InitializeSetup(): Boolean;
begin
  Result := True;
  if RegKeyExists(HKEY_LOCAL_MACHINE,
      'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{70653654-6624-42B4-B9A4-CAE370D75364}_is1') or
    RegKeyExists(HKEY_LOCAL_MACHINE,
      'SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{70653654-6624-42B4-B9A4-CAE370D75364}_is1') or
    RegKeyExists(HKEY_CURRENT_USER,
      'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{70653654-6624-42B4-B9A4-CAE370D75364}_is1') then
  begin
    Log('NEEED')
    //MsgBox('Для переустановки или установки новой версии - необходимо удалить предыдущую', mbInformation, MB_OK);
    //Result := False;
  end;
end;

// CLICKABLE LINK TO TQ SITE

procedure BevelLabelClick(Sender: TObject);
var ErrorCode: Integer;
begin
ShellExec('open','http://tqrm.zzz.com.ua','', '', SW_SHOW, ewNoWait, ErrorCode)
end;

procedure InitializeWizard();
begin
with WizardForm do begin
with BeveledLabel do begin
OnClick:=@BevelLabelClick;
Font.Color:=clBlue;
Enabled:=True;
Cursor:=crHand;
end;
end;
end;

// PAGE WITH DESTINATION

procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=wpSelectDir then
begin
  WizardForm.DirEdit.Enabled := True;
  WizardForm.DirBrowseButton.Enabled := True;
end
else
end;


// CREATE BACKUP BEFORE INSTALL

procedure CreateBackup;
var
  srcFile, destFile: string;
  begin
  if RegKeyExists(HKEY_LOCAL_MACHINE,
      'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{70653654-6624-42B4-B9A4-CAE370D75364}_is1') or
    RegKeyExists(HKEY_LOCAL_MACHINE,
      'SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{70653654-6624-42B4-B9A4-CAE370D75364}_is1') or
    RegKeyExists(HKEY_CURRENT_USER,
      'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{70653654-6624-42B4-B9A4-CAE370D75364}_is1') then
      begin
      // Do nothing
      end
      else
          begin
            srcFile:= ExpandConstant(CurrentFileName);
            destFile:= srcFile + '.bak';
            DeleteFile(destFile);
            RenameFile(srcFile, destFile);
          end
  end;
 
procedure RestoreBackup(backupDir: string);
var
srcFile, destFile: string;
FSR, DSR: TFindRec;
FindResult: Boolean;
APath: string;
begin
APath := AddBackslash(backupDir);
FindResult := FindFirst(APath + '*.bak', FSR);
try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
srcFile:= APath + FSR.Name;
destFile:= Copy(srcFile, 0, Length(srcFile)-4);
DeleteFile(destFile);
RenameFile(srcFile, destFile);
end;
FindResult := FindNext(FSR);
end;
FindResult := FindFirst(APath + '*.*', DSR);
while FindResult do
begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and
not ((DSR.Name = '.') or (DSR.Name = '..')) then
{Recursion} RestoreBackup(APath + DSR.Name);
FindResult := FindNext(DSR);
end;
finally
FindClose(FSR);
FindClose(DSR);
end;
end;

// RESTORE BACKUP AFTER UNINSTALL

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
  begin
    RestoreBackup(ExpandConstant('{app}'))
  end;
  begin
    case CurUninstallStep of
      usUninstall:
        begin
          RestoreFromBackup(ExpandConstant('{app}\Game.dll.bak'));
          RestoreFromBackup(ExpandConstant('{app}\Game_DX11.dll.bak'));
        end;
    end;
  end;
end;

// DETECT PATH OF INSTALLATION

var
  InstallationPath: string;

function GetInstallationPath(Param: string): string;
begin
  { Detected path is cached, as this gets called multiple times }
  if InstallationPath = '' then
  begin
    if RegQueryStringValue(
        HKLM32, 'SOFTWARE\WOW6432Node\GOG.com\Games\1196955511',
        'path', InstallationPath) then
    begin
      Log('Detected GOG installation: ' + InstallationPath);
    end
      else
    if RegQueryStringValue(
        HKLM64, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 475150',
        'InstallLocation', InstallationPath) then
    begin
      Log('Detected Steam installation: ' + InstallationPath);
    end
      else
    begin
      InstallationPath := ExpandConstant('{pf}');
      MsgBox('Не удалось автоматически определить где установлена игра. В ходе установки укажите путь вручную', mbInformation, MB_OK);
      Log('No installation detected, using the default path: ' + InstallationPath);
    end;
  end;
  Result := InstallationPath;
end;



Спасибо за помощь!

El Sanchez 09-07-2019 21:39 2879046

Цитата:

Цитата Bio_Hazard
я получил рабочий, полностью удовлетворяющий мои цели скрипт »

Bio_Hazard, использование явного указания WOW6432Node в коде - это преступление против человечества, уберите все RegKeyExists, где есть WOW6432Node в параметре.

Bio_Hazard 09-07-2019 23:06 2879065

Цитата:

Цитата El Sanchez
использование явного указания WOW6432Node в коде - это преступление против человечества, уберите все RegKeyExists, где есть WOW6432Node в параметре. »

Спасибо за совет, исправил.

Bio_Hazard 16-07-2019 15:16 2880055

Здравствуйте. Обнаружился косяк при установке на 32-х битных системах (обнаружилось на Windows 7)
Ошибка
Код инсталлятора:
Код:

#define ModName "TQRagnarökMod by BioHazardN7"
#define ModVersion "2.3.27"
#define ModShortDescription "Модификация для Titan Quest"

[Setup]
AppId={{70653654-6624-42B4-B9A4-CAE370D75364}
AppName={#ModName} {#ModVersion}
AppVerName={#ModName} {#ModVersion}
// AppPublisher=http://tqrm.zzz.com.ua
// AppPublisherURL=http://tqrm.zzz.com.ua
// AppSupportURL=http://tqrm.zzz.com.ua
// AppUpdatesURL=http://tqrm.zzz.com.ua
DefaultDirName={code:GetInstallationPath}
DefaultGroupName={#ModName}
DirExistsWarning=no
DisableWelcomePage=no
AllowNoIcons=true
InfoBeforeFile=Data\Description.rtf
OutputDir=Release
OutputBaseFilename=TQRagnarokMod2327a_Installer
SetupIconFile=Data\Icon.ico
// Степень сжатия. Сильное: lzma/ultra
Compression=none
SolidCompression=true
VersionInfoVersion={#ModVersion}
// VersionInfoCompany=http://tqrm.zzz.com.ua
VersionInfoDescription={#ModShortDescription}
WizardImageFile=Data\Poster.bmp
// VersionInfoCopyright=(c) http://tqrm.zzz.com.ua
WizardSmallImageFile=Data\Logo.bmp

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

[Files]
Source: Files\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: CreateBackup
Source: {app}\Game.dll; DestDir: {app}; DestName: Game.dll.bak; Flags: external skipifsourcedoesntexist
Source: {app}\Game_DX11.dll; DestDir: {app}; DestName: Game_DX11.dll.bak; Flags: external skipifsourcedoesntexist

[Run]
Filename: {app}\xvi32.cmd; Flags: runhidden shellexec skipifdoesntexist

[UninstallDelete]
Type: files; Name: {app}\Game.dll.bak
Type: files; Name: {app}\Game_DX11.dll.bak

[Icons]
Name: {group}\{cm:ProgramOnTheWeb,{#ModName} {#ModVersion}}; Filename: http://tqrm.zzz.com.ua
Name: {group}\Последняя версия {#ModName}; Filename: http://tqrm.zzz.com.ua/ru/#download
Name: {group}\The latest version of {#ModName}; Filename: http://tqrm.zzz.com.ua/en/#download
Name: {group}\www.titanquest.org.ua; Filename: https://titanquest.org.ua/tqragnarokmod_by_biohazardn7
Name: {group}\vk.com; Filename: https://vk.com/tqrm_n7
Name: {group}\Telegram; Filename: https://t.me/TQRM_N7
Name: {group}\{cm:UninstallProgram,{#ModName} {#ModVersion}}; Filename: {uninstallexe}

// [Messages]
// BeveledLabel=http://tqrm.zzz.com.ua

[code]

procedure RestoreFromBackup(const AFileName: string);
var
  LFileName: string;
begin
  LFileName := ChangeFileExt(AFileName, '');
  if FileExists(LFileName) then
    FileCopy(AFileName, ChangeFileExt(AFileName, ''), False);
end;

// DETECT PREVIOUS VERSION

function InitializeSetup(): Boolean;
begin
  Result := True;
  if RegKeyExists(HKEY_LOCAL_MACHINE,
      'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{70653654-6624-42B4-B9A4-CAE370D75364}_is1') or
    RegKeyExists(HKEY_CURRENT_USER,
      'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{70653654-6624-42B4-B9A4-CAE370D75364}_is1') then
  begin
    Log('NEEED')
    //MsgBox('Для переустановки или установки новой версии - необходимо удалить предыдущую', mbInformation, MB_OK);
    //Result := False;
  end;
end;

// CLICKABLE LINK TO TQ SITE

procedure BevelLabelClick(Sender: TObject);
var ErrorCode: Integer;
begin
ShellExec('open','http://tqrm.zzz.com.ua','', '', SW_SHOW, ewNoWait, ErrorCode)
end;

procedure InitializeWizard();
begin
with WizardForm do begin
with BeveledLabel do begin
OnClick:=@BevelLabelClick;
Font.Color:=clBlue;
Enabled:=True;
Cursor:=crHand;
end;
end;
end;

// PAGE WITH DESTINATION

procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=wpSelectDir then
begin
  WizardForm.DirEdit.Enabled := True;
  WizardForm.DirBrowseButton.Enabled := True;
end
else
end;


// CREATE BACKUP BEFORE INSTALL

procedure CreateBackup;
var
  srcFile, destFile: string;
  begin
  if RegKeyExists(HKEY_LOCAL_MACHINE,
      'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{70653654-6624-42B4-B9A4-CAE370D75364}_is1') or
    RegKeyExists(HKEY_CURRENT_USER,
      'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{70653654-6624-42B4-B9A4-CAE370D75364}_is1') then
      begin
      // Do nothing
      end
      else
          begin
            srcFile:= ExpandConstant(CurrentFileName);
            destFile:= srcFile + '.bak';
            DeleteFile(destFile);
            RenameFile(srcFile, destFile);
          end
  end;
 
procedure RestoreBackup(backupDir: string);
var
srcFile, destFile: string;
FSR, DSR: TFindRec;
FindResult: Boolean;
APath: string;
begin
APath := AddBackslash(backupDir);
FindResult := FindFirst(APath + '*.bak', FSR);
try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
srcFile:= APath + FSR.Name;
destFile:= Copy(srcFile, 0, Length(srcFile)-4);
DeleteFile(destFile);
RenameFile(srcFile, destFile);
end;
FindResult := FindNext(FSR);
end;
FindResult := FindFirst(APath + '*.*', DSR);
while FindResult do
begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and
not ((DSR.Name = '.') or (DSR.Name = '..')) then
{Recursion} RestoreBackup(APath + DSR.Name);
FindResult := FindNext(DSR);
end;
finally
FindClose(FSR);
FindClose(DSR);
end;
end;

// RESTORE BACKUP AFTER UNINSTALL

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
  begin
    RestoreBackup(ExpandConstant('{app}'))
  end;
  begin
    case CurUninstallStep of
      usUninstall:
        begin
          RestoreFromBackup(ExpandConstant('{app}\Game.dll.bak'));
          RestoreFromBackup(ExpandConstant('{app}\Game_DX11.dll.bak'));
        end;
    end;
  end;
end;

// DETECT PATH OF INSTALLATION

var
  InstallationPath: string;

function GetInstallationPath(Param: string): string;
begin
  { Detected path is cached, as this gets called multiple times }
  if InstallationPath = '' then
  begin
    if RegQueryStringValue(
        HKLM32, 'SOFTWARE\GOG.com\Games\1196955511',
        'path', InstallationPath) then
    begin
      Log('Detected GOG installation: ' + InstallationPath);
    end
      else
    if RegQueryStringValue(
        HKLM64, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 475150',
        'InstallLocation', InstallationPath) then
    begin
      Log('Detected Steam installation: ' + InstallationPath);
    end
      else
    begin
      InstallationPath := ExpandConstant('{pf}');
      MsgBox('Не удалось автоматически определить где установлена игра. В ходе установки укажите путь вручную', mbInformation, MB_OK);
      Log('No installation detected, using the default path: ' + InstallationPath);
    end;
  end;
  Result := InstallationPath;
end;


Можете подсказать как исправить?

Dodakaedr 16-07-2019 16:11 2880065

Цитата:

Цитата Bio_Hazard
Обнаружился косяк при установке на 32-х битных системах »

Замените функцию и пробуйте
Скрытый текст
Код:

function GetInstallationPath(Param: string): string;
begin
  { Detected path is cached, as this gets called multiple times }
  if InstallationPath = '' then
  begin
    if RegQueryStringValue(
        HKLM32, 'SOFTWARE\GOG.com\Games\1196955511',
        'path', InstallationPath) then
    begin
      Log('Detected GOG installation: ' + InstallationPath);
    end
      else
    if IsWin64 then
    if RegQueryStringValue(
        HKLM64, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 475150',
        'InstallLocation', InstallationPath) then
    begin
      Log('Detected Steam installation: ' + InstallationPath);
    end
      else
    begin
      InstallationPath := ExpandConstant('{pf}');
      MsgBox('Не удалось автоматически определить где установлена игра. В ходе установки укажите путь вручную', mbInformation, MB_OK);
      Log('No installation detected, using the default path: ' + InstallationPath);
    end;
  end;
  Result := InstallationPath;
end;


Bio_Hazard 18-07-2019 12:18 2880407

Цитата:

Цитата Dodakaedr
Замените функцию и пробуйте »

Спасибо, работает.

Romann_ 22-07-2019 22:28 2881052

Цитата:

Как вставить видео в инсталлятор?
этой библиотекой ещё можно
норм библиотека от Vintage)
Всем привет.
Все ссылки, в прочем как и имеющиеся советы - устарели. Может ли кто нибудь подсказать - как в инсталлятор вставить фоновое видео, вместо картинки?
********************************************
И ещё вопрос - как можно нормально проверить системные требования? - Уже третьи сутки ищу по форумам, везде попадается старый код для проверки XPюши или ниже, найти бы способ проверки современных ОС, а так же разрядность системы. Ну и не помешало бы адекватно проверить и остальные сис. требования, а то я нашёл старенький скрипт инсталлятора с проверкой - у меня стоит видюха на 6Гб, а проверка на 1024 - а пишет, что моего видео не достаточно, только на ОЗУ нормально работает.

Romann_ 24-07-2019 12:36 2881225

Цитата:

Цитата Romann_
так же разрядность системы »

Нашёл необходимый код, имеем такое:
Код:


procedure UpdateInfo();
var
  DeviceName, DeviceKey: String;
begin
  ChangeText := False

  GetWindowsVersionEx(Version)

  // Операционная система:
  SystemVersionPanel.Color := clBlack
    SystemVersionPanel.Font.Color := clGreen

  DeviceKey := 'Software\Microsoft\Windows NT\CurrentVersion'
  if not UsingWinNT then StringChange(DeviceKey, 'Windows NT', 'Windows')
        RegQueryStringValue(HKLM, DeviceKey, 'ProductName', DeviceName)
  if RegQueryStringValue(HKLM, DeviceKey, 'CSDVersion', DeviceKey) then
    DeviceName := DeviceName + ' ' + DeviceKey
        StringChange(DeviceName, 'Microsoft ', '')
  SystemVersionPanel.Text := ' ' + DeviceName + ' сборка ' + IntToStr(Version.Major) + '.' + IntToStr(Version.Minor) +
                            '.' + IntToStr(Version.Build)

  if (Pos('Windows 10', SystemVersionPanel.Text) = 0) and  // Windows 10
    (Pos('Windows 7', SystemVersionPanel.Text) = 0) then  // Windows 7
    begin
      SystemVersionPanel.Color := clBlack
      SystemVersionPanel.Font.Color := clRed
      ChangeText := True
    end
...
...
...

Всё работает. Но как можно ещё проверить разрядность системы?(У некоторых всё ещё есть win7 х86.)

habib2302 24-07-2019 12:42 2881226

Romann_, можете еще проштудировать форум http://krinkels.org/

ErikPshat 24-07-2019 13:30 2881228

Цитата:

Цитата Romann_
Но как можно ещё проверить разрядность системы?(У некоторых всё ещё есть win7 х86.) »

Ну могу поделиться готовым рабочим шаблоном по определению версии Windows (XP/7/Vista/8/8.1/10) и её разрядности. Там как раз ответы на все ваши вопросы, надеюсь разберётесь. Правда там подмешано определение, скачивание и установка нужной версии PowerShell. Ну и ещё там подключён плагин "Inno Download Plugin", подключён скин и подключена заставка, ну и ещё 3 языка. Надеюсь вы сами сможете убрать что лишнее и применить по своему назначению... Правда там это всё реализовано совсем по-другому, у меня прекрасно работает, может пригодится и поможет. Название программы и ссылки изменены. Не забудьте убрать нижнее подчёркивание из названия секции [_Code]
Скрипт полный
Код:

;InnoSetupVersion=5.6.1 (Unicode)
#pragma include __INCLUDE__ + ";" + ReadReg(HKLM, "Software\Mitrich Software\Inno Download Plugin", "InstallDir")

#define MyApp "My Super-Puper Programm"
#define ShortName "MSPP"
#define Version "3.4.2"
#define Publisher "by SuperUser"
#define Team "Super Team"
#define URL "http://forum.oszone.net/post-2881225.html"
#define UpdatesURL "https://github.com/SuperUser/SuperTeam/blob/master/update.exe"
#define ExeName "MSPP"
#define Skin "CrystalBlue"

[Setup]
AppId={{E4F0B51A-4567-4C49-AD5D-D9A8B6BBBCF3F}
AppName={#ShortName}
AppVersion={#Version}
AppVerName={#MyApp} v{#Version}
AppPublisher={#MyApp} {#Team}
AppPublisherURL={#URL}
AppSupportURL={#URL}
AppUpdatesURL={#UpdatesURL}
DefaultDirName={sd}\{#ShortName}
DefaultGroupName={#ShortName}
ShowLanguageDialog=no
UninstallDisplayIcon={app}\MSPP.exe
UninstallDisplayName={#ShortName}
AllowNoIcons=yes
OutputDir=.
OutputBaseFilename=setup
SetupIconFile=embedded\myicon.ico
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp
WizardImageAlphaFormat=premultiplied
VersionInfoCompany={#Team}
VersionInfoCopyright={#ShortName} {#Publisher}
VersionInfoDescription={#MyApp} {#Publisher}
VersionInfoVersion={#Version}
Compression=lzma2/max
SolidCompression=Yes

#include <idp.iss>
#include <idplang\Russian.iss>
#include <idplang\German.iss>

[Files]
Source: "embedded\ISSkin\ISSkinU.dll"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\ISSkin\Styles\{#Skin}.cjstyles"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\7z.dll"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\7z.exe"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\7z32.dll"; DestDir: {tmp}; Flags: dontcopy
Source: "embedded\7z32.exe"; DestDir: {tmp}; Flags: dontcopy
Source: "{app}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "embedded\EN\config.ini"; DestDir: "{app}"; Languages: en; Flags: ignoreversion
Source: "embedded\RU\config.ini"; DestDir: "{app}"; Languages: ru; Flags: ignoreversion
Source: "embedded\DE\config.ini"; DestDir: "{app}"; Languages: de; Flags: ignoreversion

[Languages]
Name: "ru"; MessagesFile: "compiler:Languages\Russian.isl"; InfoBeforeFile: "embedded\InfoBefore-ru.rtf"
Name: "en"; MessagesFile: "compiler:Default.isl"; InfoBeforeFile: "embedded\InfoBefore-en.rtf"
Name: "de"; MessagesFile: "compiler:Languages\German.isl"; InfoBeforeFile: "embedded\InfoBefore-de.rtf"

[CustomMessages]
ru.CautionXP64=Для работы программы требуется PowerShell 5.1.%nНа Windows XP 64bit программа не сможет скачивать обновления для конвертации игр и выполнять некоторые другие функции.
ru.CautionVI64=Для работы программы требуется PowerShell 5.1.%nНа Windows Vista 64bit программа не сможет скачивать обновления для конвертации игр и выполнять некоторые другие функции.
ru.Caution7064=На компьютере обнаружена устаревшая версия PowerShell.%nПосле установки программы будет произведено скачивание и установка обновления PowerShell 5.1 для Windows 7 64bit.%n%nПожалуйста, дождитесь завершения обновления!
ru.Caution8064=На компьютере обнаружена устаревшая версия PowerShell.%nПосле установки программы будет произведено скачивание и установка обновления PowerShell 5.1 для Windows 8.0 64bit.%n%nПожалуйста, дождитесь завершения обновления!
ru.Caution8164=На компьютере обнаружена устаревшая версия PowerShell.%nПосле установки программы будет произведено скачивание и установка обновления PowerShell 5.1 для Windows 8.1 64bit.%n%nПожалуйста, дождитесь завершения обновления!
ru.CautionXP32=Для работы программы требуется PowerShell 5.1.%nНа Windows XP 32bit программа не сможет скачивать обновления для конвертации игр и выполнять некоторые другие функции.
ru.CautionVI32=Для работы программы требуется PowerShell 5.1.%nНа Windows Vista 32bit программа не сможет скачивать обновления для конвертации игр и выполнять некоторые другие функции.
ru.Caution7032=На компьютере обнаружена устаревшая версия PowerShell.%nПосле установки программы будет произведено скачивание и установка обновления PowerShell 5.1 для Windows 7 32bit.%n%nПожалуйста, дождитесь завершения обновления!
ru.Caution8132=На компьютере обнаружена устаревшая версия PowerShell.%nПосле установки программы будет произведено скачивание и установка обновления PowerShell 5.1 для Windows 8.1 32bit.%n%nПожалуйста, дождитесь завершения обновления!

en.CautionXP64=The program requires PowerShell 5.1.%nOn Windows XP 64bit, the program will not be able to download updates for converting games and perform some other functions.
en.CautionVI64=The program requires PowerShell 5.1.%nOn Windows Vista 64bit, the program will not be able to download updates for converting games and perform some other functions.
en.Caution7064=An outdated version of PowerShell has been detected on your computer.%nAfter installing the program, the PowerShell 5.1 update for Windows 7 64bit will be downloaded and installed.%n%nPlease wait until the update is complete!
en.Caution8064=An outdated version of PowerShell has been detected on your computer.%nAfter installing the program, the PowerShell 5.1 update for Windows 8.0 64bit will be downloaded and installed.%n%nPlease wait until the update is complete!
en.Caution8164=An outdated version of PowerShell has been detected on your computer.%nAfter installing the program, the PowerShell 5.1 update for Windows 8.1 64bit will be downloaded and installed.%n%nPlease wait until the update is complete!
en.CautionXP32=The program requires PowerShell 5.1.%nOn Windows XP 32bit, the program will not be able to download updates for converting games and perform some other functions.
en.CautionVI32=The program requires PowerShell 5.1.%nOn Windows Vista 32bit, the program will not be able to download updates for converting games and perform some other functions.
en.Caution7032=An outdated version of PowerShell has been detected on your computer.%nAfter installing the program, the PowerShell 5.1 update for Windows 7 32bit will be downloaded and installed.%n%nPlease wait until the update is complete!
en.Caution8132=An outdated version of PowerShell has been detected on your computer.%nAfter installing the program, the PowerShell 5.1 update for Windows 8.1 32bit will be downloaded and installed.%n%nPlease wait until the update is complete!

de.CautionXP64=Das Programm erfordert PowerShell 5.1.%nUnter Windows XP 64bit kann das Programm keine Updates zum Konvertieren von Spielen herunterladen und einige andere Funktionen ausführen.
de.CautionVI64=Das Programm erfordert PowerShell 5.1.%nUnter Windows Vista 64bit kann das Programm keine Updates zum Konvertieren von Spielen herunterladen und einige andere Funktionen ausführen.
de.Caution7064=Auf Ihrem Computer wurde eine veraltete Version von PowerShell erkannt.%nNach der Installation des Programms wird das PowerShell 5.1-Update für Windows 7 64bit heruntergeladen und installiert.%n%nBitte warten Sie bis das Update abgeschlossen ist!
de.Caution8064=Auf Ihrem Computer wurde eine veraltete Version von PowerShell erkannt.%nNach der Installation des Programms wird das PowerShell 5.1-Update für Windows 8.0 64bit heruntergeladen und installiert.%n%nBitte warten Sie bis das Update abgeschlossen ist!
de.Caution8164=Auf Ihrem Computer wurde eine veraltete Version von PowerShell erkannt.%nNach der Installation des Programms wird das PowerShell 5.1-Update für Windows 8.1 64bit heruntergeladen und installiert.%n%nBitte warten Sie bis das Update abgeschlossen ist!
de.CautionXP32=Das Programm erfordert PowerShell 5.1.%nUnter Windows XP 32bit kann das Programm keine Updates zum Konvertieren von Spielen herunterladen und einige andere Funktionen ausführen.
de.CautionVI32=Das Programm erfordert PowerShell 5.1.%nUnter Windows Vista 32bit kann das Programm keine Updates zum Konvertieren von Spielen herunterladen und einige andere Funktionen ausführen.
de.Caution7032=Auf Ihrem Computer wurde eine veraltete Version von PowerShell erkannt.%nNach der Installation des Programms wird das PowerShell 5.1-Update für Windows 7 32bit heruntergeladen und installiert.%n%nBitte warten Sie bis das Update abgeschlossen ist!
de.Caution8132=Auf Ihrem Computer wurde eine veraltete Version von PowerShell erkannt.%nNach der Installation des Programms wird das PowerShell 5.1-Update für Windows 8.1 32bit heruntergeladen und installiert.%n%nBitte warten Sie bis das Update abgeschlossen ist!

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"

[Icons]
Name: "{group}\{#ShortName}"; Filename: "{app}\{#ExeName}"
Name: "{group}\{cm:ProgramOnTheWeb,{#ShortName}}"; Filename: "{#URL}"
Name: "{group}\{cm:UninstallProgram,{#ShortName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#ShortName}"; Filename: "{app}\{#ExeName}"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#ShortName}"; Filename: "{app}\{#ExeName}"; Tasks: quicklaunchicon

[Run]
Filename: "{app}\{#ExeName}"; Description: "{cm:LaunchProgram,{#StringChange(ShortName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

[_Code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:ISSkinU.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:ISSkinU.dll stdcall';
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';

function IsWindowsVersionOrNewer(Major, Minor: Integer): Boolean;
var
  Version: TWindowsVersion;
begin
  GetWindowsVersionEx(Version);
  Result := (Version.Major > Major) or ((Version.Major = Major) and (Version.Minor >= Minor));
end;

function IsWindowsXPOrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(5, 1); end;
function IsWindowsViOrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(6, 0); end;
function IsWindows70OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(6, 1); end;
function IsWindows80OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(6, 2); end;
function IsWindows81OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(6, 3); end;
function IsWindows10OrNewer: Boolean; begin Result := IsWindowsVersionOrNewer(10,0); end;

function InitializeSetup(): Boolean;
begin
  ExtractTemporaryFile('{#Skin}.cjstyles');
  LoadSkin(ExpandConstant('{tmp}\{#Skin}.cjstyles'), '');
        Result := True;
end;

// Скачиваем PowerShell 5.1 под нашу версию Windows и битность...
procedure InitializeWizard;
var
  PSVersion: String;
begin
  RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine','PowerShellVersion', PSVersion);
  if Copy(PSVersion,1,3) < '5.1' then
  begin
    if IsWin64 then
    begin
      if IsWindowsXPOrNewer and not IsWindowsViOrNewer then begin MsgBox(ExpandConstant('{cm:CautionXP64}'),mbCriticalError, MB_OK); end else
      if IsWindowsViOrNewer and not IsWindows70OrNewer then begin MsgBox(ExpandConstant('{cm:CautionVI64}'),mbCriticalError, MB_OK); end else
      if IsWindows70OrNewer and not IsWindows80OrNewer then begin MsgBox(ExpandConstant('{cm:Caution7064}'), mbInformation, MB_OK);
        idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win7AndW2K8R2-KB3191566-x64.zip',ExpandConstant('{tmp}\Win7AndW2K8R2-KB3191566-x64.zip'),68076477); end else
      if IsWindows80OrNewer and not IsWindows81OrNewer then begin MsgBox(ExpandConstant('{cm:Caution8064}'), mbInformation, MB_OK);
        idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/W2K12-KB3191565-x64.msu',ExpandConstant('{tmp}\W2K12-KB3191565-x64.msu'),21585220); end else
      if IsWindows81OrNewer and not IsWindows10OrNewer then begin MsgBox(ExpandConstant('{cm:Caution8164}'), mbInformation, MB_OK);
        idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win8.1AndW2K12R2-KB3191564-x64.msu',ExpandConstant('{tmp}\Win8.1AndW2K12R2-KB3191564-x64.msu'),19878906); end;
    end
    else
    begin
      if IsWindowsXPOrNewer and not IsWindowsViOrNewer then begin MsgBox(ExpandConstant('{cm:CautionXP32}'),mbCriticalError, MB_OK); end else
      if IsWindowsViOrNewer and not IsWindows70OrNewer then begin MsgBox(ExpandConstant('{cm:CautionVI32}'),mbCriticalError, MB_OK); end else
      if IsWindows70OrNewer and not IsWindows80OrNewer then begin MsgBox(ExpandConstant('{cm:Caution7032}'), mbInformation, MB_OK);
        idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win7-KB3191566-x86.zip',ExpandConstant('{tmp}\Win7-KB3191566-x86.zip'),44821734); end else
      if IsWindows81OrNewer and not IsWindows10OrNewer then begin MsgBox(ExpandConstant('{cm:Caution8132}'), mbInformation, MB_OK);
        idpAddFileSize('https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win8.1-KB3191564-x86.msu',ExpandConstant('{tmp}\Win8.1-KB3191564-x86.msu'),15231117); end;
    end;
    idpDownloadAfter(wpReady);
  end;
end;

// Во время показа страницы загрузки открываем по умолчанию скрытые детали загрузки...
procedure CurPageChanged(CurPageID: Integer);
begin
 if Assigned(IDPForm.Page) then
  begin
  if CurPageID = IDPForm.Page.ID then
    begin
    // Показать детали загрузки
    idpShowDetails(True);
    // Скрываем кнопку Подробно/Скрыть
    IDPForm.DetailsButton.Visible := False;
    end;
  end;
end;

// Распаковываем ранее скачанный ZIP/MSU и запускаем установку...
procedure CurStepChanged(CurStep: TSetupStep);
var
  ResultCode: Integer;
begin
  if CurStep = ssPostInstall then
  begin
    if IsWin64 then
    begin
      if FileExists(ExpandConstant('{tmp}\Win7AndW2K8R2-KB3191566-x64.zip')) then
      begin
        ExtractTemporaryFile('7z.exe');
        ExtractTemporaryFile('7z.dll');
        ShellExec('open',ExpandConstant('{tmp}\7z.exe'),ExpandConstant('x -y -oExtractedArchive ')+ExpandConstant('Win7AndW2K8R2-KB3191566-x64.zip'),'',SW_HIDE,ewWaitUntilTerminated,ResultCode);
        ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\ExtractedArchive\Win7AndW2K8R2-KB3191566-x64.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
      end;
      if FileExists(ExpandConstant('{tmp}\W2K12-KB3191565-x64.msu')) then ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\W2K12-KB3191565-x64.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
      if FileExists(ExpandConstant('{tmp}\Win8.1AndW2K12R2-KB3191564-x64.msu')) then ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\Win8.1AndW2K12R2-KB3191564-x64.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
    end
    else
    begin
      if FileExists(ExpandConstant('{tmp}\Win7-KB3191566-x86.zip')) then
      begin
        ExtractTemporaryFile('7z32.exe');
        ExtractTemporaryFile('7z32.dll');
        ShellExec('open',ExpandConstant('{tmp}\7z32.exe'),ExpandConstant('x -y -oExtractedArchive ')+ExpandConstant('Win7-KB3191566-x86.zip'),'',SW_HIDE,ewWaitUntilTerminated,ResultCode);
        ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\ExtractedArchive\Win7-KB3191566-x86.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
      end;
      if FileExists(ExpandConstant('{tmp}\Win8.1-KB3191564-x86.msu')) then ShellExec('open',ExpandConstant('{sys}\wusa.exe'),ExpandConstant('{tmp}\Win8.1-KB3191564-x86.msu'),'',SW_SHOWNORMAL,ewWaitUntilTerminated,ResultCode);
    end;
  end;
end;

procedure DeinitializeSetup();
begin
  ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
  UnloadSkin();
end;


Romann_ 07-08-2019 06:26 2882967

Цитата:

Цитата Romann_
так же разрядность системы »

Нашёл необходимый код, имеем такое:
Код:


procedure UpdateInfo();
var
  DeviceName, DeviceKey: String;
begin
  ChangeText := False

  GetWindowsVersionEx(Version)

  // Операционная система:
  SystemVersionPanel.Color := clBlack
    SystemVersionPanel.Font.Color := clGreen

  DeviceKey := 'Software\Microsoft\Windows NT\CurrentVersion'
  if not UsingWinNT then StringChange(DeviceKey, 'Windows NT', 'Windows')
        RegQueryStringValue(HKLM, DeviceKey, 'ProductName', DeviceName)
  if RegQueryStringValue(HKLM, DeviceKey, 'CSDVersion', DeviceKey) then
    DeviceName := DeviceName + ' ' + DeviceKey
        StringChange(DeviceName, 'Microsoft ', '')
  SystemVersionPanel.Text := ' ' + DeviceName + ' сборка ' + IntToStr(Version.Major) + '.' + IntToStr(Version.Minor) +
                            '.' + IntToStr(Version.Build)

  if (Pos('Windows 10', SystemVersionPanel.Text) = 0) and  // Windows 10
    (Pos('Windows 7', SystemVersionPanel.Text) = 0) then  // Windows 7
    begin
      SystemVersionPanel.Color := clBlack
      SystemVersionPanel.Font.Color := clRed
      ChangeText := True
    end
...
...
...

Всё работает. Но как можно ещё проверить разрядность системы?

ErikPshat 07-08-2019 08:34 2882970

Цитата:

Цитата Romann_
Но как можно ещё проверить разрядность системы? »

Вы уже третий раз задаёте один и тот же вопрос :) Выше же я вам дал код определения разрядности системы, просто там в соответствии с разрядностью идёт скачивание PowerShell определённой версии и разрядности, а вам надо было просто подменить тот код на вывод информации на экран, либо воспроизведение каких-либо действий, по вашему желанию.
В общем вот вам чистый код по определению разрядности с подробными комментариями "//", строки с комментариями можете после осознования удалить, простая функция Inno Setup:
Код:

// До секции CODE прописываем свои текстовые сообщения, чтобы не отнимать место в коде программы в секции CODE:

[CustomMessages]
Info-text-x64=У вас разрядность системы Windows - x64.%nЭто значит, что система 64-битная.%n%nНе переживайте, всё будет хорошо.
Info-text-x86=У вас разрядность системы Windows - x86.%nЭто значит, что система 32-битная.%n%nНе переживайте, всё будет хорошо.

// То, что ниже, пишем в секции CODE:

// Если у вас x64, тогда...
if IsWin64 then
    // Выполняем в таком случае код между "begin" и "end" (между стартом и концом):
    begin
        // Выводим оповещение об разрядности x64 на экран:
        MsgBox(ExpandConstant('{cm:Info-text-x64}'), mbInformation, MB_OK);
    end

// В противном случае (т.е. если у вас не x64, а значит x86):
else
    // Выполняем в таком случае код между "begin" и "end" (между стартом и концом)
    begin
        // Выводим оповещение об разрядности x86 на экран
        MsgBox(ExpandConstant('{cm:Info-text-x86}'), mbInformation, MB_OK);
    end;


Карась з Днiпра 26-09-2019 02:21 2889614

Здраствуйте. Подскажите пожалуйста, как добавить программу в автозагрузку так, чтобы аваст не ругался?
Сейчас используется строка
Name: "{commonstartup}\Активація перекладу"; Filename: "{app}\ua_lang\Активація перекладу.exe"; Components: translate\auto; AfterInstall: ExecStartupFile()

Находит IDP.Generic.

Сама программа абсолютно безвредна. Даже если новосозданный текстовик переименовать в "Активація перекладу.exe" и скомпилировать скрипт, реакция аваста всё та же - IDP.Generic.

Это однозначно должно как-то исправляться. Очень прошу вашего совета.

iglezz 26-09-2019 09:12 2889636

Карась з Днiпра,
Аваст, видимо, параноит на слово "Активація" в сочетании с расширением/типом исполняемого файла.

Попробовать исправить это можно:
1. изменением имени файла, если это допустимо
2. хранением внутри установщика файла под другим именем с переименовыванием после копирования в место назначения.
3. защитой паролем/шифрование имён внутри архива/установщика, чтобы антивирус не видел имён файлов.
4. обращением к разработчикам Аваста, чтобы они после проверки добавили этот .exe в исключения.
5. <что-нибудь связанное с заменой этого параноика на более адекватное решение>.
6. ....

Карась з Днiпра 26-09-2019 12:05 2889663

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

ErikPshat 26-09-2019 12:25 2889666

Цитата:

Цитата Карась з Днiпра
Активація перекладу.exe »

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

Карась з Днiпра 26-09-2019 13:29 2889678

Да уже 4 антивируса убрали ложные детекты после отправки им этого файла. 2 на очереди, рассматривают, и к одному еще не достучался.

Аваст полностью успокоился, чего я, сказать честно, не ожидал. Он 1 из 4.

Raymans 10-10-2019 21:47 2891568

дел

Iska 10-10-2019 23:36 2891576

Raymans, попробуйте перевести поток Вашего сознания в более осмысленный вид.

Raymans 10-10-2019 23:50 2891580

дел

Iska 11-10-2019 01:40 2891589

Raymans, пингуются не сайты, пингуются доменные имена и соответствующие им адреса. Сайты же могут быть либо доступны, либо недоступны — по совершенно другому протоколу.

Raymans 11-10-2019 03:31 2891595

дел

Iska 11-10-2019 06:34 2891601

Цитата:

Цитата Raymans
так всё же можно ли это сделать ? »

Можно. Ждите, пока кто-нибудь не восхочет сделать сие для Вас.

El Sanchez 11-10-2019 11:28 2891636

Цитата:

Цитата Raymans
при запуске скрипт проверяет сайт и если он пингуется то не установится программа.ну а если пинга нет то устанавливается программа. »

Raymans,
Скрытый текст

Код:

function InitializeSetup: Boolean;
var
  ResultCode: Integer;
begin
  Result := Exec(ExpandConstant('{cmd}'), '/c ping -n 2 google.ru|find "TTL="', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) and
    (ResultCode = 0);
end;


Raymans 11-10-2019 13:05 2891646

El Sanchez огромное вам спасибо вы очень сильно мне помогли :) Низкий вам поклон :clapping:

ErikPshat 11-10-2019 17:43 2891690

А я не понимаю, какой смысл был помогать индивидууму, который, больше трёх букв "дел", составить предложение не в состоянии?
И зачем вести беседу с такими, у которых даже не хватает мозгов, чтобы хоть как-то уяснить, что такое запятая, не говоря уже о сочетаниях слов, а тем-более - о синтаксисе кода. Сорри.

Raymans 11-10-2019 18:48 2891694

Цитата:

Цитата ErikPshat
А я не понимаю, какой смысл был помогать индивидууму, который, больше трёх букв "дел", составить предложение не в состоянии?
И зачем вести беседу с такими, у которых даже не хватает мозгов, чтобы хоть как-то уяснить, что такое запятая, не говоря уже о сочетаниях слов, а тем-более - о синтаксисе кода. Сорри. »

я суть проблемы разъяснил человек помог что вам не ясно? удалил вопросы чтоб не мозолила глаза или вам интересно что там было?!а такие как вы индивидуумы встряли вообще кому помогут или только за деньги!
а по части мозгов я больше чем уверен что у вас намного меньше их чем у меня!то что я немного не знаю в программе не значит что я тупой!хотите дальше крякайте сколько вам влезет!

Nordek 11-10-2019 22:17 2891716

Цитата:

Цитата Raymans
я суть проблемы разъяснил человек помог что вам не ясно? »

Пожалуйста, попробуйте воспринимать тот факт что, обратившись на форум - Решение проблемы "уже" не только ваше (Объясняется тем, что кому-то это тоже понадобится. Например вспоминаю как некоторые нуждались в этом ответе, на который не единожды предоставляли ссылку.).

То что вы сделали является не только дурным тоном, но и ставите человека который вам помог в неловкое положение (Для общего понимания). Также создаст неприятное мнение о вопрошающем - Которому в будущем не захочется помочь.
Вы сделали очень некрасивый жест тем, что удалили предложения в своих сообщениях: От чего смысл для некоторых "зачем это" - Теряется.

Также в действующей информации, точнее в пункте 2.4 объясняется что к сожалению "для вас (как бы вам хотелось)" - Это форум, это не чат.

И вы пишите:
Цитата:

Цитата Raymans
Низкий вам поклон »

Так в действительности проявляйте уважение к El Sanchez, он обратил на вашу проблему внимание.

А также стоит обратить внимание на раздел Помощь, там есть пункт Как я могу отметить сообщение полезным? - Отметив сообщение соответствующим образом вы не только скажите "Спасибо", но и подтвердите что вам решение помогло.

Raymans 12-10-2019 00:14 2891727

хорошо теперь я понял. прошу прощение за мои действия .
просто я подумал что цитат вполне хватит чтоб понять суть. "при запуске скрипт проверяет сайт и если он пингуется то не установится программа.ну а если пинга нет то устанавливается программа."
больше такого не повторится .

Nordek 12-10-2019 00:54 2891733

Цитата:

Цитата Raymans
чтоб понять суть. »

Суть проблемы описывается в начале, т.е в первом вашем сообщении , а не в конце когда вам ответили - Далее объяснение ниже.

Цитата:

Цитата Raymans
просто я подумал что цитат вполне хватит »

Иначе создаётся ощущение что ответивший каким-то образом "угадал" что вы хотели написать - Но не написали (Что тоже является дурным тоном).

Спасибо за понимание.

Respin 15-10-2019 02:27 2892078

Всем доброго времени суток :) В инсталляторе создаётся окно, оно имеет идентификатор HWND. К этому окну подключается .dll, в котором показывается информация. Скажите, пожалуйста, можно ли изменить цвет этого окна? Просто по умолчанию оно белое, а на тёмном дизайне, это выглядит, мягко говоря, стрёмно :sorry:

habib2302 15-10-2019 14:27 2892150

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



Это не помогает

[Setup]
DisableReadyPage=yes

[Code]
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if
(PageID = 10) then
Result:= True;
end;


nik1967 16-10-2019 09:45 2892256

habib2302, воспользоваться советом LexBell с krinkels'а
Как скрыть все страницы инсталлятора?
http://krinkels.org/threads/faq-po-i...ge-2#post-6193
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[code]
function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result:=true;//  просто пропускаем все страницыю Останется страница готовности - ее просто так не скрыть.
end;

procedure WizardFormShow(Sender: TObject);
begin
  WizardForm.NextButton.OnClick(nil); // нажимает на кнопку далее, в момент показа окна инсталла.
end;

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    Left:=-10000; //  задвигаем окно инсталла далеко за край экрана, чтоб его совсем не было видно.
    Show; //  без этой строчки будет ошибка при вызове OnShow.
    OnShow := @WizardFormShow;
  end;
end;


fyodorovma 28-10-2019 16:05 2893863

Добрый день.
Нужно при компиляции скрипта через командную строку передать параметр с путем к файлам, который использовать в разделе Files, н-р:
compil32 "script.iss" -CmdPath "D:\Samples"

script.iss:

#define DefPath "D:\Install"

[Files]
Source: {param:CmdPath|DefPath}\Install\App.exe; DestDir: {app};

В документации не нашел, как такое реализовать?

niksan29 04-11-2019 09:35 2894675

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

nik1967 04-11-2019 11:26 2894685

niksan29,
Необходимо чтобы инсталлер, после хотя бы одной установки, в дальнейшем предлагал установку в тот же каталог, что, и ранее, подскажите как это можно организовать
Код:

[Setup]
AppName=My programm
AppVerName=My programm v1.1
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppName")}_is1,Path|{pf}\{#SetupSetting("AppName")}}


boss911 04-11-2019 16:42 2894711

Цитата:

Цитата niksan29
чтобы инсталлер, после хотя бы одной установки, в дальнейшем предлагал установку в тот же каталог, что, и ранее »

По умолчанию, Inno Setup всегда использует каталог предыдущей установки (UsePreviousAppDir=yes), то есть, дополнительно для этого ничего делать не нужно, при условии, если вы не меняли дефолтное значение параметров UsePreviousAppDir, CreateUninstallRegKey и Uninstallable в секции [Setup].

Все, что я вам порекомендую сделать, это включить постоянное отображение страницы выбора папки назначения:
Код:

[Setup]
DisableDirPage=no

- по умолчанию значение 'auto' - страница отключается при повторной установке приложения.

niksan29 05-11-2019 08:19 2894778

nik1967, как сказал товарищ
boss911, inno путь по умолчанию,вроде как и так запоминает, позвольте узнать,в чем отличие кода который привели Вы?
И ещё вопрос, а если перед установкой новой версии(того что ставим инсталлером, созданным с помощью inno), старую удаляем, то Inno в таком случае будет помнить путь, или нет?
И, спасибо за быстрые ответы;)

boss911 05-11-2019 10:09 2894787

Цитата:

Цитата niksan29
в чем отличие кода который привели Вы? »

В том, что ни каких каких изменений по сути проводить не нужно, так как это штатная ситуация инсталлятора, работает по умолчанию. Короче, указывать в DefaultDirName штатный параметр 'Path' в ветке реестра Uninstall - лишнее, имхо, но можно и так, только зачем.

Цитата:

Цитата niksan29
если перед установкой новой версии, старую удаляем, то Inno в таком случае будет помнить путь, или нет? »

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

niksan29 05-11-2019 13:01 2894842

Цитата:

Цитата boss911
если перед установкой новой При деинсталляции штатным деинсталлятором, в реестре удаляется запись об установленном продукте, в которой содержится путь, куда был установлен этот продукт.

А вот это, как то можно обойти?
По сути как раз, это самая важная задача: это чтобы этого не происходило, т.к перед установкой обновления, обязательно надо удалять старую версию...
А т.к обновления будут выходить досточно часто, то каждый раз выбирать каталог установки по новой будет не совсем удобно, тем более инсталлеров при обновлении будет около 5-7 разово(данные разбиты по регионам, каждый устанавливает необходимые по одному, или же по очереди все).

boss911 06-11-2019 00:05 2894927

Цитата:

Цитата niksan29
т.к перед установкой обновления, обязательно надо удалять старую версию... »

Нужно больше информации, сейчас многое не ясно, посему куча вопрсов. У вас есть некий основной установленный продукт, который нужно обновлять? Что за тип обновлений, это обновление программных файлов основного ПО до новой версии или обновление некой базы/ресурсов для этого ПО? Обновления выпускаются отдельным инсталляционным пакетом или в виде полного дистрибутива ПО с уже обновленными в нем компонентами? С какой целью сначала нужно удалить старую версию обновлений (или все ПО?), перед установкой новой версии обновлений? Обновления ставятся в отдельный каталог, это строгий путь? Чем больше информации, тем лучше, на гадание и выпрашивание тут ни у кого нет времени.

niksan29 06-11-2019 11:11 2894963

База данных для ПО, отдельные инсталляционные пакеты около 7(число может меняться) штук , количество необходимых пакетов выбирает пользователь(исходя из его требований/желаний), может быть и 1 из 7 а может и все 7...
Уделяется старые версии с той целью, чтобы каталог очищался и не было конфликтов после установки новой версии , т.к некоторые файлы просто могут отсутствовать в новой версии, соответственно если перед обновлением не почистить каталог, то они(старые старые файлы, которых теперь в обновление нет) останутся и будут мешать...
Обновление может ставиться в любой каталог и уже потом, в самом ПО указывается путь до базы и сохраняется...

boss911 06-11-2019 18:24 2895027

niksan29

На всякий случай уточню, вам нужно, чтобы при установке очередного обновления (отдельный инсталляционный пакет), путь для установки был аналогичен тому, куда было установлено предыдущее обновление, при этом, каталог назначения должен быть очищен перед установкой нового обновления? Тогда пропишите в скрипте обновления следующие:
Код:

[InstallDelete]
Name: {app}\Base; Type: filesandordirs

Таким образом, каждое новое обновление можете ставить поверх предыдущего, то есть без предварительной деинсталляции предыдущего, оно сначала удалит в каталоге назначения указанную папку со всем содержимым, только потом начнется установка/распаковка. Например, для установки обновления указан путь "%ProgramFiles%\My Program", тогда оно сначала удалит "%ProgramFiles%\My Program\Base" со всем содержимым, потом начнет устанавливать. Предупреждаю (!), никогда не указывайте для удаления каталог "{app}", так как при не правильных действиях пользователя, может произойти не поправимое, всегда указывайте конкретную конечную папку/файл для удаления, чем уникальней имя, тем лучше.

habib2302 07-11-2019 12:32 2895107

Доброе время суток. Может будет у кого нибудь желание и время переделать скрипт сделанный под IS Ultra под стандартную версию IS v6.x
https://drive.google.com/file/d/1OJG...ew?usp=sharing
Просто хочу перейти на стандартную версию, а чтобы довести до рабочего состояния ума не хватает

El Sanchez 10-11-2019 15:01 2895567

Цитата:

Цитата habib2302
хочу перейти на стандартную версию, а чтобы довести до рабочего состояния ума не хватает »

habib2302, пробуйте:
Скрытый текст

Код:

#define AppName "HxD Hex Editor"
#define AppVersion "2.3"

[Setup]
AppName={#AppName}
AppVerName={#AppName} {#AppVersion}
AppId=HxD
AppVersion={#AppVersion}
AppCopyright=Xabib © 2019
AppPublisher=Mael Horz
AppPublisherURL=https://mh-nexus.de/
AppSupportURL=https://mh-nexus.de/hxd/
AppUpdatesURL=https://mh-nexus.de/hxd/
AllowNoIcons=yes
DefaultDirName={code:GetDefaultDirName}\HxD
DefaultGroupName={#AppName}
DisableWelcomePage=yes
DisableReadyPage=yes
DisableFinishedPage=yes
DirExistsWarning=no
PrivilegesRequiredOverridesAllowed=dialog
SetupIconFile=Install.ico
UninstallDisplayIcon={code:GetMainExeFileName}
UninstallDisplayName={#AppName} {#AppVersion}
OutputBaseFilename={#AppName} {#AppVersion} RePack (& Portable) by Xabib
VersionInfoDescription={#AppName} RePack by Xabib
VersionInfoVersion={#AppVersion}
Compression=lzma2/ultra64
SolidCompression=true
InternalCompressLevel=ultra64
LZMADictionarySize=65536
LZMAMatchFinder=BT
LZMANumFastBytes=273
ArchitecturesInstallIn64BitMode=x64
Uninstallable=not IsInPortableMode
WizardSmallImageFile=WizardSmallImage0.bmp

[Languages]
Name: enu; MessagesFile: compiler:default.isl
Name: rus; MessagesFile: compiler:Languages\russian.isl

[Messages]
BeveledLabel=RePack by Xabib
SelectLanguageTitle={#AppName}

[CustomMessages]
enu.CreateConfigShowOptions=Show options window (when finishing install)
enu.CreateDefaultConfig=Create default configuration
enu.ForbiddenDirMessage=In portable mode, %1 should not be installed in "Program Files" or similar system directories.
enu.InstallModePageCaption=Pick Installation Mode
enu.InstallModePageDescription=Do you prefer integration into Windows or a portable installation?
enu.InstallModePageNormalOption=Normal - Integrates into Windows
enu.InstallModePagePortableOption=Portable - Supports removeable drives (e.g., USB pen drives)
enu.InstallModePageSubCaption=Choose a normal installation that integrates into Windows (e.g., Startmenu, optional Explorer context menu), or a portable installation that can run on any compatible Windows machine.
enu.LanguageFilesComponent=Languages
enu.OpenInstallFolderAfterInstall=Open installation target folder
enu.ProgramFilesComponent=Program Files
enu.StatusRunHxDToCreateConfigFile=Create configuration file...
enu.TaskConfigurationFile=Configuration file:
enu.WriteProtectConfig=Make readonly
enu.PortableButtonInstall=&Unpack
rus.CreateConfigShowOptions=Показать окно параметров (после завершения установки)
rus.CreateDefaultConfig=Создать конфигурацию по умолчанию
rus.ForbiddenDirMessage=В портативном режиме %1 не следует устанавливать в «Program Files» или аналогичных системных каталогах.
rus.InstallModePageCaption=Выберите тип установки
rus.InstallModePageDescription=Предпочитаете интеграцию в Windows или портативную версию?
rus.InstallModePageNormalOption=Нормальная - интеграция в Windows
rus.InstallModePagePortableOption=Портативная - поддерживает переносимые устройства (USB/HDD)
rus.InstallModePageSubCaption=Выберите нормальный тип для установки программы в Windows (добавление в меню Пуск, опционально в контекстное меню) или портативную для работы программы на любом ПК, совместимым с Windows
rus.LanguageFilesComponent=Языки
rus.OpenInstallFolderAfterInstall=Открыть папку установки
rus.ProgramFilesComponent=Program Files
rus.StatusRunHxDToCreateConfigFile=Создать файл конфигурации...
rus.TaskConfigurationFile=Файл конфигурации:
rus.WriteProtectConfig=Сделать доступным только для чтения
rus.PortableButtonInstall=&Распаковать

[Files]
Source: {app}\HxD32_enu.exe; DestDir: {app}; DestName: HxD.exe; Languages: enu; Flags: replacesameversion; Check: not IsInPortableMode and not IsWin64
Source: {app}\HxD32_enu.exe; DestDir: {app}; DestName: HxD32.exe; Languages: enu; Flags: replacesameversion; Check: IsInPortableMode
Source: {app}\HxD64_enu.exe; DestDir: {app}; DestName: HxD.exe; Languages: enu; Flags: replacesameversion; Check: not IsInPortableMode and IsWin64
Source: {app}\HxD64_enu.exe; DestDir: {app}; DestName: HxD64.exe; Languages: enu; Flags: replacesameversion; Check: IsInPortableMode and IsWin64
Source: {app}\HxD32_rus.exe; DestDir: {app}; DestName: HxD.exe; Languages: rus; Flags: replacesameversion; Check: not IsInPortableMode and not IsWin64
Source: {app}\HxD32_rus.exe; DestDir: {app}; DestName: HxD32.exe; Languages: rus; Flags: replacesameversion; Check: IsInPortableMode
Source: {app}\HxD64_rus.exe; DestDir: {app}; DestName: HxD.exe; Languages: rus; Flags: replacesameversion; Check: not IsInPortableMode and IsWin64
Source: {app}\HxD64_rus.exe; DestDir: {app}; DestName: HxD64.exe; Languages: rus; Flags: replacesameversion; Check: IsInPortableMode and IsWin64

[Registry]
Root: HKCR32; Subkey: *\shell\HxD; Flags: uninsdeletekey dontcreatekey
Root: HKCR32; Subkey: *\shell\HxDReadonly; Flags: uninsdeletekey dontcreatekey
Root: HKCR64; Subkey: *\shell\HxD; Check: IsWin64; Flags: uninsdeletekey dontcreatekey
Root: HKCR64; Subkey: *\shell\HxDReadonly; Check: IsWin64; Flags: uninsdeletekey dontcreatekey

[Run]
Filename: {code:GetMainExeFileName}; Parameters: {code:GetHxDConfigParams}; StatusMsg: {cm:StatusRunHxDToCreateConfigFile}; Check: IsInPortableMode
Filename: {code:GetMainExeFileName}; Description: {cm:LaunchProgram,{#AppName}}; Flags: postinstall skipifsilent nowait; Check: not IsInPortableMode
Filename: {app}; Description: {cm:OpenInstallFolderAfterInstall}; Flags: shellexec postinstall skipifsilent nowait; Check: IsInPortableMode

[Icons]
Name: {group}\HxD; Filename: {code:GetMainExeFileName}; Check: not IsInPortableMode
Name: {autoappdata}\Microsoft\Internet Explorer\Quick Launch\HxD; Filename: {code:GetMainExeFileName}; Tasks: quicklaunchicon; Check: not IsInPortableMode
Name: {autodesktop}\HxD; Filename: {code:GetMainExeFileName}; Tasks: desktopicon; Check: not IsInPortableMode

[Tasks]
Name: createdefaultconfig; Description: {cm:CreateDefaultConfig}; GroupDescription: {cm:TaskConfigurationFile}; Flags: exclusive; Check: IsInPortableMode
Name: createconfigshowoptions; Description: {cm:CreateConfigShowOptions}; GroupDescription: {cm:TaskConfigurationFile}; Flags: exclusive unchecked; Check: IsInPortableMode
Name: makeconfigreadonly; Description: {cm:WriteProtectConfig}; GroupDescription: {cm:TaskConfigurationFile}; Flags: unchecked; Check: IsInPortableMode
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Check: not IsInPortableMode
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Check: not IsInPortableMode

[Code]
var
  InputOptionPage: TInputOptionWizardPage;

function IsInPortableMode: Boolean;
begin
  Result := InputOptionPage.Values[1];
end;

function GetDefaultDirName(const AParam: string): string;
begin
  if ExpandConstant('{param:portable|0}') = '1' then
    Result := ExpandConstant('{userdesktop}') else
    Result := ExpandConstant('{autopf}');
end;

function GetMainExeFileName(const AParam: string): string;
begin
  if not IsInPortableMode then
    Result := ExpandConstant('{app}\HxD.exe')
  else if not IsWin64 then
    Result := ExpandConstant('{app}\HxD32.exe')
  else
    Result := ExpandConstant('{app}\HxD64.exe');
end;

function GetHxDConfigParams(const AParam: string): string;
begin
  Result := '/chooselang:' + ActiveLanguage;
  if IsTaskSelected('createdefaultconfig') then
  begin
    Result := Result + ' /createdefaultconfig:';
    if IsTaskSelected('makeconfigreadonly') then
      Result := Result + 'readonly' else
      Result := Result + 'normal';
  end else
  if IsTaskSelected('createconfigshowoptions') then
  begin
    Result := Result + ' /createconfig:';
    if IsTaskSelected('makeconfigreadonly') then
      Result := Result + 'readonly' else
      Result := Result + 'normal';
  end;
end;

function IsForbiddenDir(const ADir: string): Boolean;
begin
  Result := IsAdminInstallMode and
    ((not IsWin64 and (Pos(ExpandConstant('{win}'), ADir) = 1)) or
    (not IsWin64 and (Pos(ExpandConstant('{commonpf32}'), ADir) = 1)) or
    (IsWin64 and (Pos(ExpandConstant('{commonpf64}'), ADir) = 1)));
end;

procedure InstallModeListBoxClick(Sender: TObject);
begin
  if IsInPortableMode and (CompareText(WizardDirValue, ExpandConstant('{autopf}\HxD')) = 0) then
    WizardForm.DirEdit.Text := ExpandConstant('{userdesktop}\HxD')
  else if not IsInPortableMode and (CompareText(WizardDirValue, ExpandConstant('{userdesktop}\HxD')) = 0) then
    WizardForm.DirEdit.Text := ExpandConstant('{autopf}\HxD');
end;

procedure CreateInstallModePage;
begin
  InputOptionPage := CreateInputOptionPage(wpWelcome, ExpandConstant('{cm:InstallModePageCaption}'),
    ExpandConstant('{cm:InstallModePageDescription}'), ExpandConstant('{cm:InstallModePageSubCaption}'), True, False);
  InputOptionPage.Add(ExpandConstant('{cm:InstallModePageNormalOption}'));
  InputOptionPage.Add(ExpandConstant('{cm:InstallModePagePortableOption}'));
  InputOptionPage.Values[1] := ExpandConstant('{param:portable|0}') = '1';
  InputOptionPage.Values[0] := not InputOptionPage.Values[1];
  InputOptionPage.CheckListBox.OnClickCheck := @InstallModeListBoxClick;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    wpSelectTasks:
      begin
        if not IsInPortableMode then
          WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall) else
          WizardForm.NextButton.Caption := ExpandConstant('{cm:PortableButtonInstall}');
      end;
  end;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  Result := True;
  case CurPageId of
    wpSelectDir:
      if IsInPortableMode then
      begin
        Result := not IsForbiddenDir(WizardDirValue);
        if not Result then
          MsgBox(ExpandConstant('{cm:ForbiddenDirMessage,{#AppName}}'), mbError, MB_OK);
      end;
  end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result := False;
  case PageID of
    wpSelectProgramGroup:
      Result := IsInPortableMode;
  end;
end;

procedure InitializeWizard;
begin
  CreateInstallModePage;
end;


generator324 11-11-2019 17:52 2895724

Подскажите, а можно при написании Inno-установщика как-нибудь импортировать .inf-файл (установка драйвера) для своего инсталлятора?

habib2302 11-11-2019 22:06 2895761

generator324, читаем шапку

generator324 12-11-2019 08:20 2895819

habib2302,
Благодарю, вы имеете ввиду это: http://forum.oszone.net/post-1674976-1599.html ?
Уж очень много всего в шапку понатолкано, глаза смыливаются :(
Про devcon знаю, но если есть devcon, то зачем тогда вообще Inno Setup? Драйвера через devcon просто ставятся из командной строки (если знать HWID устройства), никакой Inno Setup не нужен. Вопрос-то был именно в том, что я, допустим, HWID не знаю совсем (только семейство), но есть .inf-файл в котором это всё перечисленно. И можно ли инжектировать этот .inf напрямую в Inno Setup. Как, например, древний ISTool делал с .reg-файлами - просто добавлял в инсталлятор...

habib2302 12-11-2019 08:30 2895822

generator324, только через innoide в разделе ini есть кнопка импорта ini файлов

generator324 12-11-2019 08:39 2895824

Так я, вроде про .inf писал. ini - совсем "другие яйца", не?

habib2302 12-11-2019 09:20 2895826

generator324,


generator324 12-11-2019 09:54 2895833

habib2302,
Ну, хорошо - он (innoide) походу разницу между .inf / . ini не делает, импортирует "всё, что дают" :ok: . А работать-то это как будет? И будет ли ВООБЩЕ? All Files *.* я могу выбрать и в ISTool - вообще, "затолкать чего-то куда-то" - дело не хитрое...
Меня интересует, если так можно выразится, "обработчик" .inf-файла, прописывающий в скрипт .iss (коль уж тут мы ведём речь о Inno Setup) правильный порядок работы с тем же .inf-файлом. Скажем, если ISTool производит импорт .reg-файла, она его и прописывает в скрипт .iss соответственно; значения потом при установке добавляются в реестр.
А тут чего?

El Sanchez 12-11-2019 10:54 2895843

Цитата:

Цитата generator324
Меня интересует, если так можно выразится, "обработчик" .inf-файла, прописывающий в скрипт .iss (коль уж тут мы ведём речь о Inno Setup) правильный порядок работы с тем же .inf-файлом »

generator324, без сторонних утилит в Inno Setup можно устанавливать только 32-разрядные драйверы через setupapi.dll, например. 32-разрядный код не может устанавливать 64-разрядные драйверы. Поэтому с devcon проще.

generator324 12-11-2019 11:16 2895845

Цитата:

Цитата El Sanchez
без сторонних утилит в Inno Setup можно устанавливать только 32-разрядные драйверы через setupapi.dll, например. 32-разрядный код не может устанавливать 64-разрядные драйверы. »

Мне, в принципе, и нужен был 32-разрядный драйвер RS-485 установить. Просто в автоматическом режиме ;)
Цитата:

Цитата El Sanchez
Поэтому с devcon проще. »

Никто и не спорит ;). Но, повторюсь, нужно знать HWID устройства. А если я его (HWID) не знаю? Вот и хотелось автоматизировать...
А так, повторюсь опять же: и Inno Setup не нужен - просто командная строка (devcon). Но это если знать HWID, что известно не всегда...

ЗЫ. InnoIDE - коммерческий продукт? Что-то я не понял: при попытке скачать перекидывают куда-то :o

habib2302 12-11-2019 15:23 2895881

generator324, попробуйте обратиться в
Ссылка
http://autoit-script.ru/

generator324 12-11-2019 15:44 2895885

Цитата:

Цитата habib2302
попробуйте обратиться в
Ссылка
http://autoit-script.ru/ »

Зачем? Я спросил в теме про Inno, потому что имел с ним дело когда-то. Немного ;).
Что до AutoIt, я знаю про систему автоматизации на его основе, но зачем вплетать сюда что третье? Всё равно без знания HWID ничего не получится (он меняется, так как меняется железка), а реализовать установку посредством devcon мне проще через тот же WSH, чем использовать сэконд стафф...
Вы лучше скажите, где InnoIDE взять ?

Iska 12-11-2019 17:04 2895899

Цитата:

Цитата habib2302
generator324, только через innoide в разделе ini есть кнопка импорта ini файлов »

habib2302, какой смысл пользовать восемь лет как заброшенный продукт? А импорт в проект есть и в Inno Script Studio:
Скрытый текст


Цитата:

Цитата generator324
Вы лучше скажите, где InnoIDE взять ? »

Берите лучше Inno Script Studio - Kymoto Solutions.

generator324 12-11-2019 17:15 2895904

Цитата:

Цитата Iska
Берите лучше Inno Script Studio - Kymoto Solutions. »

Благодарю! Правда, как я понимаю, импорт .inf-файлов всё равно не делает...
А импорт .ini та же древняя ISTool умеет делать - вспомнил сейчас ;)

Kanteren 17-11-2019 14:24 2896769

HKEY_CURRENT_USER\Software\MyProgram
HKEY_LOCAL_MACHINE\SOFTWARE\MyProgram
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyProgram

Как удалить ветки реестра во время и после установки?

El Sanchez 17-11-2019 15:17 2896782

Цитата:

Цитата Kanteren
HKEY_CURRENT_USER\Software\MyProgram
HKEY_LOCAL_MACHINE\SOFTWARE\MyProgram
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyProgram
Как удалить ветки реестра во время и после установки? »

Kanteren,
Скрытый текст

Код:

[Registry]
Root: HKCU; Subkey: Software\MyProgram; Flags: deletekey dontcreatekey
Root: HKLM32; Subkey: SOFTWARE\MyProgram; Flags: deletekey dontcreatekey
Root: HKLM64; Subkey: SOFTWARE\MyProgram; Flags: deletekey dontcreatekey; Check: IsWin64


Adjective 25-11-2019 05:56 2897863

Буквально дублирую предыдущий вопрос:
Как удалить ветку реестра во время и после установки?
Код:

[HKEY_USERS\S-1-5-21-3472633682-696082676-122184224-500\Software\MyProgramr]
При запуске программа сама создает по этому адресу раздел и хранит все свои настройки в нем, а после удаления, этот раздел остаётся!
Если прописать так:
Код:

Root: HKU; Subkey: "S-1-5-21-3472633682-696082676-122184224-500\Software\MyProgramr"; MinVersion: 0.0,5.0; Flags: uninsdeletekey
... то при установке создаётся пустой раздел и при удалении он удаляется. Но что-то мне подсказывает, что это не правильно :).
Насколько я понимаю значимость в этой ветке несёт только значение S-1-5-21, а остальное это путь к профилю и он отличается у всех на ПК.
Заранее благодарен за любую помощь.

boss911 25-11-2019 16:09 2897936

Цитата:

Цитата Adjective
Как удалить ветку реестра во время и после установки? »

Код:

Root: HKU; Subkey: "S-1-5-21-3472633682-696082676-122184224-500\Software\MyProgramr"; Flags: deletekey uninsdeletekey dontcreatekey
Скорее всего, ID, который указан в ветке "S-1-5-21-*", будет уникальным для каждой новой машины/пользователя, но это вам нужно проверить. Тогда этот вопрос нужно будет решать с помощью секции [code] (тут вам другие помогут).

Nordek 25-11-2019 17:30 2897953

Цитата:

Цитата Adjective
Как удалить ветку реестра во время и после установки?
Код:

[HKEY_USERS\S-1-5-21-3472633682-696082676-122184224-500\Software\MyProgramr]
»

Из текщего пользователя:
Код:

HKEY_CURRENT_USER\Software\MyProgramr
Соответственно: Деинсталлятор/Инсталлятор удалит значения текущего пользователя.

Цитата:

Цитата Adjective
Насколько я понимаю значимость в этой ветке несёт только значение S-1-5-21, а остальное это путь к профилю и он отличается у всех на ПК. »

Вы не сможете предугадать когда другой профиль будет загружен.
В HKEY_USERS соответствующий подраздел S-1-5-21-XXX другого профиля будет присутствовать в реестре лишь тогда, когда в профиль будет произведён вход.

Iska 25-11-2019 20:09 2897962

До кучи: S-1-5-21-*-500 — это SID встроенной административной учётной записи (Administrator/Администратор/… etc.). Его RID на машинах ОС Windows всегда равен 500:
Код:

wmic.exe UserAccount where "SID like 'S-1-5-21-%%-500'" Get Name, SID

Dodakaedr 25-11-2019 22:54 2897977

Цитата:

Цитата Adjective
Как удалить ветку реестра во время и после установки? »

Код:

[Registry]
Root: HKCU; Subkey: "Software\MyProgramr"; Flags: deletekey uninsdeletekey


Adjective 26-11-2019 13:06 2898031

Спасибо — boss911, Nordek, Iska и Dodakaedr за отзыв, разъяснение и помощь!
Через HKCU удаляется отлично. Вопрос закрыт, ВСЕМ добра!

Nordek 26-11-2019 19:11 2898075

Цитата:

Цитата Adjective
Через HKCU удаляется отлично. »

Помните, HKEY_CURRENT_USER:
При установке/деинсталляции из текущего пользователя (A) - Полезен только для текущего пользователя (A).
При установке/деинсталляции из текущего пользователя (A) - Для других пользователей (B, C, D) бесполезен.

В будущем: Для преобразования файлов *.reg - Используйте Converter или ISTool.
Inno Script Studio также как ISTool умеет импортировать файлы *.reg, но не всегда корректно.

Converter

ISTool

ald0 07-12-2019 19:43 2899415

Привет всем,

пытаюсь вызвать функцию ShellExecute из подключенной библиотеки, результате выдает что файл не найден. Что я делаю не так?

Код:


[Сode]               

function ShellExecute(hwnd: HWND; lpOperation: string; lpFile: string; lpParameters: string; lpDirectory: string; nShowCmd: Integer) : THandle;
external 'ShellExecuteW@shell32.dll stdcall';

function MessageBox(hWnd: Integer; lpText, lpCaption: AnsiString; uType: Cardinal): Integer;
external 'MessageBoxA@user32.dll stdcall';   

procedure pro();
var s : string;
    res : integer;
begin

res := ShellExecute(0, 'open', 'notepad.exe', '' ,'', SW_SHOW);
s := Format('%d', [res]);
MessageBox(0, 'result=' +s, 'MessageBoxA', MB_OK);

end;


habib2302 12-12-2019 20:59 2900136

web_form, если честно не знаю т.к эти страницы создавались с ноля

nik1967 13-12-2019 11:46 2900206

Цитата:

Цитата web_form
а как сделать чтобы лого показалась во всех пунктах Инсталятора »

В procedure CurPageChanged(CurPageID: Integer);
на соответствующих страницах указать родителя (Parent:= ) лого

habib2302 13-12-2019 12:15 2900208

nik1967, в curPageChanged можно добавить только для финишной страницы. А как быть с cancel page?

module\page.iss
procedure CurPageChanged(CurPageID: integer);
begin
#ifdef WinTB
case CurPageID of
wpWelcome: begin
TaskBarButtonEnabled(hback, false);
end;
wpSelectDir: begin
TaskBarButtonEnabled(hback, true);
TaskBarButtonImage(hnext, hImg2, IMAGE_ICON);
end;
wpInstalling: begin
TaskBarButtonEnabled(hback, false);
TaskBarButtonEnabled(hnext, false);
end;
wpFinished: begin
TaskBarButtonEnabled(hnext, true);
TaskBarButtonEnabled(hcancel, false);
end;
end;
#endif
if CurPageID=wpWelcome then begin
HideComponents;
Bevel2.show;
Bevel3.show;


TextLabel[6].show;
TextLabel[1].show;
WizardForm.BackButton.Caption:= CustomMessage(lang+'ButtonBack');
WizardForm.CancelButton.Caption:= CustomMessage(lang+'ButtonCancel');
WizardForm.NextButton.Caption:= CustomMessage(lang+'Buttonnext');
Background.Show;
WizardForm.CancelButton.Left:=ScaleX(5332);
end;

#ifdef InfoBefore
if CurPageID=wpInfoBefore then begin
HideComponents;
WizardForm.BackButton.Caption:= CustomMessage(lang+'ButtonBack');
WizardForm.CancelButton.Caption:= CustomMessage(lang+'ButtonCancel');
WizardForm.NextButton.Caption:= CustomMessage(lang+'Buttonnext');
TextLabel[38].show;
TextLabel[39].show;
WizardForm.InfoBeforeMemo.Show;
TextLabel[40].show;
Bevel3.Show;
Bevel2.Show;
Bevel4.Show;
Bevel5.Show;
Bevel6.Show;
Bevel7.Show;
Bevel8.Show;
WizardForm.Bevel1.Show;
WizardForm.Bevel1.SetBounds(0,90,WizardForm.ClientWidth,2);
end;
#endif

if CurPageID=wpSelectcomponents then begin
HideComponents;
case ActiveLanguage of
'eng': Application.Title := 'Setup —- « {#GameName} »';
'rus': Application.Title := 'Óñòàíîâêà —- « {#GameName} »';
end;
TextLabel[26].show;
WizardForm.BackButton.Caption:= CustomMessage(lang+'ButtonBack');
WizardForm.CancelButton.Caption:= CustomMessage(lang+'ButtonCancel');
WizardForm.NextButton.Caption:= CustomMessage(lang+'ButtonInstall');
WizardForm.SelectComponentsLabel.show;
//TextLabel[2].show;
TextLabel[7].Show;
Bevel3.Show;
Bevel2.Show;
Background.Hide
Bevel4.Show;
Bevel5.Show;
Bevel6.Show;
Bevel7.Show;
Bevel8.Show;
TextLabel[28].show;
WizardForm.CancelButton.Left:=ScaleX(5332);
WizardForm.Bevel1.Show;
WizardForm.Bevel1.SetBounds(0,90,WizardForm.ClientWidth,2);
WizardForm.ComponentsList.Show;
end;
//-------- Second Page --------\\
if CurPageID=wpSelectDir then begin
HideComponents;
case ActiveLanguage of
'eng': Application.Title := 'Setup —- « {#GameName} »';
'rus': Application.Title := 'Óñòàíîâêà —- « {#GameName} »';
end;
TextLabel[13].show;
TextLabel[29].show;
TextLabel[8].show;
TextLabel[2].show;
TextLabel[14].show;
TextLabel[15].show;
TextLabel[16].show;
TextLabel[17].show;
TextLabel[18].show;
TextLabel[19].show;
TextLabel[20].show;
TextLabel[21].show;
TextLabel[22].show;
WizardForm.CancelButton.Left:=ScaleX(5332);
WizardForm.BackButton.Caption:= CustomMessage(lang+'ButtonBack');
WizardForm.CancelButton.Caption:= CustomMessage(lang+'ButtonCancel');
WizardForm.NextButton.Caption:= CustomMessage(lang+'Buttonnext');
Bevel3.Show;
Bevel2.Show;
Background.hide;
Bevel4.Show;
Bevel5.Show;
Bevel6.Show;
bevel7.Show;
Bevel8.Show;
WizardForm.GroupBrowseButton.Show;
WizardForm.GroupEdit.Show;
WizardForm.DirEdit.Show;
WizardForm.SelectDirLabel.Show;
WizardForm.DirBrowseButton.Show;
GetFreeSpaceCaption(nil);
end;
if CurPageID=wpInstalling then begin
HideComponents;

TextLabel[33].hide;
TextLabel[11].show;
TextLabel[12].show;
TextLabel[3].show;
PauseButton1.show;
WizardForm.CancelButton.Caption:= CustomMessage(lang+'ButtonCancel');
TextLabel[30].show;
Bevel3.Show;
Bevel2.Show;
wizardform.cancelbutton.show;
TextLabel[9].show;
Bevel4.Show;
Bevel5.Show;
Bevel6.Show;
Bevel6.Height:=210;
WizardForm.ProgressGauge.Show;
WizardForm.StatusLabel.Show;
WizardForm.CancelButton.Hide;
WizardForm.CancelButton.Left:=WizardForm.NextButton.Left;
CompactButton.Show;
end;
//--------Game was successfully installed PAGE--------\\
if CurPageID=wpFinished then begin
#ifdef WinTB
WintbStart();
#endif

#ifdef WinTB
Win6TaskBarV1_2(WizardForm.Handle, MainForm.Handle, 0);
#endif
case ActiveLanguage of
'eng': Application.Title := 'Setup —- « {#GameName} »';
'rus': Application.Title := 'Óñòàíîâêà —- « {#GameName} »';
end;
with WizardForm do
begin
AutoScroll := False;
ClientHeight := ScaleY(411);
ClientWidth := ScaleX(584);
Position := poScreenCenter;
lPLogo:= ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(214), ScaleY(368), ScaleX(158), ScaleY(37), True, True);
ImgApplyChanges(WizardForm.Handle);
end;
WizardForm.NextButton.Caption:= CustomMessage(lang+'Buttonfinish');
with langBtn do
begin
Height := ScaleY(30);
Left := ScaleX(5);
Top := ScaleY(372);
Width := ScaleX(31)
OnClick:= @LangBtnClick;
Parent:= WizardForm;
end;
HideComponents;
TextLabel[5].show;
TextLabel[10].show;
Bevel2.Show;
Bevel3.Show;
Background.Show;
Runbtn.show;
end;

//--------Game Fail To Install PAGE--------\\
if (CurPageID = wpFinished) and (ISDoneError=True) then
begin
case
ActiveLanguage of
'eng': Application.Title := 'Setup —- « {#GameName} »';
'rus': Application.Title := 'Óñòàíîâêà —- « {#GameName} »';
end;
#ifdef WinTB
SetTaskBarProgressState(TBPF_ERROR);
WintbStart();
Win6TaskBarV1_2(WizardForm.Handle, MainForm.Handle, 0);
#endif
Runbtn.hide;
WizardForm.NextButton.Caption:= CustomMessage(lang+'Buttonfinish');
with langBtn do
begin
Height := ScaleY(30);
Left := ScaleX(5);
Top := ScaleY(372);
Width := ScaleX(31)
OnClick:= @LangBtnClick;
Parent:= WizardForm;
end;
with WizardForm do
begin
AutoScroll := False;
ClientHeight := ScaleY(411);
ClientWidth := ScaleX(584);
Position := poScreenCenter;
lPLogo:= ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(214), ScaleY(368), ScaleX(158), ScaleY(37), True, True);
ImgApplyChanges(WizardForm.Handle);
end;
HideComponents;
TextLabel[4].show;
TextLabel[10].show;
Bevel2.Show;
Bevel3.Show;
Background.Show;
end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if
(PageID=wpSelectProgramGroup) then Result:=true;
end;

nik1967 13-12-2019 12:35 2900210

Цитата:

Цитата habib2302
А как быть с cancel page? »

Я же не знаю, как реализована страница отмены.

habib2302 13-12-2019 12:37 2900212

nik1967, sorry
https://drive.google.com/file/d/1s9e...2SmLK-AR6FMe2h

nik1967 13-12-2019 13:11 2900215

habib2302, как-то так :)
https://drive.google.com/open?id=1Wj...tYnwNK7Cexa4my
Все под меня косите :)

habib2302 13-12-2019 14:15 2900230

web_form, В Main.iss - 711 строка, В module\cancel form.iss - 200 строка, В module\page.iss - 169 и 220 строки

habib2302 13-12-2019 15:38 2900246

web_form, В module\cancel form.iss чуть ниже 160 строки есть строки Left и Top отвечающие за координаты этого текста
Если хотите отцентровать добавьте Alignment := taCenter; над строкой left

habib2302 13-12-2019 18:03 2900262

web_form, 160 строка №8 не 18, а 8

habib2302 13-12-2019 20:09 2900269

web_form, держите https://drive.google.com/file/d/1A5J...bdg69DyT4G01Fc
количество задач меняется в параметре #define TaskCheckBox.

habib2302 15-12-2019 10:50 2900476

web_form, Будьте добры загружайте скрины через данную прогу с миниатюрами

По поводу миниатюры в панели задач есть библиотека WinTB, но проблема в том, что данная библиотека не работает на десятке
Хотя вот нашел. https://drive.google.com/file/d/1GmI...fwDcsd73KLr33x

habib2302 15-12-2019 12:12 2900484

web_form, в example.iss удалите раздел [setup] и все что в нем прописано. В main.iss над разделом setup с новой строки пропишите #include "example.iss". Файлы будут прописаны в example. И в конце example.iss не забудьте раскомментировать последние строки. А файл source.cpp вам не нужен т.к это исходник

habib2302 15-12-2019 13:38 2900503

web_form, можно ваш скрипт с которым вы работайте

habib2302 15-12-2019 19:10 2900571

web_form, проблема в том, что там придется перебирать и адаптировать скрипты под новый wintb т.к там изначально стоит старый

Tiarn 20-12-2019 00:16 2901345

Здравствуйте!
Не распаковывается 7zip архив, если в пути есть пробелы. Подскажите пожалуйста как исправить.

[Run]
Filename: {app}\7z.exe; Parameters: "x {src}\data1.7z-y"

iglezz 20-12-2019 00:58 2901347

Tiarn, Пути с пробелами берутся в кавычки, а азы из документации гласят, что символ кавычкек " вставляется в строку как удвоенная кавычка "". Итого получаем
Код:

Filename: {app}\7z.exe; Parameters: "x ""{src}\data1.7z-y"""

nik1967 20-12-2019 10:59 2901365

web_form, там заморочек много. С переключением языка на лету.

habib2302 21-12-2019 17:03 2901571

Доброе время суток. Необходимо удалить настройки проги во время деинсталляции через код с выводом MsgBox, но проблема в том, что в пути к настройкам есть символ "одинарная кавычка" или ' . Как можно обойти ошибку из-за этой кавычки? Пример Friday's program

Код:

[Code]

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
    case
CurUninstallStep of
       
usPostUninstall:
        if DirExists(AddBackslash(ExpandConstant('{userappdata}')) + 'Friday's program') then
        begin
            if
MsgBoxEx(0, 'Удалить настройки программы', 'Удаление настроек', $00000004 or $00000020, 0, 0) = IDYES then
           
DelTree(AddBackslash(ExpandConstant('{userappdata}')) + 'Friday's program', True, True, True);
        end;
    end;
end;


iglezz 21-12-2019 18:02 2901577

habib2302, использовать "" для " и '' для ', то бишь удваивать кавычку в строке.

iglezz 11-01-2020 00:08 2904472

Цитата:

Цитата Beavimo
выложу робочий скрипт на проверку хеш мож кому пригодится. »

На заметку:
1. По коду скрипта:
Скрытый текст
Код:

function InitializeSetup(): Boolean;
var
FileName: String;
SHA1: String;
begin
FileName := ExpandConstant('{reg:HKLM\SOFTWARE\Code,PATH_APPLICATION}') +'\Test.exe';
это присваивание не несёт полезной нагрузки:
Result := FileExists(FileName);
если файла нет по этому пути, будет ошибка (пример обработки здесь был):
SHA1 := GetSHA1OfFile(FileName);
if SHA1 = 'ad030d5606a2dcfa75ebc425a70730f23e7f07ab' then // буквы должны быть маленькими
begin
Result := MsgBox('Программа уже Установлена' #13#13 'Продолжить Установить?', mbInformation, MB_YESNO) = IDYES;
end
выделенная зелёным часть не несёт полезной нагрузки, можно убрать:
else
begin
end

end;


2. Отступы - полезная штука для улучшения читаемости кодаю

Beavimo 11-01-2020 01:36 2904482

iglezz
Зделал так, все работает, тока теперь при разных хеш, програма закрывается :help:
code

Код:

function InitializeSetup(): Boolean;
var
FileName: String;
SHA1: String;
begin
FileName := ExpandConstant('{reg:HKLM\SOFTWARE\Code,PATH_APPLICATION}') +'\Test.exe';
if Not FileExists(FileName) then begin
MsgBox('Установка Прекращена' #13#13 'Установите сначала Программу!', mbCriticalError, MB_OK);
Result := False;
Exit;
end;
SHA1 := GetSHA1OfFile(FileName);
if SHA1 = 'ad030d5606a2dcfa75ebc425a70730f23e7f07ab' then // буквы должны быть маленькими
begin
Result := MsgBox('Программа уже Установлена' #13#13 'Продолжить Установить?', mbInformation, MB_YESNO) = IDYES;
end
end;


как его побороть?

Iska 11-01-2020 02:09 2904485

Beavimo, код оформляется тэгом «code». И уже потом его можно дополнительно обрамить тэгом «spoiler».

Nemko 11-01-2020 15:37 2904534

Beavimo, может я не в теме, но попробуйте так:

Скрытый текст
Код:

#define NeedSHA "ad030d5606a2dcfa75ebc425a70730f23e7f07ab"

[Setup]
AppName=My Application
AppVersion=1.5
CreateAppDir=no

[*Сode]
function InitializeSetup: Boolean;
var
  FileName: PAnsiChar;
begin
  FileName:=ExpandConstant('{reg:HKLM\SOFTWARE\Code, PATH_APPLICATION}')+'\Test.exe';
  if not FileExists(FileName) then begin
  MsgBox('Установка Прекращена' #13#13 'Установите сначала Программу!', mbCriticalError, MB_OK);
  Result:=False;
end else begin
  if (GetSHA1OFFile(FileName) = Lowercase('{#NeedSHA}')) then Result:=MsgBox('Программа уже Установлена' #13#13 'Продолжить Установить?', mbInformation, MB_YESNO) = IDYES
  else Result:=MsgBox('Программы не совпадают!', mbCriticalError, MB_OK) <> IDOK; // если надо чтоб программа запускалось при не соответствии, сменить знак на "="
 end;
end;


Nordek 11-01-2020 16:20 2904544

Цитата:

Цитата Iska
код оформляется тэгом «code». »

В дополнение.

Iska 11-01-2020 17:04 2904548

Цитата:

Цитата Nordek

Nordek, завели же тэг [noparse] специально для таких случаев.

Beavimo 11-01-2020 20:54 2904571

Nemko, спасибо, тока как убрать предупреждение о несовпадении сум, что бы сразу устанавливалась прога
Код:

  else Result:=MsgBox('Программы не совпадают!', mbCriticalError, MB_OK) = IDOK; // если надо чтоб программа запускалось при не соответствии, сменить знак на "="

Nordek 11-01-2020 21:09 2904574

Iska,
Всё куда проще


Таким образом [color=none][/color] подставляется автоматически:
[Code][color=none][[/color]Code]
procedure RedesignWizardForm;
begin
with
WizardForm.CancelButton do
begin
Left := ScaleX(364);
end;
end;
procedure InitializeWizard();
begin
RedesignWizardForm;
end;
[/Code]

Итог:
Код:

[Code]
procedure RedesignWizardForm;
begin
  with
WizardForm.CancelButton do
  begin
   
Left := ScaleX(364);
  end;
end;
procedure InitializeWizard();
begin
 
RedesignWizardForm;
end;


Nemko 11-01-2020 21:09 2904575

Beavimo, думаю так:

Скрытый текст
#define NeedSHA "ad030d5606a2dcfa75ebc425a70730f23e7f07ab"

[Setup]
AppName=My Application
AppVersion=1.5
CreateAppDir=no

[code]
function InitializeSetup: Boolean;
var
FileName: PAnsiChar;
begin
FileName:=ExpandConstant('{reg:HKLM\SOFTWARE\Code, PATH_APPLICATION}')+'\Test.exe';
if not FileExists(FileName) then begin
MsgBox('Установка Прекращена' #13#13 'Установите сначала Программу!', mbCriticalError, MB_OK);
Result:=False;
end else begin
if (GetSHA1OFFile(FileName) = Lowercase('{#NeedSHA}')) then Result:=MsgBox('Программа уже Установлена' #13#13 'Продолжить Установить?', mbInformation, MB_YESNO) = IDYES
else Result:=True;
end;
end;

Если нужно скипнуть готовность
#define NeedSHA "ad030d5606a2dcfa75ebc425a70730f23e7f07ab"

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[code]
var
StartImstall: Boolean;

function InitializeSetup: Boolean;
var
FileName: PAnsiChar;
begin
FileName:=ExpandConstant('{reg:HKLM\SOFTWARE\Code, PATH_APPLICATION}')+'\Test.exe';
if not FileExists(FileName) then begin
MsgBox('Установка Прекращена' #13#13 'Установите сначала Программу!', mbCriticalError, MB_OK);
Result:=False;
end else begin
if (GetSHA1OFFile(FileName) = Lowercase('{#NeedSHA}')) then Result:=MsgBox('Программа уже Установлена' #13#13 'Продолжить Установить?', mbInformation, MB_YESNO) = IDYES
else begin
StartImstall:=True; Result:=StartImstall;
end;
end;
end;

procedure InitializeWizard;
begin
WizardForm.Show; //без этой строчки не фунциклирует
end;

function ShouldSkipPage(CurPageID: Integer): Boolean;
begin
case CurPageID of
wpReady,wpInstalling,wpFinished: Result:=False; // если надо, можно пропустить все страницы
else Result:=True;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if (CurPageID = wpReady) and StartImstall then WizardForm.NextButton.OnClick(nil);
end;

Iska 11-01-2020 22:20 2904580

Цитата:

Цитата Nordek
Всё куда проще »

Это в чём?

Beavimo 11-01-2020 22:45 2904584

Nemko, а как склеить два разных CODE???
Code
Код:

function InitializeSetup(): Boolean;
var
FileName: PAnsiChar;
begin
FileName:=ExpandConstant('{reg:HKLM\SOFTWARE\Code,PATH_APPLICATION}') +'\Test.exe';
if not FileExists(FileName) then begin
MsgBox('Установка Прекращена', mbCriticalError, MB_OK);
Result:=False;
end
else begin
if (GetSHA1OFFile(FileName) = Lowercase('ad030d5606a2dcfa75ebc425a70730f23e7f07ab')) then
Result:=MsgBox('Программа уже Установлена' #13#13 'Продолжить Установить?', mbInformation, MB_YESNO) = IDYES
else
Result:=True;
end
end;


+
Code

// Подключаем внешнюю библиотеку:
#include "FileVersion.iss"
Код:

function InitializeSetup(): Boolean;
var FileName: String; CurrentVersion, MinVersion: TFileVersion; begin

//  Задаём минимальную версию:
FileVersionSetI(MinVersion, 1,3,0,0);

// Имя файла:
FileName := ExpandConstant('{reg:HKLM\SOFTWARE\Code,PATH_APPLICATION}') +'\Test.exe';
       
if Not FileExists(FileName) then begin
MsgBox('Установите Программу:', mbCriticalError, MB_OK);
Result := False; Exit;
end;
       
// Файл существует, считываем версию:
FileVersionSetF(CurrentVersion, FileName);
       
// Сравниваем и решаем что делать:
if FileVersionCompare(CurrentVersion, MinVersion) > -1 then
Result := True
else begin
MsgBox ('Установка Прекращена!' #13#13 'Версия Установленной Программы: ' +FileVersionToStr(CurrentVersion) +#13#13 'Минимальная Версия для Обновления: ' +FileVersionToStr(MinVersion), mbCriticalError, MB_OK);
Result := False; Exit;
end;

// Задаём максимальную версию:
FileVersionSetI(MinVersion, 1,3,0,0);

// Имя файла:
FileName := ExpandConstant('{reg:HKLM\SOFTWARE\Code,PATH_APPLICATION}') +'\Test.exe';
       
// Файл существует, считываем версию:
FileVersionSetF(CurrentVersion, FileName);
       
// Сравниваем и решаем что делать:
if FileVersionCompare(CurrentVersion, MinVersion) < 1 then
Result := True
else begin
MsgBox('Установка Прекращена!' #13#13 'Версия Установленной Программы: ' +FileVersionToStr(CurrentVersion) +#13#13 'Максимальная Версия для Обновления: ' +FileVersionToStr(MinVersion), mbCriticalError, MB_OK);
Result := False; Exit;
end;
end;


сама библиотека тут

Nemko 12-01-2020 12:45 2904623

Beavimo, держите, модуль FileVersion.iss нужно класть рядом:
Скрытый текст
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={sd}\My Application

[Modules]
#include "FileVersion.iss"

[*Code]
function InitializeSetup: Boolean;
var
  FileName: PAnsiChar;
  CurrentVersion, MinVersion: TFileVersion;
begin
  FileVersionSetI(MinVersion, 1, 3, 0, 0);
  FileName:=ExpandConstant('{reg:HKLM\SOFTWARE\Code,PATH_APPLICATION}')+'\Test.exe';
  if not FileExists(FileName) then begin
    MsgBox('Установка прекращена.'+#13+'Отсутствует файл программы.', mbCriticalError, MB_OK);
    Result:=False;
  end else begin
    FileVersionSetF(CurrentVersion, FileName);
    case FileVersionCompare(CurrentVersion, MinVersion) of
      -1: begin
        MsgBox ('Установка прекращена!'+#13+'Версия установленной программы: '+FileVersionToStr(CurrentVersion)+#13+'Минимальная версия для обновления: '+FileVersionToStr(MinVersion), mbCriticalError, MB_OK);
        Result:=False;
      end;
      0: begin
        if (GetSHA1OFFile(FileName)=Lowercase('ad030d5606a2dcfa75ebc425a70730f23e7f07ab')) then Result:=MsgBox('Программа уже установлена!'+#13+'Продолжить установку?', mbInformation, MB_YESNO) = IDYES
        else Result:=True;
      end;
      1: begin
        MsgBox('Установка прекращена!'+#13+'Версия установленной программы: '+FileVersionToStr(CurrentVersion)+#13+'Максимальная версия для обновления: '+FileVersionToStr(MinVersion), mbCriticalError, MB_OK);
        Result:=False;
      end;
    end
  end;
end;


Beavimo 12-01-2020 16:28 2904643

Nemko,
Спасибо братюня.... Как думаешь с чего стоить начать изучать программирование? Если начать с Паскаля потом на С+ или сразу с С+?
Просто я самоучка, и метод у меня всегда с конца, я буду сравнивать примеры дабы понять смысл, а уже потом полезу в документацию, потому как значения меня пугают, а так если пойму суть как оно работает тогда зацеп пойдет, так вот собствинно дилема в том что суть языков Паскаль и С+ одна, токо значение разные, или принцыпи работы разные?
А чуть не забыл! Дело в том что в своем примере, я мого задавать порог минимальной и максимальной версии, а тут банально устанавливается, только на заданую версию.

Iska 12-01-2020 16:41 2904647

Цитата:

Цитата Beavimo
с чего стоить начать изучать программирование? »

С ассемблера. Потом и C++ пойдёт лучше.

Nemko 12-01-2020 19:28 2904665

Beavimo, теперь FileVersion.iss можно выкинуть в урну, он не нужен, плюс прикрутил проверку на соответствие PE-формату (типа если открывать не .exe). Так же диапазон версий настраивается в начале, хеш там же.
Скрытый текст
Код:

#define AppHash "ad030d5606a2dcfa75ebc425a70730f23e7f07ab"; хэш
#define AppFile "Test.exe"; имя файла
#define MinVers "1.0.0.0"; минимальная версия
#define MaxVers "1.4.0.0"; максимальная

[Setup]
AppName=My Application
AppVersion=1.5
CreateAppDir=no

[CustomMessages]
Error_01=Отсутствует файл {#AppFile}.
Error_02=Минимальная версия для обновления: {#MinVers},%nТекущая версия:
Error_03=Максимальная версия для обновления: {#MaxVers},%nТекущая версия:
Error_04=Файл {#AppFile} не соответствует PE-формату.
Information_01=Программа уже установлена!%nПродолжить установку?

[*Code]
#define A = (Defined UNICODE) ? "W" : "A"

const
  DONT_RESOLVE_DLL_REFERENCES = $1;
  LOAD_LIBRARY_AS_DATAFILE    = $2;

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';

function copy_Int(s: String): Integer;
var
  i: Integer;
  tmpS: String;
begin
  for i:=1 to Length(s) do if StrToInt(s[i])<>-1 then tmpS:=tmpS+s[i];
  if StrToInt(tmpS)<>-1 then Result:=StrToInt(tmpS);
end;

function Compare(aFile: PAnsiChar; aHash, aMinVers, aMaxVers: String): Boolean;
var
  CurrentVersion: String;
begin
  if not FileExists(aFile) then begin
    MsgBox(CustomMessage('Error_01'), mbCriticalError, MB_OK);
    Result:=False;
  end else begin
    if LoadLibraryEx(aFile, 0, LOAD_LIBRARY_AS_DATAFILE+DONT_RESOLVE_DLL_REFERENCES)=0 then begin
      MsgBox(CustomMessage('Error_04'), mbCriticalError, MB_OK);
      Exit;
    end;
    GetVersionNumbersString(aFile, CurrentVersion);
    if (copy_Int(CurrentVersion)<=copy_Int('{#MaxVers}')) and (copy_Int(CurrentVersion)>=copy_Int('{#MinVers}')) then begin
      if (GetSHA1OFFile(aFile)=Lowercase('{#AppHash}')) then Result:=MsgBox(CustomMessage('Information_01'), mbInformation, MB_YESNO) = IDYES
      else Result:=True;
  end else begin
    if (copy_Int(CurrentVersion)<copy_Int('{#MinVers}')) then MsgBox(CustomMessage('Error_02')+' '+CurrentVersion+'.', mbCriticalError, MB_OK)
    else MsgBox(CustomMessage('Error_03')+' '+CurrentVersion+'.', mbCriticalError, MB_OK);
    Result:=False;
  end;
 end;
end;

function InitializeSetup: Boolean;
begin
  Result:=Compare(ExpandConstant('{reg:HKLM\SOFTWARE\Code, PATH_APPLICATION}'+'\{#AppFile}'), '{#AppHash}', '{#MinVers}', '{#MaxVers}');
end;



P.S.: на счет языков программирования, решайте сами, но ИМХО лучше (проще) забить на это дело и пойти проветритьса на улицу.

El Sanchez 13-01-2020 14:36 2904744

Цитата:

Цитата Nemko
теперь FileVersion.iss можно выкинуть в урну, он не нужен »

Nemko, ваш код сдохнет на проверке версии 111.222.333.444 и скажет, что в 1.4.0.10 > 1.5.0.0 нет ничего страшного.

Beavimo 14-01-2020 07:53 2904838

Nemko, код кривой полюбому.... если у файла Test.exe атрибут только чтение начинается бред, никакие флаги не помогают.

Beavimo 14-01-2020 11:08 2904858

Вот так все робит :yahoo:

code
Код:

function InitializeSetup(): Boolean;
var FileName: String; CurrentVersion, MinVersion, MaxVersion: TFileVersion; begin

FileVersionSetI(MinVersion, 1,1,0,0);
FileName := ExpandConstant('{reg:HKLM\SOFTWARE\Code,PATH_APPLICATION}') +'\Test.exe';
if not FileExists(FileName) then
begin MsgBox('Установка Прекращена:' #13#13 'Файл ('+ExtractFileName(FileName)+') не найден!', mbCriticalError, MB_OK);
Result := False; Exit;
end;

FileVersionSetF(CurrentVersion, FileName);
if FileVersionCompare(CurrentVersion, MinVersion) > -1 then
Result := True else
begin MsgBox ('Установка Прекращена!' #13#13 'Версия Установленной Программы: ' +FileVersionToStr(CurrentVersion) +#13#13 'Минимальная Версия для Обновления: ' +FileVersionToStr(MinVersion), mbCriticalError, MB_OK);
Result := False; Exit;
end;

FileVersionSetI(MaxVersion, 1,5,0,0);
FileName := ExpandConstant('{reg:HKLM\SOFTWARE\Code,PATH_APPLICATION}') +'\Test.exe';
       
FileVersionSetF(CurrentVersion, FileName);
if FileVersionCompare(CurrentVersion, MaxVersion) < 1 then
Result := True else
begin MsgBox('Установка Прекращена!' #13#13 'Версия Установленной Программы: ' +FileVersionToStr(CurrentVersion) +#13#13 'Максимальная Версия для Обновления: ' +FileVersionToStr(MaxVersion), mbCriticalError, MB_OK);
Result := False; Exit;
end;

begin if (GetSHA1OFFile(FileName) = Lowercase('AD030D5606A2DCFA75EBC425A70730F23E7F07AB')) then
Result:=MsgBox('Обновление уже установлено:' #13#13 'Все равно установить?', mbInformation, MB_YESNO) = IDYES;
end;
end;


iglezz 14-01-2020 12:11 2904867

Цитата:

Цитата Beavimo
Единственный косяк, когда хеш равни выскакивает СМС мол программа установлена установить (ДА\НЕТ?), так что не нажми всеравно установка продолжиться.
Я уже задолбался, если че - зделаю просто СМС придуприждение. Незнаю как боротся, ставлю Result := False; Exit; так она ваапще не запускается при разных хеш. »

Неудивительно. Такой неструктурированный винегрет невозможно читать.

CODE
Приводим код в порядок и сразу видим место где косяк зарыт:
Код:

function InitializeSetup(): Boolean;
var
        FileName: String;
        CurrentVersion, MinVersion, MaxVersion: TFileVersion;

begin
        FileVersionSetI(MinVersion, 1,2,0,0);
        FileName := ExpandConstant('{reg:HKLM\SOFTWARE\Code}') + '\Test.exe';
        if not FileExists(FileName) then begin
                MsgBox('Установка Прекращена:' #13#13 'Файл (' + ExtractFileName(FileName) + ') не найден!', mbCriticalError, MB_OK);
                Result := False;
                Exit;
        end;
 
        FileVersionSetF(CurrentVersion, FileName);
        if (GetSHA1OFFile(FileName) = Lowercase('AD030D5606A2DCFA75EBC425A70730F23E7F07AB')) then
                // Здесь идёт простое присваивание True/False:
                // Result:=MsgBox('Обновление уже установлено:' #13#13 'Все равно установить?', mbInformation, MB_YESNO) = IDYES;
                // хотя в случае False надо Exit делать. Поэтому сия строчка выкидывается и

                // вместо неё пишется:
                if MsgBox('Обновление уже установлено:' #13#13 'Все равно установить?', mbInformation, MB_YESNO) <> IDYES then begin
                        Result := False;
                        Exit;
                end;

       
        if FileVersionCompare(CurrentVersion, MinVersion) > -1 then
                Result := True
        else begin
                MsgBox ('Установка Прекращена!' #13#13 'Версия Установленной Программы: ' + FileVersionToStr(CurrentVersion) + #13#13 'Минимальная Версия для Обновления: ' + FileVersionToStr(MinVersion), mbCriticalError, MB_OK);
        Result := False; Exit;
        end;

        FileVersionSetI(MaxVersion, 1,4,0,0);
        FileName := ExpandConstant('{reg:HKLM\SOFTWARE\Code}') + '\Test.exe';
        FileVersionSetF(CurrentVersion, FileName);
       
        if FileVersionCompare(CurrentVersion, MaxVersion) < 1 then
                Result := True
        else begin
                MsgBox('Установка Прекращена!' #13#13 'Версия Установленной Программы: ' + FileVersionToStr(CurrentVersion) + #13#13 'Максимальная Версия для Обновления: ' + FileVersionToStr(MaxVersion), mbCriticalError, MB_OK);
                Result := False;
                Exit;
        end;

end;



Напоминание №2 о форматировании:
В каталоге установленного Inno Setup есть каталог Examples. Там в примерах стоит посмотреть как надо форматировать код, чтобы у него читабельность была на таком уровне, когда структура видна беглым взглядом.

Beavimo 14-01-2020 12:34 2904874

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

Iska 14-01-2020 17:42 2904948

Beavimo, хотите бесплатный совет? Чем меньше Вы будете заморачиваться подобными, никому не нужными, свистоперделками рюшечками, и чем больше Вы уделите внимания функционалу и поддержке — тем будет лучше для конечного результата.

Nordek 14-01-2020 17:43 2904950

Цитата:

Цитата Iska
Это в чём? »

В расширенной врсии, Inno у меня старой версии 5.5.1.
Скрытый текст
Пробовал 6.0.3 - Что-то совсем не проникся.
По сравнению с 6.0.2 - Расширенная Inno 5.5.1 так не уязвима к взломам/распаковке.
6.0.3 кривая, раз 5 перекомпилировал чтоб собрать пакет - Иначе на выходе готового пакета в разных местах выводило ошибку.
И т.д.
Лучше NSIS использовать чем Inno 6, ещё лучше на делфи инсталлятор писать.

Iska 14-01-2020 18:19 2904962

Цитата:

Цитата Nordek
В расширенной врсии, »

Хмм… А что за редактор-то?

Nordek, даже не знал, что уже шестая вышла.

Nordek 14-01-2020 21:28 2904992

Вложений: 1
Цитата:

Цитата Iska
А что за редактор-то? »

Скрытый текст
ispack-5.5.1.exe и ispack-5.5.1-unicode.exe + инструкция из сообщения темы

Или информация во вложении.

Цитата:

Цитата Iska
даже не знал, что уже шестая вышла. »

Расширенной 6 версии не существует.

Beavimo 17-01-2020 17:49 2905525

Добрый день, такая строка делает ярлык с параметром на рабочем столе:
код
Код:

[Icons]
Name: "{commondesktop}\BASE"; Filename: "C:\Program Files\BASE\BASE.bat"; Parameters:test; IconFilename: "C:\Program Files\BASE\BASE.ico"


получается в графе Обьект
Обьект: "C:\Program Files\BASE\BASE.bat" test
а как зделать чтоб было вот так
Обьект: test "C:\Program Files\BASE\BASE.bat"

boss911 17-01-2020 18:02 2905528

Отключил все страницы, кроме SelectDirPage, на SelectDirPege вынес ProgressGauge (прогресс бар). Как отключить страницу установки (wpInstalling) и возможно ли? Задача оставить только SelectDirPage и прогресс бар на ней.

El Sanchez 18-01-2020 11:19 2905612

Цитата:

Цитата boss911
Задача оставить только SelectDirPage и прогресс бар на ней. »

boss911, как-то так:
Код:

procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssInstall: WizardForm.SelectDirPage.Show;
  end;
end;


habib2302 18-01-2020 12:21 2905621

Доброе время суток. Помогите решить проблему. Во время компиляции выпадает ошибка


iglezz 18-01-2020 12:48 2905629

habib2302,
Каждое из четырёх чисел в VersionInfoVersion имеет максимальное значение равное 65535, отсюда и ошибка.
Для больших чисел применяется текстовый атрибут FileVersion, устанавливаемый через VersionInfoTextVersion="6.1.2.135662"
Таким же образом это сделано и для оригинального установщика.

Подробности здесь: VERSIONINFO resource

Beavimo 21-01-2020 22:00 2906189

Добрый Вечер Форумчане! Так и не нашел ответа, можна как нибудь поменять эту надпись или нет :pray:?
Надпись



Nordek 21-01-2020 22:43 2906198

Цитата:

Цитата Beavimo
можна как нибудь поменять эту надпись или нет »

Можно.
Код:

[Messages]
SetupWindowTitle=Мой инсталлятор - %1

Если нужно для определённого языка то, то что у вас будет в Languages - То подставляете
Код:

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

Код:

[Messages]
russian.SetupWindowTitle=Мой инсталлятор - %1


gosnitsse 22-01-2020 21:56 2906355

Проблема, есть игра "The lord of the rings the history of ages 1.3.7.1" так вот, известный факт что если установить игру, то есть при установке где нужно выбрать путь, мы пропишем свой путь, то соответственно игра не запустится, но если путь создать заранее, через ПКМ и новая папка, затем дать ей имя, то без проблем игра запустится после установки.

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

Nordek 23-01-2020 02:53 2906397

Цитата:

Цитата gosnitsse
как мне можно в Inno Setup ключи реестра сделать так чтобы они менялись и вообще чтобы они добавлялись при установке в любую папку? »

Если я правильно понял то, вникайте:

Например игра установилась в:
C:\Program Files\Name\

Исходные уже внесённые данные в реестр будут выглядеть так:
Root: "HKCU"; Subkey: "Software\Name"; ValueType: string; ValueName: "Path"; ValueData: "C:\Program Files\Name\"; Flags: uninsdeletekey



Теперь обратите внимание на секцию [Setup]
Код:

DefaultDirName={pf}\Name
{pf}\Name - Это есть C:\Program Files\Name\
{app} - Это есть {pf}\Name
Например по умолчанию у вас будет {pf}\Name т.е C:\Program Files\Name\, то {app} передаст этот путь.
Всякий раз когда уже в инсталляторе вы будете выбирать каталог, будь это C:\Game или D:\Game - {app} передаст этот путь.

Смотрите пример:
Секция [Files]:
Код:

Source: "D:\Source\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs
В секции [Registry] нужно сделать так же:
Код:

Root: "HKCU"; Subkey: "Software\Name"; ValueType: string; ValueName: "Path"; ValueData: "{app}"; Flags: uninsdeletekey



На будущее:
Если в секции [Files], в DestDir вы решите жестко привязать каталог по каким-то причинам:
Код:

Source: "D:\Source\*"; DestDir: "{app}\bin"; Flags: ignoreversion recursesubdirs
То и в секции [Registry] нужно сделать также:
Код:

Source: "D:\Source\*"; DestDir: "{app}\bin"; Flags: ignoreversion recursesubdirs createallsubdirs
т.к в конечном итоге выйдет так C:\Program Files\Name\bin или так C:\Game\bin

gosnitsse 23-01-2020 12:28 2906456

Цитата:

Цитата Nordek
Если я правильно понял то, вникайте:
Например игра установилась в:
C:\Program Files\Name\
Исходные уже внесённые данные в реестр будут выглядеть так:
Root: "HKCU"; Subkey: "Software\Name"; ValueType: string; ValueName: "Path"; ValueData: "C:\Program Files\Name\"; Flags: uninsdeletekey »


Пример понятен, но я никогда не сталкивался с ситуацией когда игра так яро реагирует на ключи реестра (наверное из 8 игр это первая) можете уточнить? по примерам

D:\Games\The Lord а сам дистрибутив находится в D:\Games\LOTR он создаёт несколько ключей в реестре допустим 6 мне каждый писать используя {pf}\The Lord?
Я так понял что {pf} копирует путь игры без имени папки, а {app} копирует абсолютно весь путь но без входящих в него папок я правильно понял???

У меня есть код 1 - сама игра, а второй не важен (так как это смена ключа)
Код:

Source: "D:\Games\Lord of the Rings - The History of Ages\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
Source: "C:\Users\Gosni\Desktop\The Lord Of The Rings - The Onset Of Darkness\Setup\Redist\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c1

в другом коде в cекции Run
Код:

Description: "{cm:LaunchProgram, The Lord Of The Rings - The Onset Of Darkness}"; Filename: "{app}\Ep1\CDKeyFixer.exe"; WorkingDir: "{app}\Ep1"; Flags:
Description: "{cm:LaunchProgram, The Lord Of The Rings - The Onset Of Darkness}"; Filename: "{app}\Ep1\lotrbfme2ep1.exe"; WorkingDir: "{app}\Ep1"; Flags: nowait postinstall skipifsilent unchecked

Просто пример можно? вот я установил игру, он создал несколько ключей в реестре:

Код:

Удаленные разделы: 21
----------------------------------
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe
HKLM\SOFTWARE\WOW6432Node\Electronic Arts
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\ergc
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\1.0
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe
HKLM\SYSTEM\ControlSet002
HKLM\SYSTEM\ControlSet002\services
HKLM\SYSTEM\ControlSet002\services\SharedAccess
HKLM\SYSTEM\ControlSet002\services\SharedAccess\Parameters
HKLM\SYSTEM\ControlSet002\services\SharedAccess\Parameters\FirewallPolicy
HKLM\SYSTEM\ControlSet002\services\SharedAccess\Parameters\FirewallPolicy\FirewallRules

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe\Game Registry: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe\Restart: 0x00000000
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe\DirectX Installed: 0x00000000
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe\Installed: 0x00000001
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe\: "D:\Games\LORD\lotrbfme2.exe"
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe\Path: "D:\Games\LORD\"
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe\Game Registry: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe\Restart: 0x00000000
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe\DirectX Installed: 0x00000000
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe\Installed: 0x00000001
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe\: "D:\Games\LORD\Ep1\lotrbfme2ep1.exe"
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe\Path: "D:\Games\LORD\Ep1"
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\VolatileNotifications\41C64E6DA3E0E055: 01 00 04 80 44 00 00 00 50 00 00 00 00 00 00 00 14 00 00 00 02 00 30 00 02 00 00 00 00 00 14 00 03 00 00 00 01 01 00 00 00 00 00 05 12 00 00 00 00 00 14 00 00 00 01 00 01 01 00 00 00 00 00 05 12 00 00 00 01 01 00 00 00 00 00 05 12 00 00 00 01 01 00 00 00 00 00 05 12 00 00 00 20 00 00 00
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\Language: "russian"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\InstallPath: "D:\Games\LORD\"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\Version: 0x00010006
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\MapPackVersion: 0x00010000
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\UseLocalUserMaps: 0x00000000
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\UserDataLeafName: "Битва за Средиземье - Мои файлы"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\ergc\: "J7F79F9MHXQFBFKGHKAW"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\Language: "russian"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\InstallPath: "D:\Games\LORD\Ep1\"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\Version: 0x00020001
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\MapPackVersion: 0x00020000
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\UseLocalUserMaps: 0x00000000
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\UserDataLeafName: "Властелин Колец, Под знаменем Короля-чародея - Мои файлы"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc\: "SEW6Y8K88UQB3GRZEE9M"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\DisplayName: "Битва за Средиземье™ II"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\Installed From: "H:\"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\Registration: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\ergc"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\CacheSize: "5441287168"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\SwapSize: "0"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\Language: "Russian"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\Locale: "ru"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\CD Drive: "H:\"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\Install Dir: "C:\PROGRA~1\LORDOF~1\"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\Product GUID: "{2A9F95AB-65A3-432c-8631-B8BC5BF7477A}"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\Region: "NorthAmerica"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\Folder: "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Electronic Arts\Битва за Средиземье™ II\"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\Patch URL: "http://transtest.ea.com/Electronic Arts/The Battle for Middle-earth 2/NorthAmerica"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\Suppression Exe: "rtsi.exe"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\1.0\Language: 0x00000010
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\1.0\DisplayName: "Битва за Средиземье™ II"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\1.0\LanguageName: "Russian"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\DisplayName: "Под знаменем Короля-чародея™"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\Installed From: "H:\"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\Registration: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\CacheSize: "3139187712"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\SwapSize: "0"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\Language: "Russian"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\Locale: "ru"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\CD Drive: "H:\"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\Install Dir: "C:\PROGRA~1\LORDOF~1\Ep1\"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\Product GUID: "{B931FB80-537A-4600-00AD-AC5DEDB6C25B}"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\Region: "NorthAmerica"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\Folder: "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Electronic Arts\Под знаменем Короля-чародея™\"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\Patch URL: "http://transtest.ea.com/Electronic Arts/The Battle for Middle-earth 2/NorthAmerica"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\Suppression Exe: "rtsi.exe"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0\Language: 0x00000010
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0\DisplayName: "Под знаменем Короля-чародея™"
HKLM\SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0\LanguageName: "Russian"
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)\DisplayName: "The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)"
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)\DisplayVersion: "1.3.7.1"
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)\VersionMajor: 0x00000001
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)\VersionMinor: 0x00000003
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)\Publisher: "ThoA Team"
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)\DisplayIcon: "D:\Games\LORD\Uninstall_Repack.exe"
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)\UninstallString: "D:\Games\LORD\Uninstall_Repack.exe"
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)\URLInfoabout: "http://warofthering.ru/forum/"
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)\HelpLink: "http://vk.com/thoa_tournament"
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)\InstallLocation: "D:\Games\LORD\"
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)\InstallSource: "E:\CONSTANTA для переустановки\Lord of the Rings - The History of Ages\"
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)\InstallDate: "20200123"
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)\Language: 0x00000419
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)\EstimatedSize: 0x00000066
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)\NoModify: 0x00000001
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)\NoRepair: 0x00000001
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe\Game Registry: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe\Restart: 0x00000000
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe\DirectX Installed: 0x00000000
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe\Installed: 0x00000001
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe\: "D:\Games\LORD\lotrbfme2.exe"
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe\Path: "D:\Games\LORD\"
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe\Game Registry: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe\Restart: 0x00000000
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe\DirectX Installed: 0x00000000
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe\Installed: 0x00000001
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe\: "D:\Games\LORD\Ep1\lotrbfme2ep1.exe"
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe\Path: "D:\Games\LORD\Ep1"
HKLM\SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\{110875B1-2637-4A62-BCF0-93908A083179}: "v2.10|Action=Allow|Active=TRUE|Dir=In|Protocol=6|Profile=Public|App=D:\Games\LORD\game.dat|Name=Битва за Средиземье II|"
HKLM\SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\{8E12B064-D835-4D75-8A22-FD0FEF305F33}: "v2.10|Action=Allow|Active=TRUE|Dir=In|Protocol=17|Profile=Public|App=D:\Games\LORD\game.dat|Name=Битва за Средиземье II|"
HKLM\SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\{81B3A9FD-E103-40A8-9760-F4BC5D905B87}: "v2.10|Action=Allow|Active=TRUE|Dir=In|Protocol=6|Profile=Public|App=D:\Games\LORD\Ep1\game.dat|Name=Под знаменем Короля-чародея|"
HKLM\SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\{250C5541-B307-4A6C-8C17-B171E946E02F}: "v2.10|Action=Allow|Active=TRUE|Dir=In|Protocol=17|Profile=Public|App=D:\Games\LORD\Ep1\game.dat|Name=Под знаменем Короля-чародея|"
HKLM\SYSTEM\ControlSet002\services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\{110875B1-2637-4A62-BCF0-93908A083179}: "v2.10|Action=Allow|Active=TRUE|Dir=In|Protocol=6|Profile=Public|App=D:\Games\LORD\game.dat|Name=Битва за Средиземье II|"
HKLM\SYSTEM\ControlSet002\services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\{8E12B064-D835-4D75-8A22-FD0FEF305F33}: "v2.10|Action=Allow|Active=TRUE|Dir=In|Protocol=17|Profile=Public|App=D:\Games\LORD\game.dat|Name=Битва за Средиземье II|"
HKLM\SYSTEM\ControlSet002\services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\{81B3A9FD-E103-40A8-9760-F4BC5D905B87}: "v2.10|Action=Allow|Active=TRUE|Dir=In|Protocol=6|Profile=Public|App=D:\Games\LORD\Ep1\game.dat|Name=Под знаменем Короля-чародея|"
HKLM\SYSTEM\ControlSet002\services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\{250C5541-B307-4A6C-8C17-B171E946E02F}: "v2.10|Action=Allow|Active=TRUE|Dir=In|Protocol=17|Profile=Public|App=D:\Games\LORD\Ep1\game.dat|Name=Под знаменем Короля-чародея|"
HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\{110875B1-2637-4A62-BCF0-93908A083179}: "v2.10|Action=Allow|Active=TRUE|Dir=In|Protocol=6|Profile=Public|App=D:\Games\LORD\game.dat|Name=Битва за Средиземье II|"
HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\{8E12B064-D835-4D75-8A22-FD0FEF305F33}: "v2.10|Action=Allow|Active=TRUE|Dir=In|Protocol=17|Profile=Public|App=D:\Games\LORD\game.dat|Name=Битва за Средиземье II|"
HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\{81B3A9FD-E103-40A8-9760-F4BC5D905B87}: "v2.10|Action=Allow|Active=TRUE|Dir=In|Protocol=6|Profile=Public|App=D:\Games\LORD\Ep1\game.dat|Name=Под знаменем Короля-чародея|"
HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\{250C5541-B307-4A6C-8C17-B171E946E02F}: "v2.10|Action=Allow|Active=TRUE|Dir=In|Protocol=17|Profile=Public|App=D:\Games\LORD\Ep1\game.dat|Name=Под знаменем Короля-чародея|"

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

Код:

DefaultDirName={pf}\Name
- зачем это нужно? я просто без этого сделал

Nordek 23-01-2020 15:49 2906493

Цитата:

Цитата gosnitsse
мне каждый писать используя {pf}\The Lord? »

Цитата:

Цитата gosnitsse
он создаёт несколько ключей в реестре допустим 6 мне каждый писать используя {pf}\The Lord? »

Не известно какую папку вы планируете сделать по умолчанию для установки.
Предположим вы хотите сделать папкой по умолчанию не C:\Program Files\LOTR, а C:\Games\LOTR - То в DefaultDirName достаточно указать {sd}\Games\LOTR. В реестре, в ярлыках указываете {app}.

Цитата:

Цитата gosnitsse
У меня есть код »

На скорую руку набросал:
Код:

[Setup]
AppId={{02BB9D98-A4DC-47EE-AB1D-7A40978E14CE}
AppName=The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK)
AppVersion=1.0
;AppVerName=The Lord of the Rings 1.0
AppPublisher=My Company, Inc.
AppPublisherURL=http://www.example.com/
AppSupportURL=http://www.example.com/
AppUpdatesURL=http://www.example.com/
DefaultDirName={pf}\LotR
DefaultGroupName=LotR
OutputDir=.
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "The Lord Of The Rings - The Onset Of Darkness\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension

[Icons]
Name: "{group}\The Lord Of The Rings - The Onset Of Darkness"; Filename: "{app}\Ep1\lotrbfme2ep1.exe"
Name: "{group}\{cm:UninstallProgram,The Lord of the Rings}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\The Lord Of The Rings - The Onset Of Darkness"; Filename: "{app}\Ep1\lotrbfme2ep1.exe"; Tasks: desktopicon

[Run]
Description: "{cm:LaunchProgram, The Lord Of The Rings - The Onset Of Darkness}"; Filename: "{app}\Ep1\CDKeyFixer.exe"; WorkingDir: "{app}\Ep1"; Flags:
Description: "{cm:LaunchProgram, The Lord Of The Rings - The Onset Of Darkness}"; Filename: "{app}\Ep1\lotrbfme2ep1.exe"; WorkingDir: "{app}\Ep1"; Flags: nowait postinstall skipifsilent unchecked

[Registry]
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts"; ValueType: none; Flags: uninsdeletekeyifempty
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts"; ValueType: none; Flags: uninsdeletekeyifempty
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Language"; ValueData: "russian"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}\Ep1\"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: dword; ValueName: "Version"; ValueData: "$00020001"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: dword; ValueName: "MapPackVersion"; ValueData: "$00020000"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: dword; ValueName: "UseLocalUserMaps"; ValueData: "$00000000"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "UserDataLeafName"; ValueData: "Властелин Колец, Под знаменем Короля-чародея - Мои файлы"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "ergc"; ValueData: "XXXXXXXXXXXXXXXXXXXX"; Flags: uninsdeletekey

Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "Language"; ValueData: "russian"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}\Ep1\"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: dword; ValueName: "Version"; ValueData: "$00020001"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: dword; ValueName: "MapPackVersion"; ValueData: "$00020000"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: dword; ValueName: "UseLocalUserMaps"; ValueData: "$00000000"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "UserDataLeafName"; ValueData: "Властелин Колец, Под знаменем Короля-чародея - Мои файлы"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "ergc"; ValueData: "XXXXXXXXXXXXXXXXXXXX"; Flags: uninsdeletekey

Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "DisplayName"; ValueData: "Битва за Средиземье™ II"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Installed From"; ValueData: "{src}"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Registration"; ValueData: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\ergc"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "CacheSize"; ValueData: "5441287168"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "SwapSize"; ValueData: "0"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Language"; ValueData: "Russian"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Locale"; ValueData: "ru"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "CD Drive"; ValueData: "{src}"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Install Dir"; ValueData: "{app}\"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Product GUID"; ValueData: "{{2A9F95AB-65A3-432c-8631-B8BC5BF7477A}"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Region"; ValueData: "NorthAmerica"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Folder"; ValueData: "{commonprograms}\Electronic Arts\Битва за Средиземье™ II\"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Patch URL"; ValueData: "http://transtest.ea.com/Electronic Arts/The Battle for Middle-earth 2/NorthAmerica"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Suppression Exe"; ValueData: "rtsi.exe"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II\1.0"; ValueType: dword; ValueName: "Language"; ValueData: "$00000010"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II\1.0"; ValueType: string; ValueName: "DisplayName"; ValueData: "Битва за Средиземье™ II"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II\1.0"; ValueType: string; ValueName: "LanguageName"; ValueData: "Russian"; Flags: uninsdeletekey

Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "DisplayName"; ValueData: "Под знаменем Короля-чародея™"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "Installed From"; ValueData: "{src}"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "Registration"; ValueData: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "CacheSize"; ValueData: "3139187712"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "SwapSize"; ValueData: "0"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "Language"; ValueData: "Russian"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "Locale"; ValueData: "ru"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "CD Drive"; ValueData: "{src}"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "Install Dir"; ValueData: "{app}\Ep1\"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "Product GUID"; ValueData: "{{B931FB80-537A-4600-00AD-AC5DEDB6C25B}"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "Region"; ValueData: "NorthAmerica"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "Folder"; ValueData: "{commonprograms}\Electronic Arts\Под знаменем Короля-чародея™\"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "Patch URL"; ValueData: "http://transtest.ea.com/Electronic Arts/The Battle for Middle-earth 2/NorthAmerica"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "Suppression Exe"; ValueData: "rtsi.exe"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0"; ValueType: dword; ValueName: "Language"; ValueData: "$00000010"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0"; ValueType: string; ValueName: "DisplayName"; ValueData: "Под знаменем Короля-чародея™"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0"; ValueType: string; ValueName: "LanguageName"; ValueData: "Russian"; Flags: uninsdeletekey

Где XXXXXXXXXXXXXXXXXXXX - Ключ игры или что там у вас.

gosnitsse 23-01-2020 17:11 2906518

Спасибо большое

gosnitsse 23-01-2020 23:51 2906560

Здравствуйте, проблема такая

Код:

Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueData: "{app}\lotrbfme2.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Path; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueData: "{app}\Ep1\lotrbfme2ep1.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Path; ValueData: "{app}\Ep1"; Flags: uninsdeletevalue uninsdeletekeyifempty

Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Language; ValueData: russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: InstallPath; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: dword; ValueName: Version; ValueData: $00010006; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: dword; ValueName: MapPackVersion; ValueData: $00010000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: dword; ValueName: UseLocalUserMaps; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: UserDataLeafName; ValueData: Битва за Средиземье - Мои файлы; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\ergc; ValueType: string; ValueData: J7F79F9MHXQFBFKGHKAW; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Language; ValueData: russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: InstallPath; ValueData: "{app}\Ep1\"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: dword; ValueName: Version; ValueData: $00020001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: dword; ValueName: MapPackVersion; ValueData: $00020000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: dword; ValueName: UseLocalUserMaps; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: UserDataLeafName; ValueData: Властелин Колец, Под знаменем Короля-чародея - Мои файлы; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc; ValueType: string; ValueData: SEW6Y8K88UQB3GRZEE9M; Flags: uninsdeletevalue uninsdeletekeyifempty

Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueData: "{app}\lotrbfme2.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Path; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueData: "{app}\Ep1\lotrbfme2ep1.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Path; ValueData: "{app}\Ep1"; Flags: uninsdeletevalue uninsdeletekeyifempty

Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueData: "{app}\Ep1\lotrbfme2ep1.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Path; ValueData: "{app}\Ep1"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueData: "{app}\lotrbfme2.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Path; ValueData: "{app}\LORD"; Flags: uninsdeletevalue uninsdeletekeyifempty


Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Language; ValueData: russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: InstallPath; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: dword; ValueName: Version; ValueData: $00010006; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: dword; ValueName: MapPackVersion; ValueData: $00010000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: dword; ValueName: UseLocalUserMaps; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: UserDataLeafName; ValueData: Битва за Средиземье - Мои файлы; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\ergc; ValueType: string; ValueData: J7F79F9MHXQFBFKGHKAW; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Language; ValueData: russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: InstallPath; ValueData: "{app}\Ep1\"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: dword; ValueName: Version; ValueData: $00020001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: dword; ValueName: MapPackVersion; ValueData: $00020000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: dword; ValueName: UseLocalUserMaps; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: UserDataLeafName; ValueData: Властелин Колец, Под знаменем Короля-чародея - Мои файлы; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc; ValueType: string; ValueData: SEW6Y8K88UQB3GRZEE9M; Flags: uninsdeletevalue uninsdeletekeyifempty

Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueData: "{app}\lotrbfme2.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Path; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueData: "{app}\Ep1\lotrbfme2ep1.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Path; ValueData: "{app}\Ep1"; Flags: uninsdeletevalue uninsdeletekeyifempty


это нужные коды для игры

gosnitsse 23-01-2020 23:53 2906562

сейчас будет абсолютно весь код для игры имеется в виду реестр
Код:

Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueData: "{app}\lotrbfme2.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Path; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueData: "{app}\Ep1\lotrbfme2ep1.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Path; ValueData: "{app}\Ep1"; Flags: uninsdeletevalue uninsdeletekeyifempty

Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Language; ValueData: russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: InstallPath; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: dword; ValueName: Version; ValueData: $00010006; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: dword; ValueName: MapPackVersion; ValueData: $00010000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: dword; ValueName: UseLocalUserMaps; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: UserDataLeafName; ValueData: Битва за Средиземье - Мои файлы; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\ergc; ValueType: string; ValueData: J7F79F9MHXQFBFKGHKAW; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Language; ValueData: russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: InstallPath; ValueData: "{app}\Ep1\"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: dword; ValueName: Version; ValueData: $00020001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: dword; ValueName: MapPackVersion; ValueData: $00020000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: dword; ValueName: UseLocalUserMaps; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: UserDataLeafName; ValueData: Властелин Колец, Под знаменем Короля-чародея - Мои файлы; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc; ValueType: string; ValueData: SEW6Y8K88UQB3GRZEE9M; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: DisplayName; ValueData: Битва за Средиземье™ II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Installed From; ValueData: H:\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Registration; ValueData: SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\ergc; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: CacheSize; ValueData: 5441287168; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: SwapSize; ValueData: 0; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Language; ValueData: Russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Locale; ValueData: ru; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: CD Drive; ValueData: H:\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Install Dir; ValueData: C:\PROGRA~1\LORDOF~1\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Product GUID; ValueData: {{2A9F95AB-65A3-432c-8631-B8BC5BF7477A}; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Region; ValueData: NorthAmerica; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Folder; ValueData: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Electronic Arts\Битва за Средиземье™ II\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Patch URL; ValueData: https://vk.com/bfme_tood2; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Suppression Exe; ValueData: rtsi.exe; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\1.0; ValueType: dword; ValueName: Language; ValueData: $00000010; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\1.0; ValueType: string; ValueName: DisplayName; ValueData: Битва за Средиземье™ II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\1.0; ValueType: string; ValueName: LanguageName; ValueData: Russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: DisplayName; ValueData: Под знаменем Короля-чародея™; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Installed From; ValueData: H:\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Registration; ValueData: SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: CacheSize; ValueData: 3139187712; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: SwapSize; ValueData: 0; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Language; ValueData: Russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Locale; ValueData: ru; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: CD Drive; ValueData: H:\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Install Dir; ValueData: C:\PROGRA~1\LORDOF~1\Ep1\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Product GUID; ValueData: {{B931FB80-537A-4600-00AD-AC5DEDB6C25B}; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Region; ValueData: NorthAmerica; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Folder; ValueData: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Electronic Arts\Под знаменем Короля-чародея™\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Patch URL; ValueData: https://vk.com/bfme_tood2; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Suppression Exe; ValueData: rtsi.exe; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0; ValueType: dword; ValueName: Language; ValueData: $00000010; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0; ValueType: string; ValueName: DisplayName; ValueData: Под знаменем Короля-чародея™; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0; ValueType: string; ValueName: LanguageName; ValueData: Russian; Flags: uninsdeletevalue uninsdeletekeyifempty

Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: DisplayName; ValueData: The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: DisplayVersion; ValueData: 1.3.7.1; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: dword; ValueName: VersionMajor; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: dword; ValueName: VersionMinor; ValueData: $00000003; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: Publisher; ValueData: ThoA Team; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: DisplayIcon; ValueData: "{app}\Uninstall_Repack.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: UninstallString; ValueData: "{app}\Uninstall_Repack.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: URLInfoAbout; ValueData: http://warofthering.ru/forum/; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: HelpLink; ValueData: http://vk.com/thoa_tournament; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: InstallLocation; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: InstallSource; ValueData: D:\torrets\Lord of the Rings - The History of Ages\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: InstallDate; ValueData: 20200123; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: dword; ValueName: Language; ValueData: $00000419; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: dword; ValueName: EstimatedSize; ValueData: $00000066; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: dword; ValueName: NoModify; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: dword; ValueName: NoRepair; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty

Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueData: "{app}\lotrbfme2.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Path; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueData: "{app}\Ep1\lotrbfme2ep1.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Path; ValueData: "{app}\Ep1"; Flags: uninsdeletevalue uninsdeletekeyifempty

Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueData: "{app}\Ep1\lotrbfme2ep1.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Path; ValueData: "{app}\Ep1"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueData: "{app}\lotrbfme2.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Path; ValueData: "{app}\LORD"; Flags: uninsdeletevalue uninsdeletekeyifempty

часть 1

gosnitsse 23-01-2020 23:54 2906563

Код:

Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows NT\CurrentVersion\VolatileNotifications; ValueType: binary; ValueName: 41C64E6DA3BD4855; ValueData: 01 00 04 80 00 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 02 00 1c 00 01 00 00 00 00 00 14 00 03 00 00 00 01 01 00 00 00 00 00 05 0b 00 00 00 04 00 00 00; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows NT\CurrentVersion\VolatileNotifications; ValueType: binary; ValueName: 41C64E6DA3BD7055; ValueData: 01 00 04 80 30 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 02 00 1c 00 01 00 00 00 00 00 14 00 13 00 1f 00 01 01 00 00 00 00 00 05 12 00 00 00 01 01 00 00 00 00 00 05 12 00 00 00 04 00 00 00; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows NT\CurrentVersion\VolatileNotifications; ValueType: binary; ValueName: 41C64E6DA385A855; ValueData: 01 00 04 80 44 00 00 00 50 00 00 00 00 00 00 00 14 00 00 00 02 00 30 00 02 00 00 00 00 00 14 00 03 00 00 00 01 01 00 00 00 00 00 05 12 00 00 00 00 00 14 00 00 00 01 00 01 01 00 00 00 00 00 05 12 00 00 00 01 01 00 00 00 00 00 05 12 00 00 00 01 01 00 00 00 00 00 05 12 00 00 00 20 00 00 00; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows NT\CurrentVersion\VolatileNotifications; ValueType: binary; ValueName: 41C64E6DA385B055; ValueData: 01 00 04 80 44 00 00 00 50 00 00 00 00 00 00 00 14 00 00 00 02 00 30 00 02 00 00 00 00 00 14 00 03 00 00 00 01 01 00 00 00 00 00 05 12 00 00 00 00 00 14 00 00 00 01 00 01 01 00 00 00 00 00 05 12 00 00 00 01 01 00 00 00 00 00 05 12 00 00 00 01 01 00 00 00 00 00 05 12 00 00 00 20 00 00 00; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows NT\CurrentVersion\VolatileNotifications; ValueType: binary; ValueName: 41C64E6DA385B855; ValueData: 01 00 04 80 44 00 00 00 50 00 00 00 00 00 00 00 14 00 00 00 02 00 30 00 02 00 00 00 00 00 14 00 03 00 00 00 01 01 00 00 00 00 00 05 12 00 00 00 00 00 14 00 00 00 01 00 01 01 00 00 00 00 00 05 12 00 00 00 01 01 00 00 00 00 00 05 12 00 00 00 01 01 00 00 00 00 00 05 12 00 00 00 20 00 00 00; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows NT\CurrentVersion\VolatileNotifications; ValueType: binary; ValueName: 41C64E6DA385C055; ValueData: 01 00 04 80 44 00 00 00 50 00 00 00 00 00 00 00 14 00 00 00 02 00 30 00 02 00 00 00 00 00 14 00 03 00 00 00 01 01 00 00 00 00 00 05 12 00 00 00 00 00 14 00 00 00 01 00 01 01 00 00 00 00 00 05 12 00 00 00 01 01 00 00 00 00 00 05 12 00 00 00 01 01 00 00 00 00 00 05 12 00 00 00 20 00 00 00; Flags: uninsdeletevalue uninsdeletekeyifempty

Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Language; ValueData: russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: InstallPath; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: dword; ValueName: Version; ValueData: $00010006; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: dword; ValueName: MapPackVersion; ValueData: $00010000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: dword; ValueName: UseLocalUserMaps; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: UserDataLeafName; ValueData: Битва за Средиземье - Мои файлы; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\ergc; ValueType: string; ValueData: J7F79F9MHXQFBFKGHKAW; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Language; ValueData: russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: InstallPath; ValueData: "{app}\Ep1\"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: dword; ValueName: Version; ValueData: $00020001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: dword; ValueName: MapPackVersion; ValueData: $00020000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: dword; ValueName: UseLocalUserMaps; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: UserDataLeafName; ValueData: Властелин Колец, Под знаменем Короля-чародея - Мои файлы; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc; ValueType: string; ValueData: SEW6Y8K88UQB3GRZEE9M; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: DisplayName; ValueData: Битва за Средиземье™ II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Installed From; ValueData: H:\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Registration; ValueData: SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\ergc; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: CacheSize; ValueData: 5441287168; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: SwapSize; ValueData: 0; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Language; ValueData: Russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Locale; ValueData: ru; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: CD Drive; ValueData: H:\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Install Dir; ValueData: C:\PROGRA~1\LORDOF~1\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Product GUID; ValueData: {{2A9F95AB-65A3-432c-8631-B8BC5BF7477A}; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Region; ValueData: NorthAmerica; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Folder; ValueData: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Electronic Arts\Битва за Средиземье™ II\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Patch URL; ValueData: http://transtest.ea.com/Electronic Arts/The Battle for Middle-earth 2/NorthAmerica; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Suppression Exe; ValueData: rtsi.exe; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\1.0; ValueType: dword; ValueName: Language; ValueData: $00000010; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\1.0; ValueType: string; ValueName: DisplayName; ValueData: Битва за Средиземье™ II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\1.0; ValueType: string; ValueName: LanguageName; ValueData: Russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: DisplayName; ValueData: Под знаменем Короля-чародея™; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Installed From; ValueData: H:\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Registration; ValueData: SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: CacheSize; ValueData: 3139187712; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: SwapSize; ValueData: 0; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Language; ValueData: Russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Locale; ValueData: ru; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: CD Drive; ValueData: H:\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Install Dir; ValueData: C:\PROGRA~1\LORDOF~1\Ep1\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Product GUID; ValueData: {{B931FB80-537A-4600-00AD-AC5DEDB6C25B}; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Region; ValueData: NorthAmerica; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Folder; ValueData: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Electronic Arts\Под знаменем Короля-чародея™\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Patch URL; ValueData: http://transtest.ea.com/Electronic Arts/The Battle for Middle-earth 2/NorthAmerica; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Suppression Exe; ValueData: rtsi.exe; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0; ValueType: dword; ValueName: Language; ValueData: $00000010; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0; ValueType: string; ValueName: DisplayName; ValueData: Под знаменем Короля-чародея™; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0; ValueType: string; ValueName: LanguageName; ValueData: Russian; Flags: uninsdeletevalue uninsdeletekeyifempty

Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: DisplayName; ValueData: The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: DisplayVersion; ValueData: 1.3.7.1; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: dword; ValueName: VersionMajor; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: dword; ValueName: VersionMinor; ValueData: $00000003; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: Publisher; ValueData: ThoA Team; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: DisplayIcon; ValueData: "{app}\Uninstall_Repack.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: UninstallString; ValueData: "{app}\Uninstall_Repack.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: URLInfoAbout; ValueData: http://warofthering.ru/forum/; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: HelpLink; ValueData: http://vk.com/thoa_tournament; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: InstallLocation; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: InstallSource; ValueData: D:\torrents\Lord of the Rings - The History of Ages\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: string; ValueName: InstallDate; ValueData: 20200123; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: dword; ValueName: Language; ValueData: $00000419; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: dword; ValueName: EstimatedSize; ValueData: $00000066; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: dword; ValueName: NoModify; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\The History of Ages 1.3.7.1 The Full Game (with LOTR-BFME 2-ROTWK); ValueType: dword; ValueName: NoRepair; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty

Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueData: "{app}\lotrbfme2.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Path; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueData: "{app}\Ep1\lotrbfme2ep1.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Path; ValueData: "{app}\Ep1"; Flags: uninsdeletevalue uninsdeletekeyifempty

Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001\Software\Classes\VirtualStore; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001\Software\Classes\VirtualStore\MACHINE; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001\Software\Classes\VirtualStore\MACHINE\SOFTWARE; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001\Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001\Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001\Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001\Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: InstallPath; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001\Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc; ValueType: string; ValueData: SEW6Y8K88UQB3GRZEE9M; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001\Software\Microsoft\Windows\CurrentVersion\UFH; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001_Classes\VirtualStore; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001_Classes\VirtualStore\MACHINE; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001_Classes\VirtualStore\MACHINE\SOFTWARE; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001_Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001_Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001_Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001_Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: InstallPath; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001_Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc; ValueType: string; ValueData: SEW6Y8K88UQB3GRZEE9M; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKCU; SubKey: Software\Classes\VirtualStore; Flags: uninsdeletekeyifempty
Root: HKCU; SubKey: Software\Classes\VirtualStore\MACHINE; Flags: uninsdeletekeyifempty
Root: HKCU; SubKey: Software\Classes\VirtualStore\MACHINE\SOFTWARE; Flags: uninsdeletekeyifempty
Root: HKCU; SubKey: Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node; Flags: uninsdeletekeyifempty
Root: HKCU; SubKey: Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKCU; SubKey: Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts; Flags: uninsdeletekeyifempty

часть 2

gosnitsse 23-01-2020 23:55 2906565

Код:

Root: HKCU; SubKey: Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: InstallPath; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKCU; SubKey: Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc; ValueType: string; ValueData: SEW6Y8K88UQB3GRZEE9M; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKCR; SubKey: VirtualStore; Flags: uninsdeletekeyifempty
Root: HKCR; SubKey: VirtualStore\MACHINE; Flags: uninsdeletekeyifempty
Root: HKCR; SubKey: VirtualStore\MACHINE\SOFTWARE; Flags: uninsdeletekeyifempty
Root: HKCR; SubKey: VirtualStore\MACHINE\SOFTWARE\WOW6432Node; Flags: uninsdeletekeyifempty
Root: HKCR; SubKey: VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKCR; SubKey: VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKCR; SubKey: VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: InstallPath; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001_Classes\VirtualStore; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001_Classes\VirtualStore\MACHINE; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001_Classes\VirtualStore\MACHINE\SOFTWARE; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001_Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001_Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001_Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001_Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: InstallPath; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001_Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc; ValueType: string; ValueData: SEW6Y8K88UQB3GRZEE9M; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001\Software\Classes\VirtualStore; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001\Software\Classes\VirtualStore\MACHINE; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001\Software\Classes\VirtualStore\MACHINE\SOFTWARE; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001\Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001\Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001\Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001\Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: InstallPath; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001\Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc; ValueType: string; ValueData: SEW6Y8K88UQB3GRZEE9M; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKCU; SubKey: Software\Classes\VirtualStore; Flags: uninsdeletekeyifempty
Root: HKCU; SubKey: Software\Classes\VirtualStore\MACHINE; Flags: uninsdeletekeyifempty
Root: HKCU; SubKey: Software\Classes\VirtualStore\MACHINE\SOFTWARE; Flags: uninsdeletekeyifempty
Root: HKCU; SubKey: Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node; Flags: uninsdeletekeyifempty
Root: HKCU; SubKey: Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKCU; SubKey: Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKCU; SubKey: Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: InstallPath; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKCU; SubKey: Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc; ValueType: string; ValueData: SEW6Y8K88UQB3GRZEE9M; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKCR; SubKey: VirtualStore; Flags: uninsdeletekeyifempty
Root: HKCR; SubKey: VirtualStore\MACHINE; Flags: uninsdeletekeyifempty
Root: HKCR; SubKey: VirtualStore\MACHINE\SOFTWARE; Flags: uninsdeletekeyifempty
Root: HKCR; SubKey: VirtualStore\MACHINE\SOFTWARE\WOW6432Node; Flags: uninsdeletekeyifempty
Root: HKCR; SubKey: VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKCR; SubKey: VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKCR; SubKey: VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: InstallPath; ValueData: D:\Games\Lord of the Rings - The History of Ages\; Flags: uninsdeletevalue uninsdeletekeyifempty

часть 3

Nordek 24-01-2020 02:44 2906588

Всё что идёт:
Код:

Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\...
не нужно - Инсталлятор сам создаст.

Это также не нужно:
Код:

Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows NT\CurrentVersion\VolatileNotifications\...
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001\...
Root: HKU; SubKey: S-1-5-21-2945832715-657854022-1696327829-1001_Classes\...


Это не нужно:
Код:

HKLM\SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\...
HKLM\SYSTEM\ControlSet002\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\...
HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\...




По поводу [Registry] в x86 инсталляторе к x64 ОС:
Всё что идёт такое:
Код:

Root: HKLM; SubKey: SOFTWARE\Electronic Arts

делаете такое:
Код:

Root: HKLM64; SubKey: SOFTWARE\Electronic Arts

а всё что идёт такое:
Код:

Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts

делаете такое:
Код:

Root: HKLM; SubKey: SOFTWARE\Electronic Arts

gosnitsse 24-01-2020 09:30 2906603

Сейчас попробую, я убрал все ветви которые вы мне сказали и оставил ветки где прописан путь к экзешникам
Код:

Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Path; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; Flags: uninsdeletevalue uninsdeletekeyifempty

ключи где путь к ключам игры
Код:

Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\ergc; ValueType: string; ValueData: J7F79F9MHXQFBFKGHKAW; Flags: uninsdeletevalue uninsdeletekeyifempty
потом после ключей ещё эту штуку, не знаю зачем она
Код:

Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: DisplayName; ValueData: Битва за Средиземье™ II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Installed From; ValueData: H:\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Registration; ValueData: SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\ergc; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: CacheSize; ValueData: 5441287168; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: SwapSize; ValueData: 0; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Language; ValueData: Russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Locale; ValueData: ru; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: CD Drive; ValueData: H:\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Install Dir; ValueData: C:\PROGRA~1\LORDOF~1\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Product GUID; ValueData: {{2A9F95AB-65A3-432c-8631-B8BC5BF7477A}; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Region; ValueData: NorthAmerica; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Folder; ValueData: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Electronic Arts\Битва за Средиземье™ II\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Patch URL; ValueData: http://transtest.ea.com/Electronic Arts/The Battle for Middle-earth 2/NorthAmerica; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Suppression Exe; ValueData: rtsi.exe; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\1.0; ValueType: dword; ValueName: Language; ValueData: $00000010; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\1.0; ValueType: string; ValueName: DisplayName; ValueData: Битва за Средиземье™ II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Battle for Middle-earth II\1.0; ValueType: string; ValueName: LanguageName; ValueData: Russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: DisplayName; ValueData: Под знаменем Короля-чародея™; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Installed From; ValueData: H:\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Registration; ValueData: SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: CacheSize; ValueData: 3139187712; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: SwapSize; ValueData: 0; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Language; ValueData: Russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Locale; ValueData: ru; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: CD Drive; ValueData: H:\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Install Dir; ValueData: C:\PROGRA~1\LORDOF~1\Ep1\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Product GUID; ValueData: {{B931FB80-537A-4600-00AD-AC5DEDB6C25B}; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Region; ValueData: NorthAmerica; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Folder; ValueData: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Electronic Arts\Под знаменем Короля-чародея™\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Patch URL; ValueData: http://transtest.ea.com/Electronic Arts/The Battle for Middle-earth 2/NorthAmerica; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Suppression Exe; ValueData: rtsi.exe; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0; ValueType: dword; ValueName: Language; ValueData: $00000010; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0; ValueType: string; ValueName: DisplayName; ValueData: Под знаменем Короля-чародея™; Flags: uninsdeletevalue uninsdeletekeyifempty

её тоже оставил.


Вы мне сказали что 32 инсталяторы к 64 битным системам обращаются иначе

где стоит HKLM нужно сделать HKLM64 и где присутствует WOW6432Node убрать его и оставить
Код:

SOFTWARE\Electronic Arts
если я правильно понял, то везде поменять на HKLM64 и где есть WOW6432Node просто стереть его, сейчас попробую и что если идёт и HKLM и WOW6432Node то убираем только WOW6432Node, а HKLM не меняем.


Можно уточнить?

Код:

Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueData: "{app}\lotrbfme2.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Path; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueData: "{app}\Ep1\lotrbfme2ep1.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Path; ValueData: "{app}\Ep1"; Flags: uninsdeletevalue uninsdeletekeyifempty

Это не трогать?






Код:

Root: HKLM; SubKey: SOFTWARE\WOW6432Node\Electronic Arts......
тут получится просто
не
Код:

Root: HKLM64; SubKey: SOFTWARE\Electronic Arts......
а
Код:

Root: HKLM; SubKey: SOFTWARE\Electronic Arts......
верно?

и ещё... у меня нет таких кодов
Код:

Root: HKLM; SubKey: SOFTWARE\Electronic Arts
чтобы менять у них на HKLM64 я так понял это на будущее

Я сделал как было сказано, но вылезает ошибка о не хватке dll

Nordek 24-01-2020 10:04 2906607

Цитата:

Цитата gosnitsse
Вы мне сказали что 32 инсталяторы к 64 битным системам обращаются иначе »

В ОС x64:
Код:

HKEY_LOCAL_MACHINE\SOFTWARE\            - Для x64 параметров
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node - Для x32 параметров

Сведения о реестре Windows для опытных пользователей

Цитата:

Значения корневых ключей с суффиксом 32 (например, HKLM32) приводятся к 32-разрядному представлению реестра; значения корневых ключей с суффиксом 64 (например, HKLM64) приводятся к 64-разрядному представлению реестра.

Значения корневых ключей с суффиксом 64 могут использоваться только в 64-разрядном Windows, иначе произойдет ошибка. На инсталляторе, поддерживающем и 32-разрядные и 64-разрядные архитектуры, можно избежать ошибки, добавляя параметр Check: IsWin64, который заставит тихо пропустить запись, работая при этом на 32-разрядном Windows.

Значения корневых ключей без суффиксов (например, HKLM) эквивалентны значений корневых ключей с суффиксом 32 (например, HKLM32), если инсталлятор не работает в 64-разрядном режиме установки, иначе они эквивалентны значений корневых ключей с суффиксом 64 (например, HKLM64).

gosnitsse 24-01-2020 10:32 2906610

Nordek,

Код:

Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueData: "{app}\lotrbfme2.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Path; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueData: "{app}\Ep1\lotrbfme2ep1.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Path; ValueData: "{app}\Ep1"; Flags: uninsdeletevalue uninsdeletekeyifempty

Root: HKLM64; SubKey: SOFTWARE\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\Electronic Arts; Flags: uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Language; ValueData: russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: InstallPath; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: dword; ValueName: Version; ValueData: $00010006; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: dword; ValueName: MapPackVersion; ValueData: $00010000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: dword; ValueName: UseLocalUserMaps; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: UserDataLeafName; ValueData: Битва за Средиземье - Мои файлы; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\ergc; ValueType: string; ValueData: J7F79F9MHXQFBFKGHKAW; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Language; ValueData: russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: InstallPath; ValueData: "{app}\Ep1\"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: dword; ValueName: Version; ValueData: $00020001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: dword; ValueName: MapPackVersion; ValueData: $00020000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: dword; ValueName: UseLocalUserMaps; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: UserDataLeafName; ValueData: Властелин Колец, Под знаменем Короля-чародея - Мои файлы; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc; ValueType: string; ValueData: SEW6Y8K88UQB3GRZEE9M; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: DisplayName; ValueData: Битва за Средиземье™ II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Installed From; ValueData: H:\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Registration; ValueData: SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\ergc; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: CacheSize; ValueData: 5441287168; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: SwapSize; ValueData: 0; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Language; ValueData: Russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Locale; ValueData: ru; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: CD Drive; ValueData: H:\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Install Dir; ValueData: C:\PROGRA~1\LORDOF~1\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Product GUID; ValueData: {{2A9F95AB-65A3-432c-8631-B8BC5BF7477A}; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Region; ValueData: NorthAmerica; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Folder; ValueData: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Electronic Arts\Битва за Средиземье™ II\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Patch URL; ValueData: https://vk.com/bfme_tood2; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; ValueType: string; ValueName: Suppression Exe; ValueData: rtsi.exe; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Battle for Middle-earth II\1.0; ValueType: dword; ValueName: Language; ValueData: $00000010; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Battle for Middle-earth II\1.0; ValueType: string; ValueName: DisplayName; ValueData: Битва за Средиземье™ II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Battle for Middle-earth II\1.0; ValueType: string; ValueName: LanguageName; ValueData: Russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: DisplayName; ValueData: Под знаменем Короля-чародея™; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Installed From; ValueData: H:\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Registration; ValueData: SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: CacheSize; ValueData: 3139187712; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: SwapSize; ValueData: 0; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Language; ValueData: Russian; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Locale; ValueData: ru; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: CD Drive; ValueData: H:\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Install Dir; ValueData: C:\PROGRA~1\LORDOF~1\Ep1\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Product GUID; ValueData: {{B931FB80-537A-4600-00AD-AC5DEDB6C25B}; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Region; ValueData: NorthAmerica; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Folder; ValueData: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Electronic Arts\Под знаменем Короля-чародея™\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Patch URL; ValueData: https://vk.com/bfme_tood2; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; ValueType: string; ValueName: Suppression Exe; ValueData: rtsi.exe; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0; ValueType: dword; ValueName: Language; ValueData: $00000010; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0; ValueType: string; ValueName: DisplayName; ValueData: Под знаменем Короля-чародея™; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0; ValueType: string; ValueName: LanguageName; ValueData: Russian; Flags: uninsdeletevalue uninsdeletekeyifempty


Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Battle for Middle-earth II; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueData: "{app}\lotrbfme2.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe; ValueType: string; ValueName: Path; ValueData: "{app}"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Game Registry; ValueData: SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Restart; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: DirectX Installed; ValueData: $00000000; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: dword; ValueName: Installed; ValueData: $00000001; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueData: "{app}\Ep1\lotrbfme2ep1.exe"; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM64; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe; ValueType: string; ValueName: Path; ValueData: "{app}\Ep1"; Flags: uninsdeletevalue uninsdeletekeyifempty

Благодаря вам я ну уже почти близок к цели, вот прям чуть-чуть осталось, не охота бросать после стольких проделанных действий, я бы не против помощи в дискорде, мне 20 лет, если для вас есть значение возраста просто теперь игра на чёрном экране и не запускается =) мне уже смешно)))

SEGosnits
#3242


А если само приложение 32bit но мы ставим в реестре 64 так как система, ничего не будет?

gosnitsse 24-01-2020 12:32 2906634

Простите что надоедаю, но жутко хочется сделать именно эту игру(((( это безвыходная ситуация, я не знаю уже что и как добавлять чтобы заработало, ужас.

El Sanchez 24-01-2020 13:10 2906645

Цитата:

Цитата gosnitsse
я не знаю уже что и как добавлять чтобы заработало, ужас. »

gosnitsse, просто Copy/Paste
Скрытый текст

Код:

[Registry]
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts"; Flags: uninsdeletekeyifempty
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Electronic Arts"; Flags: uninsdeletekeyifempty
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; Flags: uninsdeletekey
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: Language; ValueData: russian
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: InstallPath; ValueData: {app}
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: dword; ValueName: Version; ValueData: $00010006
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: dword; ValueName: MapPackVersion; ValueData: $00010000
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: dword; ValueName: UseLocalUserMaps; ValueData: $00000000
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: UserDataLeafName; ValueData: "Битва за Средиземье - Мои файлы"
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\ergc"; ValueType: string; ValueData: J7F79F9MHXQFBFKGHKAW

Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; Flags: uninsdeletekey
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: Language; ValueData: russian
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: InstallPath; ValueData: {app}\Ep1\
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: dword; ValueName: Version; ValueData: $00020001
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: dword; ValueName: MapPackVersion; ValueData: $00020000
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: dword; ValueName: UseLocalUserMaps; ValueData: $00000000
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: UserDataLeafName; ValueData: "Властелин Колец, Под знаменем Короля-чародея - Мои файлы"
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc"; ValueType: string; ValueData: SEW6Y8K88UQB3GRZEE9M

Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; Flags: uninsdeletekey
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: DisplayName; ValueData: "Битва за Средиземье™ II"
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Installed From"; ValueData: H:\
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: Registration; ValueData: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\ergc"
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: CacheSize; ValueData: 5441287168
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: SwapSize; ValueData: 0
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: Language; ValueData: Russian
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: Locale; ValueData: ru
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "CD Drive"; ValueData: H:\
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Install Dir"; ValueData: {app}\
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Product GUID"; ValueData: {{2A9F95AB-65A3-432c-8631-B8BC5BF7477A}
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: Region; ValueData: NorthAmerica
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: Folder; ValueData: "{commonprograms}\Electronic Arts\Битва за Средиземье™ II\"
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Patch URL"; ValueData: https://vk.com/bfme_tood2
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Suppression Exe"; ValueData: rtsi.exe
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II\1.0"; ValueType: dword; ValueName: Language; ValueData: $00000010
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II\1.0"; ValueType: string; ValueName: DisplayName; ValueData: "Битва за Средиземье™ II"
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II\1.0"; ValueType: string; ValueName: LanguageName; ValueData: Russian

Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; Flags: uninsdeletekey
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: DisplayName; ValueData: "Под знаменем Короля-чародея™"
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "Installed From"; ValueData: H:\
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: Registration; ValueData: "SOFTWARE\Electronic Arts\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\ergc"
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: CacheSize; ValueData: 3139187712
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: SwapSize; ValueData: 0
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: Language; ValueData: Russian
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: Locale; ValueData: ru
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "CD Drive"; ValueData: H:\
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "Install Dir"; ValueData: {app}\Ep1\
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "Product GUID"; ValueData: {{B931FB80-537A-4600-00AD-AC5DEDB6C25B}
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: Region; ValueData: NorthAmerica
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: Folder; ValueData: "{commonprograms}\Electronic Arts\Под знаменем Короля-чародея™\"
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "Patch URL"; ValueData: https://vk.com/bfme_tood2
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"; ValueType: string; ValueName: "Suppression Exe"; ValueData: rtsi.exe
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0"; ValueType: dword; ValueName: Language; ValueData: $00000010
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0"; ValueType: string; ValueName: DisplayName; ValueData: "Под знаменем Короля-чародея™"
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king\1.0"; ValueType: string; ValueName: LanguageName; ValueData: Russian

Root: HKLM; SubKey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe"; Flags: uninsdeletekey
Root: HKLM; SubKey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe"; ValueType: string; ValueData: {app}\lotrbfme2.exe
Root: HKLM; SubKey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe"; ValueType: string; ValueName: "Game Registry"; ValueData: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"
Root: HKLM; SubKey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe"; ValueType: dword; ValueName: Restart; ValueData: $00000000
Root: HKLM; SubKey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe"; ValueType: dword; ValueName: "DirectX Installed"; ValueData: $00000000
Root: HKLM; SubKey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe"; ValueType: dword; ValueName: Installed; ValueData: $00000001
Root: HKLM; SubKey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2.exe"; ValueType: string; ValueName: Path; ValueData: {app}

Root: HKLM; SubKey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe"; Flags: uninsdeletekey
Root: HKLM; SubKey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe"; ValueType: string; ValueData: {app}\Ep1\lotrbfme2ep1.exe
Root: HKLM; SubKey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe"; ValueType: string; ValueName: "Game Registry"; ValueData: "SOFTWARE\Electronic Arts\The Lord of the Rings, The Rise of the Witch-king"
Root: HKLM; SubKey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe"; ValueType: dword; ValueName: Restart; ValueData: $00000000
Root: HKLM; SubKey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe"; ValueType: dword; ValueName: "DirectX Installed"; ValueData: $00000000
Root: HKLM; SubKey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe"; ValueType: dword; ValueName: Installed; ValueData: $00000001
Root: HKLM; SubKey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\lotrbfme2ep1.exe"; ValueType: string; ValueName: Path; ValueData: {app}\Ep1


Nordek 24-01-2020 13:24 2906655

Цитата:

Цитата gosnitsse
просто теперь игра на чёрном экране и не запускается »

Вы хотя бы черновую копию подраздела реестра игры сделали?

Заинтересовало что вы там слепить пытаетесь.
На сколько я понял вы хотите 2 игры в одну собрать.

Скачал одну, поработал 5, от силы 10 минут, итог:
Скрытый текст
Код:

[Setup]
AppId=LotR_TBFMEII
AppName=Властелин Колец(tm) - Битва за Средиземье™ II
AppVersion=1.5
AppVerName=The Lord of the Rings: The Battle for Middle-earth II
AppPublisher=My Company, Inc.
AppPublisherURL=http://www.example.com/
AppSupportURL=http://www.example.com/
AppUpdatesURL=http://www.example.com/
DefaultDirName={pf}\LotR_Battle_for_ME_II
DefaultGroupName=LotR - The Battle for Middle-earth II
OutputDir=.
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "LotR\Battle_for_ME_II\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

[Icons]
Name: "{group}\Властелин Колец™ - Битва за Средиземье™ II"; Filename: "{app}\lotrbfme2.exe"
Name: "{group}\{cm:UninstallProgram,Властелин Колец™ - Битва за Средиземье™ II}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\Властелин Колец™ - Битва за Средиземье™ II"; Filename: "{app}\lotrbfme2.exe"; Tasks: desktopicon

[Run]
Filename: "{app}\lotrbfme2.exe"; Description: "{cm:LaunchProgram,Властелин Колец(tm) - Битва за Средиземье(tm) II}"; Flags: nowait postinstall skipifsilent

[Registry]
;
Root: "HKLM"; SubKey: SOFTWARE\Electronic Arts; Flags: uninsdeletekeyifempty
Root: "HKLM"; SubKey: SOFTWARE\Electronic Arts\Electronic Arts; Flags: uninsdeletekeyifempty
;
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Language"; ValueData: "russian"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: dword; ValueName: "Version"; ValueData: "$00010006"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: dword; ValueName: "MapPackVersion"; ValueData: "$00010000"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: dword; ValueName: "UseLocalUserMaps"; ValueData: "$00000000"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "UserDataLeafName"; ValueData: "Битва за Средиземье"; Flags: uninsdeletekey

; Ключ (Правилами форума запрещено выкладывать, заменил на XXXXXXXXXXXXXXXXXXXX. Используйте свой.)
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\ergc"; ValueType: string; ValueData: "XXXXXXXXXXXXXXXXXXXX"; Flags: uninsdeletekey
;
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "DisplayName"; ValueData: "Битва за Средиземье™ II"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Installed From"; ValueData: "{src}"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Registration"; ValueData: "SOFTWARE\Electronic Arts\Electronic Arts\The Battle for Middle-earth II\ergc"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "CacheSize"; ValueData: "5441287168"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "SwapSize"; ValueData: "0"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Language"; ValueData: "Russian"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Locale"; ValueData: "ru"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "CD Drive"; ValueData: "{src}"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Install Dir"; ValueData: "{app}"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Product GUID"; ValueData: "{{2A9F95AB-65A3-432c-8631-B8BC5BF7477A}"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Region"; ValueData: "NorthAmerica"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Patch URL"; ValueData: "http://transtest.ea.com/Electronic Arts/The Battle for Middle-earth 2/NorthAmerica"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II"; ValueType: string; ValueName: "Suppression Exe"; ValueData: "rtsi.exe"; Flags: uninsdeletekey
;
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II\1.0"; ValueType: dword; ValueName: "Language"; ValueData: "$00000010"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II\1.0"; ValueType: string; ValueName: "DisplayName"; ValueData: "Битва за Средиземье™ II"; Flags: uninsdeletekey
Root: "HKLM"; Subkey: "SOFTWARE\Electronic Arts\The Battle for Middle-earth II\1.0"; ValueType: string; ValueName: "LanguageName"; ValueData: "Russian"; Flags: uninsdeletekey


gosnitsse 24-01-2020 14:48 2906689

хех, господи, да, вы правы. Я хочу в игру которую вы скачали, установить мод
HTML код:

https://drive.google.com/file/d/1c91cQ9-C8up6Oiis7E3wSVjt4rrKXCLx/view
.


Код:

C:\Users\Gosni\AppData\Roaming\Властелин Колец, Под знаменем Короля-чародея - Мои файлы\Options.ini -без этого игра работать не будет если его удалить, я коде я указал чтобы он его копировал вместе с папкой
Если по верх игры скачать и поставить
HTML код:

https://drive.google.com/file/d/1c91cQ9-C8up6Oiis7E3wSVjt4rrKXCLx/view
. то игра работать будет (СО ВСЕМИ ТЕКСТУРКАМИ (ЕСЛИ ЗАЙТИ В СРАЖЕНИЕ)), но если потом создать репак этой же игры с модом, а мод - это просто файлы, то увы в сражении и даже при в ходе в игру будет розовый экран который подтверждает что текстурок нет, а в сражении так вообще половины игры не будет, разрешите я позже запишу свои действия на видео, загружу в вк и там вы уже всё увидите. Сейчас я всё равно планировал переустановку системы делать. ))))

gosnitsse 24-01-2020 23:57 2906797

Nordek, El Sanchez, спасибо вам за помощь, я благодаря вам понял какие ключи в реестр в случае чего писать, реально спасибо вам за огромнейшую помощь и за терпение меня аутиста)))) я вам очень многим обязан, я понимаю что до вашего интелекта мне далеко, что я вам помочь подобным не с могу, но всё равно - просите у меня что угодно, денег ну по 500 каждому сброшу чтоб не обидно было, я правда благодарен.

P.S: не в обиду но всё же открывайте полные курсы и гайды чтобы обучать ребят бесплатно или за деньги решайте сами, ваши видосики на ютубе очень помогут у меня последний вопрос остался, вот есть репаки от ХАТТАБА, От МЕХАННИКОВ а так же есть вот реально красиво оформленные другие репаки, к примеру фат гирл и хаттаб, вот на какой программе они делали это??? не подскажите ещё более топовую прогу???? где клепают они. Вы уж обучайте так кого-нибудь, если вдруг в случае вашей смерти так сказать уже всё... не будет больше таких светлых умов. Спасибо вам ребятки. Можно ну и ещё 1 вопрос, при выборе языка если нажать отмену, то выскакивает ошибка и установщик без диспетчера задач уже не убрать, что делать с этим? ВСЁ ЧТО БЫЛО СКАЗАНО МНОЙ - НЕ В ОБИДУ.

gosnitsse 25-01-2020 00:47 2906803

Свсем забыл, а как правильно выцепить ключи реестра которая игра требует?

Nordek 25-01-2020 03:02 2906813

Цитата:

Цитата gosnitsse
курсы и гайды чтобы обучать»

Справки, Примеры, Руководства, Скрипты, Программы в первом сообщении.

Цитата:

Цитата gosnitsse
реально красиво оформленные другие репаки »

Inno хоть и ограничен, тем не менее можно многое сделать в Inno от простых до сложных.

Форум » Ресурсы


Цитата:

Цитата gosnitsse
выцепить ключи реестра которая игра требует? »

RegistryChangesView
RegFromApp
Примеры мониторинга системного реестра

nik1967 25-01-2020 08:43 2906818

Цитата:

Цитата gosnitsse
Можно ну и ещё 1 вопрос, при выборе языка если нажать отмену, то выскакивает ошибка и установщик без диспетчера задач уже не убрать, что делать с этим? »

Без полного скрипта сложно советовать.

Nordek 25-01-2020 09:41 2906822

Цитата:

Цитата gosnitsse
то выскакивает ошибка и установщик без диспетчера задач уже не убрать »

Вы когда скомпилировали, после компиляции - Продолжите, запускайте инсталлятор там же для проверки (Учитывайте, что если у вас установлена программа которую облачаете в инсталлятор - Вносимые данные инсталлятором заменятся исходные, от чего ранее установленная программа станет непригодной для дальнейшего использования).
Когда последует вывод ошибки, и после продолжения инсталлятор не завершится - Просто продолжите нажав (Обвёл красным) эту кнопку (Учитывайте, что это на время тестирования):

- Ошибка проигнорируется и инсталлятор будет завершён.
Далее смотрите ответ от nik1967.

gosnitsse 25-01-2020 14:38 2906866

Спасибо

Beavimo 27-01-2020 10:41 2907080

Добрый день!
Может у когото есть пример для добавления правила в Брандмауэр Windows, потому как все ссылки на примеры битые? Нужно заблокировать устанавливаемой программе доступ в интернет, относительно выбраного пути при установке. Пока что пользую такой пример блокирует вход через хост, ну тогда на сайт не зайти.

CODE
Код:

function InitializeSetup(): Boolean;
 begin
  if FileExists(ExpandConstant('{sys}\drivers\etc\hosts')) then
  begin
    Result:= True;
    end
    else begin
  SaveStringToFile(ExpandConstant('{sys}\drivers\etc\hosts'),'', False)
  Result:= True;
 end
end;

procedure CurStepChanged(CurStep: TSetupStep);
 var
  HostFile: TStringList;
  begin
    HostFile := TStringList.Create;
    try
      with HostFile do
      if CurStep = ssPostInstall then
      begin
      LoadFromFile(ExpandConstant('{sys}\drivers\etc\hosts'));
      if IndexOf('127.0.0.1 www.test.com') = -1 then
    Add('127.0.0.1 www.test.com');
    SaveToFile(ExpandConstant('{sys}\drivers\etc\hosts'));
  end;
  finally
 HostFile.free;
end
end;


nik1967 27-01-2020 13:13 2907105

Beavimo, у меня такой код завалялся.
Добавить в исключения брандмаура
Код:

#define Exe "ashsnap.exe"

[Setup]
AppName = MyApp
AppVerName = MyApp
DefaultDirname = {pf}\MyApp
OutputDir=.

[Code]       
procedure CurStepChanged(CurStep: TSetupStep);
var
 
RC: integer;
  SIn,SOut: String;
begin
  if
CurStep = ssDone then begin   
    SIn:= ' advfirewall firewall add rule name=ashsnapinst dir=in action=block program='+ExpandConstant('"{app}\{#Exe}"')+' enable=yes';
    SOut:= ' advfirewall firewall add rule name=ashsnapinst dir=out action=block program='+ExpandConstant('"{app}\{#Exe}"')+' enable=yes';
    Exec('netsh', SIn, '', SW_HIDE, ewWaitUntilTerminated, RC);
    Exec('netsh', SOut, '', SW_HIDE, ewWaitUntilTerminated, RC);
  end;
end;


Beavimo 27-01-2020 13:57 2907109

nik1967, большое спасибо робит. как бы теперь его отучить не создавать правило повторно, ссылаясь на name=ashsnapinst?

Beavimo 30-01-2020 16:56 2907666

Может кто подскажет как проще реализовать задуманное. Есть батник, перед запуском программы он удаляет ветку реестра, и файл, но ярлык для батника не крепится на панель задач. Как зделать программу (.exe) которая бы удаляла ветку реестра, и некий файл который имеет конкретный путь, а потом запустила бы другую программу, и дела бы это в скритом режыме.
(bat to exe) не предлагать там одни вирусы, может на PascalABCNET можна реализовать задуманое?

Iska 30-01-2020 18:48 2907673

Beavimo, на C/C++. Без .Net.

habib2302 30-01-2020 21:27 2907695

Beavimo, AutoIt в помощь. Могу помочь если надо

Nordek 31-01-2020 15:39 2907775

Цитата:

Цитата web_form
Font.Style:=[fsBold]; »

Всю эту строку, будет не жирный.

Или так:
Код:

    Font.Style := [];



Код:

fsBold      - Жирный
fsItalic    - Курсив
fsUnderline - Подчёрнкнутый
fsStrikeOut - Перечёркнутый

Можно оставить пустым:
Код:

    Font.Style := [];
При необходимости можно добавить:
Код:

    Font.Style := [fsItalic];
либо несколько через запятую:
Код:

    Font.Style := [fsItalic, fsUnderline];

Beavimo 31-01-2020 15:59 2907779

Рабочий пример добавления в Брандмауэр Виндовс, если можна проверьте работоспособность на Виндовс 10
Скрытый текст
Код:

procedure CurStepChanged(CurStep: TSetupStep); var
  RC: Integer;
  SIn, SOut: String;
    begin
    if CurStep=ssInstall then
    begin
    Exec(ExpandConstant('netsh.exe'), 'advfirewall firewall delete rule name="TEST"','', SW_HIDE, ewWaitUntilTerminated, RC)
  SIn:='advfirewall firewall add rule name=OCCTTEST dir=in action=block program='+ExpandConstant('"{app}\TEST.exe"')+' enable=yes'; Exec('netsh',  SIn,'', SW_HIDE, ewWaitUntilTerminated, RC)
  SOut:='advfirewall firewall add rule name=OCCTTEST dir=out action=block program='+ExpandConstant('"{app}\TEST.exe"')+' enable=yes'; Exec('netsh', SOut,'', SW_HIDE, ewWaitUntilTerminated, RC)
end
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); var
  RC: Integer;
  begin
    if CurUninstallStep=usUninstall then
  begin
  Exec(ExpandConstant('netsh.exe'), 'advfirewall firewall delete rule name="TEST"','', SW_HIDE, ewWaitUntilTerminated, RC)
end
end;


Nordek 31-01-2020 17:24 2907791

Цитата:

Цитата Beavimo
на Виндовс 10 »

Проверил - Работает.

Скрытый текст
При первичной установке добавляет во входящие и исходящие.

При повторной установке:
- Удаляет правила:
Цитата:

Цитата Beavimo
Код:

    if CurStep=ssInstall then
    begin
    Exec(ExpandConstant('netsh.exe'), 'advfirewall firewall delete rule name="TEST"','', SW_HIDE, ewWaitUntilTerminated, RC)

»

затем добавляет:
Цитата:

Цитата Beavimo
Код:

  SIn:='advfirewall firewall add rule name=OCCTTEST dir=in action=block program='+ExpandConstant('"{app}\TEST.exe"')+' enable=yes'; Exec('netsh',  SIn,'', SW_HIDE, ewWaitUntilTerminated, RC)
  SOut:='advfirewall firewall add rule name=OCCTTEST dir=out action=block program='+ExpandConstant('"{app}\TEST.exe"')+' enable=yes'; Exec('netsh', SOut,'', SW_HIDE, ewWaitUntilTerminated, RC)

»

При деинсталляции:
Цитата:

Цитата Beavimo
Код:

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); var
  RC: Integer;
  begin
    if CurUninstallStep=usUninstall then
  begin
  Exec(ExpandConstant('netsh.exe'), 'advfirewall firewall delete rule name="TEST"','', SW_HIDE, ewWaitUntilTerminated, RC)

»

- Удаляет.

Далее:
Цитата:

Цитата Beavimo
Код:

SIn:='advfirewall firewall add rule name=OCCTTEST dir=in action=block program='+ExpandConstant('"{app}\TEST.exe"')+' enable=yes'; Exec('netsh', SIn,'', SW_HIDE, ewWaitUntilTerminated, RC) SOut:='advfirewall firewall add rule name=OCCTTEST dir=out action=block program='+ExpandConstant('"{app}\TEST.exe"')+' enable=yes'; Exec('netsh', SOut,'', SW_HIDE, ewWaitUntilTerminated, RC)
»

- Кавычки необходимы.


Итог:
Код:

[Setup]
#define AppName "My Program"
#define AppExeName "MyProg.exe"

[Code]
procedure CurStepChanged(CurStep: TSetupStep); var
  RC: Integer;
  SIn, SOut: String;
    begin
    if CurStep=ssInstall then
    begin
    Exec(ExpandConstant('netsh.exe'), 'advfirewall firewall delete rule name="{#AppName}"','', SW_HIDE, ewWaitUntilTerminated, RC)
  SIn:='advfirewall firewall add rule name="{#AppName}" dir=in action=block program='+ExpandConstant('"{app}\{#AppExeName}"')+' enable=yes'; Exec('netsh',  SIn,'', SW_HIDE, ewWaitUntilTerminated, RC)
  SOut:='advfirewall firewall add rule name="{#AppName}" dir=out action=block program='+ExpandConstant('"{app}\{#AppExeName}"')+' enable=yes'; Exec('netsh', SOut,'', SW_HIDE, ewWaitUntilTerminated, RC)
end
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); var
  RC: Integer;
  begin
    if CurUninstallStep=usUninstall then
  begin
  Exec(ExpandConstant('netsh.exe'), 'advfirewall firewall delete rule name="{#AppName}"','', SW_HIDE, ewWaitUntilTerminated, RC)
end
end;


Beavimo 31-01-2020 19:54 2907802

Хто подскажет почему, вот так работает
CODE
Код:

procedure InitializeWizard();
begin
  RegDeleteValue(HKEY_CURRENT_USER, 'SOFTWARE\TEST', 'PATH_APPLICATION');
end;


а вот так не работает
CODE
Код:

procedure InitializeWizard();
begin
  RegDeleteValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\TEST', 'PATH_APPLICATION');
end;


то есть в курент усер удаляет значение, а в локал лезет в Wow6432Node, как удалить значение в HKEY_LOCAL_MACHINE\SOFTWARE?

Nordek 31-01-2020 20:29 2907805

Цитата:

Цитата Beavimo
а в локал лезет в Wow6432Node, как удалить значение в HKEY_LOCAL_MACHINE\SOFTWARE? »

Вернитесь чуть назад или прочитайте справку.
Вам станет понятно:
Код:

[Code]
procedure InitializeWizard();
begin
  RegDeleteValue(HKLM64, 'SOFTWARE\TEST', 'PATH_APPLICATION');
end;


Beavimo 31-01-2020 21:44 2907812

спасибо всем кто помог.. есть еще один вопрос как удалить файл при установке
CODE
]
Код:

procedure CurStepChanged(CurStep: TSetupStep);
  begin                                                 
  if CurStep = ssInstall then
  DeleteFile(ExpandConstant('C:\run.pid'));
end;


Это работает. А как удалить файл по пути USER\AppData\Roaming\TEST\run.pid?

nik1967 31-01-2020 21:59 2907813

Цитата:

Цитата Beavimo
А как удалить файл по пути USER\AppData\Roaming\TEST\run.pid? »

Почитать справку по Inno?
Скрытый текст

Константы специальных папок

{userappdata} & {commonappdata}
Путь к папке с данными приложения (Application Data).

Код:

procedure CurStepChanged(CurStep: TSetupStep);
begin
  case
CurStep of
   
ssInstall: DeleteFile(ExpandConstant('{userappdata}')+'\TEST\run.pid');
  end;
end;


Beavimo 31-01-2020 22:15 2907814

nik1967, что {userappdata}\Roaming\Roaming\TEST\run.pid что {commonappdata}\Roaming\Roaming\TEST\run.pid файл run.pid как был так и остался на своем месте.
И так тоже ниче не удаляется
Удаление Файла
Код:

[InstallDelete]
Type: files; Name: "{userappdata}\Roaming\TEST\run.pid"



Файл обычный, без каких либо атрибутов.

Nordek 31-01-2020 22:40 2907816

Вложений: 1
Beavimo, Смотрите прикреплённый файл.

Beavimo 31-01-2020 22:49 2907817

Nordek, :clapping: :closed-to

Nordek 01-02-2020 00:10 2907819

Beavimo, В справке аналогично написано, что собственно nik1967: Вам предложил сделать.

Можно иначе - Проявить смекалку и подсмотреть путь:
Код:

[Code]
var
  Edit1: TNewEdit;

procedure InitializeWizard();
begin
  Edit1 := TNewEdit.Create(WizardForm);
  with Edit1 do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(8), ScaleY(328), ScaleX(280), ScaleY(21));
    Text := ExpandConstant('{localappdata}');
  end;
end;


ZVSRus 01-02-2020 09:17 2907843

Beavimo,
Код:

[InstallDelete]
Type: files; Name: "{userappdata}\Roaming\TEST\run.pid"

А так

Код:

[InstallDelete]
Type: files; Name: "{userappdata}\TEST\run.pid"


Beavimo 01-02-2020 11:20 2907849

Вопрос Знатокам :search:! Дошел до деинсталлятора, я так понимаю переименовать (unins000.exe) не получится, и есть ли возможность не создавать (unins000.dat)? Также интересует, можно ли в файле (unins000.exe) поменять описание файла, и его версию?

nik1967 01-02-2020 13:51 2907868

Цитата:

Цитата Beavimo
есть ли возможность не создавать »

Опять же справка.
Скрытый текст

[Setup]: Uninstallable
Возможные значения:
yes или no, или логические выражения
Значение по умолчанию:
yes

Описание:
Inno Setup определяет, создавать ли автоматический деинсталлятор. При значении yes или логического выражения True он создается. Иначе автоматическое удаление будет невозможно, так что пользователь должен будет вручную удалять программу.

Например:
[Setup]
Uninstallable=not IsTaskSelected('portablemode')

[Tasks]
Name: portablemode; Описание: "Portable Mode"

Beavimo 01-02-2020 16:24 2907885

nik1967, это совсем не то. у файла (unins000.exe) есть описание файла, в моем случае (Setup/Unistall), и версия (51.1052.0.0), возможно ли подставить свои значения.

ZVSRus 01-02-2020 17:46 2907895


Beavimo 01-02-2020 19:28 2907915

ZVSRus, :lol: спасибо разсмешыл, вот я спаршую возможно сделать так как у вас на картинке из под Инно, я только учусь, есть люди которые знают намного больше, и просто ответят нет низя потому что знают это, и мне день сохранят на изучение, потому как поиск не дает положытельного результата по этой теме.

Beavimo 01-02-2020 19:43 2907919

мож подскажыте как довести этот код до ума
CODE
Код:

procedure CurStepChanged(CurStep: TSetupStep); var
  RC: Integer;
  SIn, SOut: String;
    begin
    if CurStep=ssInstall then
    begin
    Exec(ExpandConstant('netsh.exe'), 'advfirewall firewall delete rule name="TEST"','', SW_HIDE, ewWaitUntilTerminated, RC)
  SIn:='advfirewall firewall add rule name="TEST" dir=in action=block program='+ExpandConstant('"{app}\TEST.exe"')+' enable=yes'; Exec('netsh',  SIn,'', SW_HIDE, ewWaitUntilTerminated, RC)
  SOut:='advfirewall firewall add rule name="TEST" dir=out action=block program='+ExpandConstant('"{app}\TEST.exe"')+' enable=yes'; Exec('netsh', SOut,'', SW_HIDE, ewWaitUntilTerminated, RC)
end
end;


он удаляет правило при повторной установке, думаю не надо объяснять для чего я так сделал... а как зделать так чтобы при повторной установке он искал правило по имени, и в случае если оно уже есть то if........then Result:=True, в противном случае else устанавливал правило в брандмауэр? а так он постоянно удаляет и ставит по новой из за чего инсталятор подтупливает

ZVSRus 01-02-2020 19:51 2907922

Beavimo, Директив для деинстоллятора, таких например как для инсталлятора
PHP код:

VersionInfoVersion={#MyAppVersion}
VersionInfoProductVersion={#MyAppVersion}
VersionInfoCompany={#MyAppPublisher}
VersionInfoDescription={#MyAppDisplayName} Setup
VersionInfoProductName={#MyAppDisplayName}
VersionInfoCopyright={#MyAppInfoCopyrightName} 

Нет.

Если уж делать то только ручками на редакторах ресурсов.

Ну просто любопытство распирает, для каких надобностей сие художества?

Beavimo 01-02-2020 19:56 2907925

ZVSRus, да дурак я просто вот и все, наверное поговорить охота :tongue:

Iska 01-02-2020 20:07 2907930

Beavimo, Вы напрасно ёрничаете — тезис «задача может не нуждаться в выбранном решении»™ никто не отменял.

Beavimo 01-02-2020 20:12 2907931

Цитата:

Цитата Iska
ёрничаете »

я пас

страница ни о чем, как это бесит когда чтото ищешь

Beavimo 01-02-2020 21:12 2907942

вот так выехал на инно вместо батника
Скрытый текст
Код:

[Setup]
AppName=TEST
AppVerName=TEST
CreateAppDir=no
Uninstallable=no
OutputDir=userdocs:..\Desktop

[\Code]
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall'; const
  BM_CLICK = $00F5;
  procedure CurPageChanged(CurPageID: Integer);
    begin
  ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), SW_HIDE);
  PostMessage(WizardForm.NextButton.Handle, BM_CLICK, 0, 0);
end;// Спрятать окно инсталятора

procedure CurStepChanged(CurStep: TSetupStep);
  begin                                                 
  if CurStep = ssInstall then
    RegDeleteKeyIncludingSubkeys(HKLM,'SOFTWARE\TEST');// Удаляет ветку реестра перед установкой
  RegDeleteKeyIncludingSubkeys(HKLM64,'SOFTWARE\TEST');// Удаляет ветку реестра перед установкой
  DelTree(ExpandConstant('{userappdata}\TEST'), True, True, True);// Удаляет папку перед установкой
end;

[Run]
Filename: "{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup 6_is1,Inno Setup: App Path}\Examples\MyProg.exe"; Flags: postinstall shellexec skipifsilent


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

Nordek 02-02-2020 02:38 2907975

Цитата:

Цитата Beavimo
есть люди которые знают намного больше »

Для базовой настройки: К Inno Setup доустановите Inno Script Studio - Какая-то часть вопросов отпадёт.
P.S В настройках Inno Script Studio, не забудьте указать путь к компилятору Inno Setup.

Цитата:

Цитата Beavimo
как поведет себя сее творение на 32-х битных системах »

Проверку нужно добавить чтоб ошибку не выводил на "HKLM64,'SOFTWARE...".

Gnom_aka_Lexander 03-02-2020 00:05 2908061

Можно просто поиграться флагами в секции Registry
Думаю, эти флаги вам помогут
deletekey
Когда установлен этот флаг, инсталлятор сначала попытается удалить ключ, если он существует, со всеми его параметрами и разделами. Если ValueType=none, после этого он создаст новый ключ и параметр.

Для предотвращения негативных последствий, этот флаг игнорируется при установке, если Subkey пустой или состоит только из бэкслешей.

deletevalue
Когда установлен этот флаг, инсталлятор сначала попытается удалить параметр, если он существует. Если параметр ValueType не равен none, после этого он создаст ключ, если он не существует, и новый параметр.

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

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

Beavimo 03-02-2020 12:23 2908083

Nordek
Проверку нужно добавить чтоб ошибку не выводил на "HKLM64,'SOFTWARE...". Вы имеете в виду, проверку на битность системы?

Beavimo 03-02-2020 18:58 2908132

Nordek,
CODE
Код:

 
procedure CurStepChanged(CurStep: TSetupStep);
  begin                                                 
  if CurStep = ssInstall then
    DelTree(ExpandConstant('{userappdata}\TEST'), True, True, True);
    If not IsWin64 then
    RegDeleteKeyIncludingSubkeys(HKLM, 'SOFTWARE\TEST');
  If IsWin64 then
  RegDeleteKeyIncludingSubkeys(HKLM64, 'SOFTWARE\TEST');
end;


вот так, потому как нету в наличии 32-ой системы? Зарание Благодарю!

Nordek 03-02-2020 20:54 2908143

Beavimo, Направление верное. Только вам достаточно проверки для HKLM64. Для HKLM не нужна - Учитывая что работа с HKLM вам будет необходима и в 64-разрядной операционной системе, иначе в 64-разрядной операционной системе HKLM будет пропускаться.

Цитата:

Цитата Beavimo
нету в наличии 32-ой системы? »

На заметку: Если компьютер позволяет, можно использовать виртуальную машину с Windows для проверки.
P.S. У меня на реальной машине осталась только Windows 7 32-разрядная. Из под Linux в виртуальной машине только Windows 10 обеих разрядностей (32-разрядная и 64-разрядная).

Beavimo 04-02-2020 15:32 2908210

Выручайте, башка кипит! :drug: Как решить не пойму, примеров найти не могу? Некая программа работает на Виндовс 7 некорректно. Опытным путем :), после установки обновления KB2533623, программа начала работать как надо. Так вот в момент установки моего приложения, надо проверить установлено ли обновление KB2533623 в системе, или нет. Если установлено то просто установить приложение, в противном случае, спросить у пользователя, мол :) хотите установить или нет? Как проверить наличие KB2533623 за что цеплятся? Короч насочинял чот но как быть с 32-бит системой, как запустить само обновление при нажатии "да" непойму.
Скрытый текст
Код:

[Setup]
AppName=TEST
AppVerName=TEST
OutputDir=userdocs:..\Desktop
CreateAppDir=no
Uninstallable=no

[.Code]
function WindowsVersion(Major, Minor: Integer): Boolean; var
    Version: TWindowsVersion;
  begin
    GetWindowsVersionEx(Version);
    Result:=(Version.Major = Major);
    Result:=(Version.Minor = Minor);
end;

function WindowsRevVersion: Boolean;
  begin
    Result:=WindowsVersion(6,1);// Далее код будет выполнятся, только если установлена система (6.1)
end;

function InitializeSetup: Boolean;  var
    FileName: String;
  begin
      if not WindowsRevVersion then
    Result:=True
  else begin
    FileName:=ExpandConstant('C:\Windows\SoftwareDistribution\Download\873dafaddab7475a4078c7fc97bc8cba\Windows6.1-KB2533623-x64.cab')// Проверка наличия файла по пути прописаном в реестре
      if FileExists(FileName) then
    Result:=True
  else
      if MsgBox('Для полноценной работы приложения TEST:'#13'Нужно установить обновление KB2533623:'#13'Хотите установить обновление KB2533623 ?', mbInformation, MB_YESNO)=IDNO then 
      Result:=True
  else
// Как здесь запустить файл "Windows6.1-KB2533623-x64.msu"???
end
end; 

[Files]
Source: "C:\Windows6.1-KB2533623-x64.msu"; DestDir: "{tmp}"; Flags: deleteafterinstall;


шуршу страницы в поисках истины, реально прогрес бар, ботва... короче дети засрали все со своими репаками
ПОМОГИТЕ

Nordek 04-02-2020 22:50 2908261

Цитата:

Цитата Beavimo
башка кипит! »

Вы почти у цели.

Например в [Files] добавить обновления:
Код:

[Files]
Source: Windows6.1-KB2533623-x64.msu; DestDir: {tmp}
Source: Windows6.1-KB2533623-x86.msu; DestDir: {tmp}

В [Run] добавить выполнение установки:
Код:

[Run]
Filename: wusa.exe; Parameters: {tmp}\Windows6.1-KB2533623-x86.msu /quiet /norestart; StatusMsg: Установка KB2533623
Filename: wusa.exe; Parameters: {tmp}\Windows6.1-KB2533623-x64.msu /quiet /norestart; StatusMsg: Установка KB253362

[Files] и [Run] связать с [Components]:
Код:

[Components]
Name: abcd_x86; Description: KB2533623 for x86; Flags: exclusive
Name: abcd_x64; Description: KB2533623 for x64; Flags: exclusive

[Files]
Source: Windows6.1-KB2533623-x64.msu; DestDir: {tmp}; Components: abcd_x64
Source: Windows6.1-KB2533623-x86.msu; DestDir: {tmp}; Components: abcd_x86

[Run]
Filename: wusa.exe; Parameters: {tmp}\Windows6.1-KB2533623-x86.msu /quiet /norestart; StatusMsg: Установка KB2533623; Components: abcd_x86
Filename: wusa.exe; Parameters: {tmp}\Windows6.1-KB2533623-x64.msu /quiet /norestart; StatusMsg: Установка KB2533623; Components: abcd_x64

[Components] связать с Check, например:
Код:

[Components]
Name: abcd_x86; Description: KB2533623 for x86; Flags: exclusive; Check: ab_x86
Name: abcd_x64; Description: KB2533623 for x64; Flags: exclusive; Check: ab_x64

Для каждого Check написать сценарий который будет проверять соответствие ОС, разрядность, наличие установленных обновлений и т.д.

Проверку обновлений осуществить через реестр, например:
Код:

HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\Package_for_KB2533623_SP1~31bf3856ad364e35~x86~~6.1.1.2
Код:

HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\Package_for_KB2533623_SP1~31bf3856ad364e35~amd64~~6.1.1.2
Вам будет легче с Check связать, чем всё в сценарии прописывать.


Цитата:

Цитата Beavimo
спросить у пользователя, мол хотите установить или нет? »

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

Beavimo 04-02-2020 23:36 2908269

Nordek, огромное спасибо что откликнулся... буду разбиратся :kiss:

Beavimo 05-02-2020 14:16 2908340

Nordek, когда я делаю вот так:

CODE
Код:

[Components]
Name: abcd_x86; Description: KB2533623 for x86; Flags: exclusive; Check: ab_x86
Name: abcd_x64; Description: KB2533623 for x64; Flags: exclusive; Check: ab_x64



инсталлятор ругается на "ab_x86", я так понимаю в секции {Code} нужно что то сделать с этим именем...
меня мучает момент а можно ли вот тут?

CODE
Код:

[Setup]
AppName=TEST
AppVerName=TEST
OutputDir=userdocs:..\Desktop
CreateAppDir=no
Uninstallable=no

[.code]
function WindowsVersion(Major, Minor: Integer): Boolean; var
    Version: TWindowsVersion;
  begin
    GetWindowsVersionEx(Version);
    Result:=(Version.Major=Major) and (Version.Minor=Minor);
end;

function WindowsRevVersion: Boolean;
  begin
    Result:=WindowsVersion(6,1);
end;

function InitializeSetup: Boolean;  var
    FileName: String;
  begin
      if not WindowsRevVersion then
    Result:=True
  else begin
      If IsWin64 then
      If RegKeyExists(HKLM64, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\Package_for_KB2533623_SP1~31bf3856ad364e35~amd64~~6.1.1.2') then
    Result:=True// Так вот надо тут поставить чекбокс напротив "Check: ab_x64"
  else
    MsgBox('Для полноценной работы  TEST  на  Windows 7'#13'  Будет установлено обновление  << KB2533623 >>'#13'После окончания установки ваш ПК перезагрузится!', mbInformation, MB_OK);     
    Result:=True
      If not IsWin64 then
      If RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\Package_for_KB2533623_SP1~31bf3856ad364e35~amd64~~6.1.1.2') then
    Result:=True
  else
    MsgBox('Для полноценной работы  TEST  на  Windows 7'#13'  Будет установлено обновление  << KB2533623 >>'#13'После окончания установки ваш ПК перезагрузится!', mbInformation, MB_OK);     
    Result:=True// А вот тут поставить чекбокс напротив "Check: ab_x86". Наверное я неправильно выражаюсь, может нада говорить вызвать функцию "ab_x86"
end
end; 

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result:=(PageID=wpSelectComponents);
end;// Этот код прячет страницу компонентов

[Components]
Name: abcd_x86; Description: KB2533623 for x86; Check: ab_x86
Name: abcd_x64; Description: KB2533623 for x64; Check: ab_x64

[Files]
Source: C:\Windows6.1-KB2533623-x64.msu; DestDir: {tmp}; Flags: deleteafterinstall;
Source: C:\Windows6.1-KB2533623-x86.msu; DestDir: {tmp}; Flags: deleteafterinstall;

[Run]
Filename: wusa.exe; Parameters: {tmp}\Windows6.1-KB2533623-x86.msu /quiet /norestart; StatusMsg: Установка KB2533623_x86; Components: abcd_x86; BeforeInstall: "Sleep(2000)"
Filename: wusa.exe; Parameters: {tmp}\Windows6.1-KB2533623-x64.msu /quiet /norestart; StatusMsg: Установка KB2533623_x64; Components: abcd_x64; BeforeInstall: "Sleep(2000)"



опять я уперся в запуск. как из секции [code] автоматически ставить флагжки на checkbox??? я просто задолбался искать пример, хотя бы один пример :angry2::angry2::angry2:
все иду гулять башка взрывается. как всегда на последнем рывке я не знаю что делать

Nordek 05-02-2020 19:49 2908406

Цитата:

Цитата Beavimo
инсталлятор ругается на "ab_x86" »

Условные значения привёл для "примера", могут быть чем угодно: "ab_x86" или "CheckUpdx86". Лишь бы выполнялось в соответствии поставленным задачам.

Вот сляпал что-то:
Скрытый текст
Код:

[Code]
function WindowsVersion(Major, Minor: Integer): Boolean; var
    Version: TWindowsVersion;
  begin
    GetWindowsVersionEx(Version);
    Result:=(Version.Major = Major);
    Result:=(Version.Minor = Minor);
end;

function WindowsRevVersion: Boolean;
  begin
    Result:=WindowsVersion(6,1);// Далее код будет выполнятся, только если установлена система (6.1)
end;

function ab_x86: Boolean;
begin
  if not WindowsRevVersion then
    else begin
      if not IsWin64 then begin
        if not RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\Package_for_KB2533623_SP1~31bf3856ad364e35~x86~~6.1.1.2') then Result:= True
      end;
    end;
end;

function ab_x64: Boolean;
begin
  if not WindowsRevVersion then
    else begin
      if IsWin64 then begin
        if not RegKeyExists(HKLM64, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\Package_for_KB2533623_SP1~31bf3856ad364e35~amd64~~6.1.1.2') then Result:= True
      end;
    end;
end;



Смысл думаю понятен.

Beavimo 05-02-2020 21:41 2908421

Nordek, Пока думаю как правильно организовать сие творение, но оно ска работает именно так как мне надо:jump::jump::jump:. ОГРОМНОЕ тебе человеческое СПАСИБО.... Я давно мечтал сделать подобного рода инсталлер (как с магазина), без этих картинок музыки в меню, но чтобы умный был :) Думал что Инно не потянет, а по nsis очень мало доходчивого материала в сети, забил на это дело. Пользовал Smart Install Maker, но он до ужаса кастрирован, ждал обновы, но безрезультатно, прошло много лет а обновы нет. И тут опять решил попробовать, давно мечтал научить инсталлер автоматически опредилять путь для установки, мне подсказали выход, и понеслась я зацепилса за это дело. Не знаю правильно ли но я привик изучять дело с конца, а не с начала. Потому как начинаэш сначала в момент когда ты чегото не понимаешь ты просто здаешся. А так ты ничего не понимаешь вопще но постепенно у тебя чтото получается. Ладно чот меня на творчество понесло. Спасибо за то что пошел на встречу сейчас это редкость... + Из тебя может быть не плохой учитель, умеешь заинтриговать.

Nordek 05-02-2020 23:39 2908432

Цитата:

Цитата Beavimo
Не знаю правильно ли но я привик изучять дело с конца, а не с начала. »

Когда писал инсталляторы до перехода на другую ОС: Начинал от простого (если возможно) к сложному (если не имеется возможности). А развернуть большую портянку из кода всегда наводило на ужас, к тому же заботился об отзывчивости инсталлятора (Наверняка встречали инсталляторы, в частности репаки - Которые прогружаются от 2 до xx минут).

Например нужно чтоб установилось в определённой версии (Например Windows 7) и определённой разрядности (Например 32-разрядной ОС):
Код:

[Components]
Name: "a"; Description: "A"; Check: not IsWin64; MinVersion: 0,6.1; OnlyBelowVersion: 0,6.2

- Из серии (если возможно). Проще не придумать.

Или как ваш случай: Необходимо определять наличие компонента по наличию файла (или реестр). + Нужно определение вресии Windows + Разрядности = То почему бы не организовать что-то через код. В определённых случаях "IsWin64" в коде всё-равно нужен. Если "IsWin64" туда, то почему бы туда же не переместить и определение версии.
Получается: Проще сделать 1 "; Check: xxx" чем для каждого городить по несколько.
- Из серии (если не имеется возможности)

VLADEV 06-02-2020 00:53 2908438

Здравствуйте Уважаемые. начинаю изучать, 3 день сижу читаю, башка закипает, и что то не выходит. Не откажите помочь.
Задача простейшая (ИМХО) Наверно у меня проблема с RegQueryStringValue или головой )))

1. Есть папка 1 с файлами (как добавлять файлы - разобрался))
ее надо скопировать в папку которая указана в реестре по пути 1.
HKEY_LOCAL_MACHINE\SOFTWARE\Avid\Studio\Main Path путь № 1 прописан (т.е он есть в наличии 100%)

2. Есть папка 2 с файлами
ее надо скопировать в папку которая указана в реестре по пути 2.
HKEY_LOCAL_MACHINE\SOFTWARE\Avid\Content\Content Path путь № 2 прописан (т.е он есть в наличии 100%)

Вот в принципе пока задача в этом.
если нужен скрипт того что я наваял. могу представить.
Заранее спасибо. Питерцам могу пива налить )))
Удачи.

boss911 06-02-2020 02:00 2908445

VLADEV

Используйте константу {reg:HKxx\SubkeyName,ValueName|DefaultValue}.

Код:

[Files]
Source: Folder1\*; DestDir: {reg:HKLM\SOFTWARE\Avid\Studio\Main Path|{app}\Folder1}; Flags: ignoreversion recursesubdirs createallsubdirs
Source: Folder2\*; DestDir: {reg:HKLM\SOFTWARE\Avid\Studio\Content Path|{app}\Folder2}; Flags: ignoreversion recursesubdirs createallsubdirs


Beavimo 06-02-2020 07:29 2908454

Nordek,
code
Код:

[Setup]
AppId={{B5C6D58E-3D57-4255-937B-36F6B94FFD7F}
AppName=TEST
AppVerName=TEST
OutputDir=userdocs:..\Desktop
CreateAppDir=no
Uninstallable=no

[*Code]
function VersionWindows (Major, Minor: Integer): Boolean; var
    Version: TWindowsVersion;
  begin
    GetWindowsVersionEx(Version);
    Result:=(Version.Major=Major) and (Version.Minor=Minor);
end;// Этот код проверяет версию Windows

function WindowsAll (): Boolean;
  begin
    Result:=VersionWindows(6,1);// Далее код будет выполнятся, только если установлена система (6.1)
end;// Этот код задает значение версии Windows

function Check_x86 (): Boolean;
  begin
      if not WindowsAll then
    Result:=False
  else begin
      if not IsWin64 then
      if not RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\Package_for_KB2533623_SP1~31bf3856ad364e35~amd64~~6.1.1.2') then
      if MsgBox('Для полноценной работы TEST на Windows 7'#13' Будет установлено обновление  << KB2533623 >>', mbInformation, MB_OK)=IDOK then
    Result:=True
end
end;// Этот код проверяет наличие обновления << KB2533623 >> на 32-ух битной Windows 7, и устанавливает это обновление при его отсутствии выводя сообщение

function Check_x64 (): Boolean;
  begin
      if not WindowsAll then
    Result:=False
  else begin
      if IsWin64 then
      if not RegKeyExists(HKLM64, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\Package_for_KB2533623_SP1~31bf3856ad364e35~amd64~~6.1.1.2') then
      if MsgBox('Для полноценной работы TEST на Windows 7'#13' Будет установлено обновление  << KB2533623 >>', mbInformation, MB_OK)=IDOK then
    Result:=True
end
end;// Этот код проверяет наличие обновления << KB2533623 >> на 64-х битной Windows 7, и устанавливает это обновление при его отсутствии выводя сообщение

function UpdateCentre (): Boolean; var
    UpdateCentreDWord: Cardinal;
  begin
      if RegQueryDWordValue(HKLM, 'SYSTEM\CurrentControlSet\services\wuauserv', 'Start', UpdateCentreDWord) then
      if UpdateCentreDWord=4 then
    MsgBox('Центр Обновления  Windows 7  Отключен:'#13'    <<<для продолжения установки>>>'#13'Включите Центр Обновления  Windows 7:'#13'    <<и повторите установку еще раз>>', mbCriticalError, MB_OK)
  else begin
    Result:=True   
end
end;// Этот код проверяет включен ли Центр Обновления на Windows 7 выводя сообщение

<event('InitializeSetup')>
function InitializeSetup2 (): Boolean;
  begin
      if WindowsAll then
    Result:=UpdateCentre
  else begin
    Result:=True;
end
end;

function ShouldSkipPage(PageID: Integer): Boolean;
  begin
    Result:=(PageID=wpSelectComponents);
end;// Этот код прячет страницу компонентов

[Components]
Name: File_x86; Description: KB2533623 for x86; Flags: exclusive restart; Check: Check_x86
Name: File_x64; Description: KB2533623 for x64; Flags: exclusive restart; Check: Check_x64

[Files]
Source: C:\Windows6.1-KB2533623-x86.msu; DestDir: {tmp}; Flags: deleteafterinstall;
Source: C:\Windows6.1-KB2533623-x64.msu; DestDir: {tmp}; Flags: deleteafterinstall;

[Run]
Filename: wusa.exe; Parameters: {tmp}\Windows6.1-KB2533623-x86.msu /quiet /norestart; StatusMsg:УСТАНОВКА ОБНОВЛЕНИЯ                                            <<< KB2533623-x86 >>>; Components: File_x86; BeforeInstall: "Sleep(3000)"
Filename: wusa.exe; Parameters: {tmp}\Windows6.1-KB2533623-x64.msu /quiet /norestart; StatusMsg:УСТАНОВКА ОБНОВЛЕНИЯ                                            <<< KB2533623-x64 >>>; Components: File_x64; BeforeInstall: "Sleep(3000)"



вот сочинил пьеску, это четверть от всего кода, на моем ФХ-се инсталятор летает, уже сутки колдую, и все время хочется больше... разговаривать его научить))) непонятно тока как организовать установку при установленом уже на ПК обновлении KB2533623, и выключеном Центре Обновления Windows, чтобы не прекращалась установка MsgBox-ом (Центр Обновления Windows 7 Отключен <<<для продолжения установки>>>)...бла...бла...бла... но то такое надо поспать и в бой потому как я уже просто схожу с ума. идей как говорится полно тока ришения подавай))))

как думаешь реально не прибегая к сторонниму софту на Инно сделать такой инсталлер?
картинка



nik1967 06-02-2020 21:07 2908524

Цитата:

Цитата Beavimo
как думаешь реально не прибегая к сторонниму софту на Инно сделать такой инсталлер? »

Запросто



Beavimo 06-02-2020 21:47 2908527

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

Nordek, дружыще мож подскажешь как в один вопрс поместить сразу два или три, ну ето как "if ...... then" выходит типа "если.......тогда" я лично понимаю так а мне нужно зделать так "if яблук=5 и груш=5 then" только тогда выполнять условие.... тоисть два условия в одном вопросе.... надеюсь я понятно выражаюсь :not-me: , я когда смотрел уроки по паскалю там мелькало что то типа "case" но я так и не вребился..... нельзя ограничиватся одним if.......then

Gnom_aka_Lexander 06-02-2020 22:09 2908529

Цитата:

Цитата Beavimo (Сообщение 2908527)
if.......then

if ((одно условие) and (второе условие)) then

Цитата:

Цитата Beavimo (Сообщение 2908527)
я говорю о чистом дистрибутиве безо всяких ботв и прочей лабуды.

Ботва и всякая лабуда - это подключаемые библиотеки. Они необходимы, когда необходимо большие объемы кода обрабатывать. И в плане производительности кода и в плане удобства использования. Пишется в любом случае на чистом инно, модификаций давно уже нет, лет 8 как уже. На вашей картинке у инсталла тень это либо пнг-маска, тоесть ботва, либо скин, либо прямая отрисовка средствами ОС. Это будет самая сложная часть инсталлятора. Все остальное пишется левой пяткой за 5 минут.

Beavimo 08-02-2020 13:53 2908748

иконка на панели задач Виндовс 7 без проблем, а на 10-ке никак. как решыть?

Скрытый текст
Код:

[Setup]
AppName=ICONKA
AppVerName=ICONKA
DefaultDirName=C:\ICONKA
OutputDir=userdocs:..\Desktop

[Tasks]
Name: "taskbaricon"; Description: "Create Quick Launch icon"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[*Code]
function PinToTaskbar(const FileName: String; IsPin: Boolean): Boolean; var
    ShellApp: Variant;
    Verb: String;
  begin
    Result:=False;
      if not FileExists(FileName) then
Exit;
  try
      if IsPin then
    Verb:='taskbarpin'
  else
    Verb:='taskbarunpin';
    ShellApp:=CreateOleObject('Shell.Application');
    ShellApp.Windows.Item.Document.Application.NameSpace(ExtractFileDir(FileName)).ParseName(ExtractFileName(FileName)).InvokeVerb(Verb);
    Result:=True;
  except
    ShowExceptionMessage;
end
end;

procedure CurStepChanged(CurStep: TSetupStep);
  begin
      if CurStep=ssPostInstall then
      if IsTaskSelected('taskbaricon') then
    PinToTaskbar(ExpandConstant('{app}\ICONKA.exe'), True);
end;

[Files]
Source: "ICONKA.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs



уже все перерыл :beta:

Beavimo 08-02-2020 23:31 2908825

кто в курсе, у меня на 10-ке в виртуальной машыне пропадает иконка удалятора из меню пуск, мож кто знает в реальной винде такая же ерунда происходит.... думаю писать из инсталлера удалятор кто таким извращался?

Beavimo 09-02-2020 13:44 2908864

так никто и не ответил на счет ярлыка на панели задач в Windows 10, самое главное что если закрепить ярлык после инсталляции программы в ручную, то при ее удалении ярлык деинсталлируется... а на 7-ке все прекрасно работает

habib2302 09-02-2020 14:11 2908870

Beavimo,
Код:

Код:

[code]
//PinToTaskbar
function PinToTaskbar(const FileName: string; IsPin: Boolean): Boolean;
// FileName : full path to executable file
// IsPin    : False - unpin from TaskBar, True - pin to TaskBar
var
 
ShellApp: Variant;
  Verb: string;
begin
 
Result := False;
  if not FileExists(FileName) then Exit;
  try
    if
IsPin then
     
Verb := 'taskbarpin' else
     
Verb := 'taskbarunpin';
    ShellApp := CreateOleObject('Shell.Application');
    ShellApp.Windows.Item.Document.Application.NameSpace(ExtractFileDir(FileName)).ParseName(ExtractFileName(FileName)).InvokeVerb(Verb);
    Result := True;
  except
   
ShowExceptionMessage;
  end;
end;

//PinToStartMenu
function PinToStartMenu(const FileName: string; const IsPin: Boolean): Boolean;
// FileName : full path to exe- or lnk-file
// IsPin    : False - unpin from StartMenu, True - pin to StartMenu
var
 
ShellApp, FolderItem: Variant;
  Verb, LnkName: string;
begin
 
Result := False;
  if not FileExists(FileName) then Exit;
  try
   
ShellApp := CreateOleObject('Shell.Application');
    FolderItem := ShellApp.Windows.Item.Document.Application.NameSpace(ExtractFileDir(FileName)).ParseName(ExtractFileName(FileName));
    if GetWindowsVersion < $06020000 then // below Windows 8
   
begin
      if
IsPin then
       
Verb := 'startpin' else
       
Verb := 'startunpin';
      FolderItem.InvokeVerb(Verb);
      Result := True;
    end
    else 
// Windows 8 and above
   
begin
      if not
FolderItem.IsLink then
      begin
       
LnkName := FolderItem.ExtendedProperty('FileDescription');
        if LnkName = '' then
         
LnkName := ExtractFileName(FileName);
        LnkName := ExpandConstant('{commonprograms}\') + ChangeFileExt(LnkName, '.lnk');
        if IsPin then
         
Result := not FileExists(LnkName) and
           
FileExists(CreateShellLink(LnkName, '', FileName, '', '', '', 0, SW_SHOWNORMAL))
        else
         
Result := DeleteFile(LnkName);
      end
      else
      begin
       
LnkName := ExpandConstant('{commonprograms}\') + ExtractFileName(FolderItem.Path);
        if IsPin then
         
Result := not FileExists(LnkName) and
           
FileCopy(FolderItem.Path, LnkName, False)
        else
         
Result := DeleteFile(LnkName);
      end;
    end;
  except
   
ShowExceptionMessage;
  end;
end;


Gnom_aka_Lexander 09-02-2020 14:16 2908872

Beavimo, Папка панели задач Windows 10 находится в папке
Код:

% AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
- после добавления ярлыка нужно перезапускать проводник. ответ гуглится за 2 минуты, потому и не отвечают. Да простят меня за оффтоп )

Beavimo 09-02-2020 14:25 2908877

habib2302, я и говорю что не работает на 10-ке функция PinToTaskbar зато на 7-ке все хорошо... а вот PinToStartMenu работает прекрасно
548пост

Beavimo 09-02-2020 14:42 2908880

Gnom_aka_Lexander, перед тем как писать проверьте ваш совет на работоспособность

habib2302 09-02-2020 14:45 2908883

Beavimo, вы этот код даже и не проверяли


Beavimo 09-02-2020 14:55 2908890

не работает он на 10-ке

Скрытый текст
Код:

[Setup]
AppName=ICONKA
AppVerName=ICONKA
DefaultDirName=C:\ICONKA
OutputDir=userdocs:..\Desktop

[*Code]
function PinToTaskbar(const FileName: String; IsPin: Boolean): Boolean; var
    ShellApp: Variant;
    Verb: String;
  begin
    Result:=False;
      if not FileExists(FileName) then
Exit;
  try
      if IsPin then
    Verb:='taskbarpin'
  else
    Verb:='taskbarunpin';
    ShellApp:=CreateOleObject('Shell.Application');
    ShellApp.Windows.Item.Document.Application.NameSpace(ExtractFileDir(FileName)).ParseName(ExtractFileName(FileName)).InvokeVerb(Verb);
    Result:=True;
  except
    ShowExceptionMessage;
end
end;

procedure CurStepChanged(CurStep: TSetupStep);
  begin
      if CurStep=ssPostInstall then
  begin
    PinToTaskbar(ExpandConstant('{app}\ICONKA.exe'), True);
end
end;

[Files]
Source: "ICONKA.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs



любой "ICONKA.exe" файл рядом положыте, на семерке без проблем а на десятке не робить
зато процедура "CurUninstallStepChanged" прекрасно работает даже на десятке

а это крепит ярлик в меню пуск и оно работает нормально
что на 7-ке что на 10-ке

Скрытый текст
Код:

[Setup]
AppName=ICONKA
AppVerName=ICONKA
DefaultDirName=C:\ICONKA
OutputDir=userdocs:..\Desktop

[*Code]
function PinToStartMenu(const FileName: string; const IsPin: Boolean): Boolean; var
    ShellApp, FolderItem: Variant;
    Verb, LnkName: string;
  begin
    Result:=False;
      if not FileExists(FileName) then
Exit;
  try
    ShellApp:=CreateOleObject('Shell.Application');
    FolderItem:=ShellApp.Windows.Item.Document.Application.NameSpace(ExtractFileDir(FileName)).ParseName(ExtractFileName(FileName));
      if GetWindowsVersion < $06020000 then
  begin
      if IsPin then
    Verb:='startpin'
  else
    Verb:='startunpin';
    FolderItem.InvokeVerb(Verb);
    Result:=True;
end

  else begin
      if not FolderItem.IsLink then
  begin
    LnkName:=FolderItem.ExtendedProperty('FileDescription');
      if LnkName='' then
    LnkName:=ExtractFileName(FileName);
    LnkName:=ExpandConstant('{commonprograms}\') + ChangeFileExt(LnkName, '.lnk');
      if IsPin then
    Result:=not FileExists(LnkName) and
    FileExists(CreateShellLink(LnkName, '', FileName, '', '', '', 0, SW_SHOWNORMAL))
  else
    Result:=DeleteFile(LnkName);
end

  else begin
    LnkName:=ExpandConstant('{commonprograms}\') + ExtractFileName(FolderItem.Path);
      if IsPin then
    Result:=not FileExists(LnkName) and
    FileCopy(FolderItem.Path, LnkName, False)
  else
    Result:=DeleteFile(LnkName);
end
end;

  except
    ShowExceptionMessage;
end
end;

procedure CurStepChanged(CurStep: TSetupStep);
  begin
      if CurStep=ssPostInstall then
  begin
    PinToStartMenu(ExpandConstant('{app}\ICONKA.exe'), True);
end
end;

[Files]
Source: "ICONKA.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs


Nordek 09-02-2020 16:49 2908902

Цитата:

Цитата Beavimo
на десятке не робить »

Код:

[CustomMessages]
CreateStartLaunchIcon=Добавить значок My Program в Меню пуск

[Tasks]
Name: startlaunchicon; Description: {cm:CreateStartLaunchIcon}; GroupDescription: {cm:AdditionalIcons}

[Files]
Source: C:\Program Files\Inno Setup 5\Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

[UninstallDelete]
Name: {commonprograms}\My Program1; Type: filesandordirs; Tasks: startlaunchicon

[Icons]
Name: {commonprograms}\MyProgram1; Filename: {app}\MyProg.exe; Tasks: startlaunchicon

P.S "My Program1" - Отметил для различия.

Beavimo 09-02-2020 18:07 2908906

Nordek, мне нужно прикрепить значок на панель задач в Windows 10, я не могу понять как оно работает Process Monitor не помогает. ПАНЕЛЬ ЗАДАЧ...
Скрытый текст
Код:

[Setup]
AppName=Taskbar1
AppVerName=Taskbar2
DefaultDirName=C:\Taskbar
OutputDir=userdocs:..\Desktop

[*Code]
function PinToTaskbar(const FileName: String; IsPin: Boolean): Boolean; var
    ShellApp: Variant;
    Verb: String;
  begin
    Result:=False;
      if not FileExists(FileName) then
Exit;
  try
      if IsPin then
    Verb:='taskbarpin'
  else
    Verb:='taskbarunpin';
    ShellApp:=CreateOleObject('Shell.Application');
    ShellApp.Windows.Item.Document.Application.NameSpace(ExtractFileDir(FileName)).ParseName(ExtractFileName(FileName)).InvokeVerb(Verb);
    Result:=True;
  except
    ShowExceptionMessage;
end
end;

procedure CurStepChanged(CurStep: TSetupStep);
  begin
  if CurStep=ssPostInstall then
  PinToTaskbar(ExpandConstant('{app}\Taskbar.exe'), True);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
  begin
  if CurUninstallStep=usUninstall then
  PinToTaskbar(ExpandConstant('{app}\Taskbar.exe'), False);
end;

[Files]
Source: "Taskbar.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs


на 7-ке работает как надо, а на 10-ке тока открепить может если я вручную прикреплю иконку к панели задач то при диинсталляции она удалится.... а прикрепить ее окромя ручками у меня не выходит может я просто туплю уже 3-ю сутку не сплю

El Sanchez 09-02-2020 18:19 2908907

Цитата:

Цитата Beavimo
я и говорю что не работает на 10-ке функция PinToTaskbar зато на 7-ке все хорошо... а вот PinToStartMenu работает прекрасно »

Beavimo, Microsoft считает, что закрепление ярлыка на Панели задач должен делать пользователь, а не приложение, и с каждой следующей сборкой что-нибудь да и отпиливают.
PinToTaskbar

Код:

const
  CLSID_TaskbandPin = '{90AA3A4E-1CBA-4233-B8BB-535773D48449}';
  IID_IPinnedList2 = '{BBD20037-BC0E-42F1-913F-E2936BB0EA0C}';
  IID_IPinnedList3 = '{0DD79AE2-D156-45D4-9EEB-3B549769E940}';
  CLSCTX_INPROC_SERVER = 1;
  PLMC_EXPLORER = 4;
  S_OK = 0;

type
  PItemIDList = LongWord;

  IPinnedList2 = interface(IUnknown)
    '{BBD20037-BC0E-42F1-913F-E2936BB0EA0C}'
   
procedure EnumObjects; // dummy
    function Modify(unpin, pin: PItemIDList): HRESULT;
    procedure GetChangeCount; // dummy
    procedure GetPinnableInfo; // dummy
    procedure IsPinnable; // dummy
    procedure Resolve; // dummy
    function IsPinned(pidl: PItemIDList): HRESULT;
    procedure GetPinnedItem; // dummy
    procedure GetPinnedItemForAppID; // dummy
    procedure ItemChangeNotify; // dummy
    procedure UpdateForRemovedItemsAsNecessary; // dummy
  end;

  IPinnedList3 = interface(IUnknown)
    '{0DD79AE2-D156-45D4-9EEB-3B549769E940}'
   
procedure EnumObjects; // dummy
    procedure GetPinnableInfo; // dummy
    procedure IsPinnable; // dummy
    procedure Resolve; // dummy
    procedure LegacyModify; // dummy
    procedure GetChangeCount; // dummy
    function IsPinned(pidl: PItemIDList): HRESULT;
    procedure GetPinnedItem; // dummy
    procedure GetAppIDForPinnedItem; // dummy
    procedure ItemChangeNotify; // dummy
    procedure UpdateForRemovedItemsAsNecessary; // dummy
    procedure PinShellLink; // dummy
    procedure GetPinnedItemForAppID; // dummy
    function Modify(unpin, pin: PItemIDList; ModifyCaller: LongWord): HRESULT;
  end;

function CoCreateInstance(rclsid: TCLSID; pUnkOuter: LongWord;
  dwClsContext: DWORD; riid: TIID; out ppv: IUnknown): HRESULT; external 'CoCreateInstance@ole32.dll stdcall';
function ILCreateFromPath(const pszPath: string): PItemIDList; external 'ILCreateFromPathW@shell32.dll stdcall';
procedure ILFree(pidl: PItemIDList); external 'ILFree@shell32.dll stdcall';

function PinToTaskbar(const AFilename: string; AIsPin: Boolean): Boolean;
// AFilename : full path to executable file
// AIsPin....: False - unpin from TaskBar, True - pin to TaskBar
var
  LPIDL: PItemIDList;
  LUnk: IUnknown;
  LPinnedList2: IPinnedList2;
  LPinnedList3: IPinnedList3;
  LShellApp: Variant;
  LVerb: string;
begin
  Result := False;
  if FileExists(AFilename) and
    (GetWindowsVersion > $06010000) then
  try
    LPIDL := ILCreateFromPath(AFilename);
    try
      { Windows 10 (build 1809) and above. }
      OleCheck(CoCreateInstance(StringToGUID(CLSID_TaskbandPin), 0,
        CLSCTX_INPROC_SERVER, StringToGUID(IID_IPinnedList3), LUnk));
      LPinnedList3 := LUnk as IPinnedList3;
    except
      try
        { Windows 7, 8, 8.1 if IPinnedList2 supported. }
        OleCheck(CoCreateInstance(StringToGUID(CLSID_TaskbandPin), 0,
          CLSCTX_INPROC_SERVER, StringToGUID(IID_IPinnedList2), LUnk));
        LPinnedList2 := LUnk as IPinnedList2;
      except
        { Below Windows 10 (build 1809) fallback. }
        LShellApp := CreateOleObject('Shell.Application');
      end;
    end;
    if AIsPin then  // pin
    begin
      if LPinnedList3 <> nil then
      begin
        Result := LPinnedList3.IsPinned(LPIDL) <> S_OK;
        if Result then
          OleCheck(LPinnedList3.Modify(0, LPIDL, PLMC_EXPLORER));
      end
      else if LPinnedList2 <> nil then
      begin
        Result := LPinnedList2.IsPinned(LPIDL) <> S_OK;
        if Result then
          OleCheck(LPinnedList2.Modify(0, LPIDL));
      end else
        LVerb := 'taskbarpin';
    end else        // unpin
    begin
      if LPinnedList3 <> nil then
      begin
        Result := LPinnedList3.IsPinned(LPIDL) = S_OK;
        if Result then
          OleCheck(LPinnedList3.Modify(LPIDL, 0, PLMC_EXPLORER));
      end
      else if LPinnedList2 <> nil then
      begin
        Result := LPinnedList2.IsPinned(LPIDL) = S_OK;
        if Result then
          OleCheck(LPinnedList2.Modify(LPIDL, 0));
      end else
        LVerb := 'taskbarunpin';
    end;
    if LVerb <> '' then
      LShellApp.Windows.Item.Document.Application
        .NameSpace(ExtractFileDir(AFilename))
        .ParseName(ExtractFileName(AFilename)).InvokeVerb(LVerb);
  except
    Result := False;
    ShowExceptionMessage;
  finally
    ILFree(LPIDL);
  end;
end;


PinToStartMenu

Код:

function PinToStartMenu(const AFilename: string; AIsPin: Boolean): Boolean;
// AFilename : full path to exe- or lnk-file
// AIsPin    : False - unpin from StartMenu, True - pin to StartMenu
var
  LShellApp, LFolderItem: Variant;
  LVerb, LnkName: string;
begin
  Result := False;
  if not FileExists(AFilename) then Exit;
  try
    LShellApp := CreateOleObject('Shell.Application');
    LFolderItem := LShellApp.Windows.Item.Document.Application
      .NameSpace(ExtractFileDir(AFilename))
      .ParseName(ExtractFileName(AFilename));
    { Below Windows 8. }
    if GetWindowsVersion < $06020000 then
    begin
      if AIsPin then
        LVerb := 'startpin' else
        LVerb := 'startunpin';
      LFolderItem.InvokeVerb(LVerb);
      Result := True;
    end else
    { Windows 8 and above. }
    begin
      if not LFolderItem.IsLink then
      begin
        LnkName := LFolderItem.ExtendedProperty('FileDescription');
        if LnkName = '' then
          LnkName := ExtractFileName(AFilename);
        LnkName := ExpandConstant('{commonprograms}\') + ChangeFileExt(LnkName, '.lnk');
        if AIsPin then
          Result := not FileExists(LnkName) and
            FileExists(CreateShellLink(LnkName, '', AFilename, '', '', '', 0, SW_SHOWNORMAL))
        else
          Result := DeleteFile(LnkName);
      end else
      begin
        LnkName := ExpandConstant('{commonprograms}\') + ExtractFileName(LFolderItem.Path);
        if AIsPin then
          Result := not FileExists(LnkName) and
            FileCopy(LFolderItem.Path, LnkName, False)
        else
          Result := DeleteFile(LnkName);
      end;
    end;
  except
    ShowExceptionMessage;
  end;
end;


Iska 09-02-2020 19:40 2908917

Цитата:

Цитата El Sanchez
Microsoft считает, что закрепление ярлыка на Панели задач должен делать пользователь, а не приложение, и с каждой следующей сборкой что-нибудь да и отпиливают. »

Слишком много приложений стали лепить себя на Панель задач (зачастую — молча). Примерно так же, как раньше каждое второе приложение считало своим долгом запихнуть свой значок в область уведомлений. Там нашли решение (кривое, понятно) в виде скрытия по умолчанию всех значков, кроме системных, на отдельную панель. А куда девать налепленные ярлыки с Панели задач — пока не решили.

Beavimo 09-02-2020 22:23 2908929

1) так для справки я (трахну) ето ПИНО однозначно, не верю что не прикручю эту приблуду автоматом к панели на 10-ке, третьи сутки боя идут. 2) устанавливаю виндовс 10-ть раз в год уже 4-ый год подряд, пользуюсь примерно неделю-две, и возвращаюсь назад на 7-ку. решыл попробывать скачать образ 10-ки с оф сайта для тестирования своих наработок в ИННО на перспективной ОС :lol: - опирация прошла успешно, дата последнего обновления (09_01_2020) + онлайн ключики лежат на (philka.ru). 3) у меня на ПК стоит два ссд + винчестер. установил на второй зарание отформатированый ссд Windows 10 Pro. парни скажу чесно я будто обратно на хард пересел, а по сравнению с прошлогодней (08_01_2019) она стала еще больше походить все добро на одной полке, причем все в одном цвете хрен разбиреш что где, интуетивно нихера не понятно (нада учить всьо на изусть), короче бардак полнейшый. от душы лично мое мнение круче ХР по доступу к ресурсам я винды не встречал. а хто говорит мол 7-ка шлак, давно на 10-ке и не жалею, я просто промолчю (ДА ЗДРАВСТВУЕТ РЕКЛАМА в кожну хату)

Nordek 09-02-2020 23:56 2908935

Цитата:

Цитата Iska
Слишком много приложений стали лепить себя на Панель задач (зачастую — молча). »

Всегда раздражало и раздражает такое ненужное явление.


Цитата:

Цитата Beavimo
лично мое мнение круче ХР по доступу к ресурсам я винды не встречал. »

Потому и безопасности никакой.

Кстати начиная с 6.0.0-beta:
  • OS requirements change: Windows 2000, XP, and Server 2003 are no longer supported. Windows Vista is now the minimum supported operating system.
- В том числе и созданные инсталляторы.

Beavimo 10-02-2020 00:22 2908937

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

Nordek, ладно дружыще я просто немного ни в сибе третью сутку без сна, если что не так в правописании я со Львова, Руского никогда не изучал

Iska 10-02-2020 00:38 2908941

Цитата:

Цитата Beavimo
а так меня всегда раздажали картинки из игр в ирталлерах, заставки перед запуском, путь для игры с именем репакера или папка в меню пуск с его именем, установка софта поверх уже установленого .... короче кучя дерьма »

А сами хотите лепить то же самое, а :)? Коллега, как это понимать?

Beavimo 10-02-2020 02:01 2908950

Iska, :not-me: я просто хотел сделать свою форму для всех инсталлеров, одну форму оригинальную как на фото что я приводил, без музыки без кучи переходов с разными картинками, без своего имени у названия инсталятора и темболие папок со своим именем, без галочок доп софта взял все кредисты от 2010 запихнул в инсталлер он проверил если есть то не устанавливал, чтобы потом не висело по неськолько деинсталяторов в компонентах, минимум галочек вкладок ненужного текста максимальная скорость установки, пускай и проиграю в весе, все что от себя ето например малинький штамп на форме гдето в уголке но если устанавливается например Aster-V7 со встроиным сбросом триала, то папка без возможности изменений во (все программы) так и називалась Aster-V7, а не Beavimo :moderator, если я случайно удалю ярлык с робочего стола я полезу в все программы искать программу а не автора инсталлера. ладно думаю более мение доходчиво обяснил. и вопше сначала мотор тормоза колеса рулевая.... а покраска в конце, а не код на десять страниц + куча дллок, пожал до усрачки качаешь быстрей чем устанавливаешь, а самые больные бывает в игру при запуске свое лого запихнут это придел совершенства, не в обиду, просто достали типа блогеры. щенки мамины текст зазубрил а сам нуб в теме... нет я не говорю что я программер но я не пригаю выше головы ладно я завелся фен пошла четвертая сутка и самое главное ети все виртуалки и прочее мне до етого не были знакомы, так что бесят поиски однострочного ответа часами, блохеры мать их :tongue:

Nordek 10-02-2020 11:46 2908988

Цитата:

Цитата Beavimo
я просто хотел сделать свою форму для всех инсталлеров »

Это ваше право что хотите сделать, а для себя всё что только взумается. В сообщении #495 имеются ссылки на скрипты. Поискав там же, можно найте ещё больше. Увидите наглядно что можно сделать с помощью Inno.

Цитата:

Цитата Beavimo
форму оригинальную как на фото что я приводил »


Простота - Это высшее достижение в искусстве.

habib2302 12-02-2020 02:25 2909189

Доброе время суток. Надо доработать кусок скрипта. Хочу, чтобы при нажатии кнопки нет на msgbox'е инсталлятор завершил работу, но не через task kill, а чтобы была полная имитация кнопки отмены.

Скрытый текст
Код:

[Code]
function UninstallMyApp(): Boolean;
var
    Buff: String;
    i: Integer;
begin
    Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
    if not Result then Result := not FileExists(RemoveQuotes(Buff));
    if not Result then if MsgBox('Перед установкой необходимо удалить предыдущую версию {#Name}. Продолжить?', mbError, MB_YESNO) = IDYES then
    try
        Exec(RemoveQuotes(Buff), '', ExtractFilePath(RemoveQuotes(Buff)), SW_SHOW, ewWaitUntilTerminated, i);
    finally
        Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
        if not Result then MsgBox('Удаление завершилось неудачей!', mbError, MB_OK);
    end;
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
  Case CurPageID of
  wpSelectComponents: if WizardForm.Tag = 1 then
  begin
    if IsComponentSelected('APP\I') then
    begin
      UninstallMyApp;
  end;
 end;
end;


Gnom_aka_Lexander 12-02-2020 03:59 2909200

habib2302,
Так?
Код:

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  if CurPageID = wpWelcome then
    if MsgBox('Отменить установку?',mbInformation, MB_YESNO)= IDYES then
    WizardForm.CancelButton.Click;
  Result := True;
end;


Не везде сработает корректно, нужно пробовать

habib2302 12-02-2020 13:00 2909239

Gnom_aka_Lexander, Вы не правильно поняли.
Цитата:

Хочу, чтобы при нажатии кнопки нет на msgbox'е инсталлятор завершил работу, но не через task kill, а чтобы была полная имитация кнопки отмены.
Я имел ввиду про этот
MsgBox
Код:

if not Result then if MsgBox('Перед установкой необходимо удалить предыдущую версию {#Name}. Продолжить?', mbError, MB_YESNO) = IDYES then

Gnom_aka_Lexander 12-02-2020 13:38 2909246

habib2302, Ну так.
Код:

then
    WizardForm.CancelButton.Click;

вызывает действие нажатия кнопки отмены. Далее если нужно, можно взять из примеров скрытие запроса подтверждения отмены, если не хочется лишних диалогов. Таким образом отмена происходит полностью штатно.
Кнопка Нет - IDNO
Я так понимаю, нужен готовый код такого вида?
Код:

function UninstallMyApp(): Boolean;
var
    Buff: String;
    i, id : Integer;

begin
    Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
    if not Result then Result := not FileExists(RemoveQuotes(Buff));
    if not Result then id := MsgBox('Перед установкой необходимо удалить предыдущую версию {#Name}. Продолжить?', mbError, MB_YESNO);
    case id of
      IDYES:  try
                  Exec(RemoveQuotes(Buff), '', ExtractFilePath(RemoveQuotes(Buff)), SW_SHOW, ewWaitUntilTerminated, i);
              finally
                  Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
                  if not Result then MsgBox('Удаление завершилось неудачей!', mbError, MB_OK);
              end;
      IDNO:  WizardForm.CancelButton.Click;
    end;
end;


Меня не было целых 8 лет, а так ничего не изменилось. указать направление помощью не считается, только готовое, только хардкор )

habib2302 12-02-2020 13:42 2909248

Gnom_aka_Lexander, пример с моим кодом можно

Gnom_aka_Lexander 12-02-2020 15:02 2909265

Вложений: 2
Inno Setup registry finder

Накорябал уже сто лет тому назад, да вот все как-то недосуг выложить было. Программа делает поиск в реестре по заданной маске и форматирует найденное в записи, пригодные для использования в скрипте, с конвертацией путей в переменные Inno Setup, алгоритм конвертации предоставил Serega. По сути, это GUI для его конвертера с добавленной возможностью автоматизировать поиск нужных ключей.
Так-же есть возможность указать путь, который нужно заменить на {app}.
Так-же прилагаю библиотеку по поиску Sid. Не помню зачем, но она вроде нужна )

Beavimo 15-02-2020 13:02 2909662

а можно из секции [code] запустить службу, например службу Центр обновления Windows?

Beavimo 17-02-2020 22:41 2909901

Люди помогите решить проблему. Что то я никак не вкурю, как удалить из строки символ? Рабочего примера найти не могу, и догнать не могу. Может я не там копаю, может мне не из строки удалять нужно? Подскажите, а то опять сутку убил а решения все нету. Вот пример берет из реестра путь для установки.
CODE
Код:


[Setup]
AppName=TEST
AppVerName=TEST
OutputDir=userdocs:..\Desktop
CreateAppDir=no
Uninstallable=no

[*Code]
function InitializeSetup(): Boolean;
  begin
      if FileExists(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\IEXPLORE.EXE,Path}')) then
    Result:= True
  else
    MsgBox('Установка Прекращена:'#13'Файл не найден!', mbCriticalError, MB_OK);
end;



Path=C:\Program Files (x86)\Internet Explorer\IEXPLORE.EXE;
но в реестре, в конце пути стоит символ {;} как его удалить? что бы было вот так
Path=C:\Program Files (x86)\Internet Explorer\IEXPLORE.EXE
а еще лутше так
C:\Program Files (x86)\Internet Explorer
тоисть удалить все что идет посте последнего \

Dodakaedr 17-02-2020 22:49 2909902

Цитата:

Цитата Beavimo
но в реестре, в конце пути стоит символ {;} как его удалить? »

Цитата:

Цитата Beavimo
а еще лутше так
C:\Program Files (x86)\Internet Explorer
тоисть удалить все что идет посте последнего \ »

используйте функции Copy и ExtractFilePath
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[code]
procedure InitializeWizard();
var
  s: string;
begin
  s := 'Path=C:\Program Files (x86)\Internet Explorer\IEXPLORE.EXE;';
  s := Copy(s, 0, Length(s)-1);
  s := RemoveBackslash(ExtractFilePath(s));
  MsgBox(s, mbInformation, MB_OK);
end;


Gnom_aka_Lexander 18-02-2020 00:03 2909910

Beavimo, самое простое, использовать в такой ситуации функцию
Код:

ExtractFilePath(const FileName: string):string
Она отсекает с хвоста все до первого слеша.
Код:

ExtractFilePath(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\IEXPLORE.EXE,Path}'));
даст на выходе C:\Program Files (x86)\Internet Explorer\
Если нужно без косой черты, то ExtractFileDir - она возвращает тоже самое, но без слеша

Beavimo 18-02-2020 04:43 2909920

наконец то....:shot:..... целую ночь провозился, с этой кажись - такой мелочью. :vampire:

CODE
Код:


[Setup]
AppName=TEST1
AppVerName=TEST2
OutputDir=userdocs:..\desktop
CreateAppDir=no
Uninstallable=no

[*Code]
function InitializeSetup(): Boolean; var
    FileName: String; 
  begin
    FileName:=ExtractFilePath(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\IEXPLORE.EXE,Path}'));
      if not FileExists((FileName)+('Internet Explorer\iexplore.exe')) then
    Result:=True
  else
    MsgBox((FileName)+'Internet Explorer' #13''#13 'Папка  Установки  При  Обновлении !', mbInformation, MB_OK);
end;

[Files]
//Source: "userdocs:..\desktop\TEST.exe"; DestDir: "{app}"; Flags: ignoreversion



Теперь другов вопрос, как его этот путь "(FileName)+'Internet Explorer'", сохранить в например в дириктиву #define, или например в {app} неважно куда и как важно чтобы в (DestDir) каталог установки брался автоматом, так как пишеться апдейт а не полноценный софт.

nik1967 18-02-2020 12:14 2909947

Beavimo,
Код:

DefaultDirName={code:ExtractFilePath|{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\IEXPLORE.EXE,|}}


VLADEV 20-02-2020 16:27 2910225

Привет. что я делаю не так? Помогите новичку. Винда 10-64

Код:

Root: HKLM; SubKey: SOFTWARE\Boris FX, Inc.\Boris Graffiti 6.6; ValueType: string; ValueName: DefaultLibraryPath; ValueData: {pf64}\Boris FX, Inc\Keyframe Libraries 6; Flags: uninsdeletevalue uninsdeletekeyifempty
а прописывается в
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\WOW6432Node

Спасибо.

habib2302 20-02-2020 16:52 2910227

VLADEV, Замените HKLM на HKLM64

VLADEV 20-02-2020 22:38 2910268

habib2302,

Спасибо я конечно это сделал. я использовал конвертер реестра Converter.exe
и он не проставляет мне HKLM64 Вот я и не понял почему .

iglezz 20-02-2020 23:22 2910274

Цитата:

Цитата VLADEV
и он не проставляет мне HKLM64 Вот я и не понял почему . »

А откуда ему знать, какая разрядность у целевой системы и программы, которой эти ветки реестра предназначаются?

Там, где предполагается несовпадение разрядности программы и системы, пути в реестре и на диске надо самому проверять.

Nordek 21-02-2020 02:41 2910281

Цитата:

Цитата VLADEV
а прописывается в
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\WOW6432Node »

Меня всегда интересовал вопрос о тех, кто задаёт похожие или одни и теже вопросы: Есть ли у людей логика, или всё-таки как класс она отсутствует?
1. Справка (Пожалуй это самое важное правило.).
2. Поиск (Это самое важное правило после первого пункта).

Далее:
Совсем недавно было: Сообщение #487.

Далее:
Цитата:

Цитата VLADEV
я использовал конвертер реестра Converter.exe »

Действительно ли вам Converter так необходим?
Читайте сообщение #530 о Inno Script Studio.


Работа с Inno Script Studio:
Вам нужно импортировать данные реестра.

Экспортируете необходимый подраздел реестра из RegEdit сохранив в файл *.reg.

Открываете Inno Script Studio, или скрипт в нём.

Переводите фокус на Registry и щёлкаете по нему левой кнопкой мыши.
Вы в секции Registry:


Далее щёлкаете левой кнопкой мыши по подготовленному файлу *.reg и не отпуская кнопки перетаскиваете в область Registry:


Замечательно, данные импортировались:





Вам нужно изменить список строк.

Делаете как я (Делаю везде где только вздумается, не только в Inno):

Выделяете необходимые данные для копирования:

Нажимаете комбинацию клавиш CTRL+C чтоб скопировать выделенное.

Переводите фокус к началу первой строки:


Нажимаете комбинацию клавиш CTRL+H чтоб начать работу с заменой текста.

В первом поле вставляете (CTRL+V) скопированный текст, который будет заменён:


Во втором вводите данные для замены:


Щёлкаете клавишу Replace All чтоб заменить все заданные условия:


затем подтверждаете щёлкнув клавишу All:


Как видите необходимые данные были заменены:

Эти данные в 64-разрядной ОС будут внесены в WOW6432Node.





Для x64 аналогично.

Выделяете необходимые данные для копирования:

Нажимаете комбинацию клавиш CTRL+C чтоб скопировать выделенное.

Переводите фокус не к началу как ранее, а куда-нибудь в коментарии:


Нажимаете комбинацию клавиш CTRL+H чтоб начать работу с заменой текста.

В первом поле вставляете (CTRL+V) скопированный текст, который будет заменён:


Во втором вводите данные для замены:


Щёлкаете клавишу Replace All чтоб заменить все заданные условия:


затем подтверждаете щёлкнув клавишу All:


Как видите и в этом случае необходимые данные были заменены:


Всё, теперь вы умеете импортировать *.reg и заменять некорректные данные на необходимые!
Хочу заметить: Всё в одной программе.

VLADEV 21-02-2020 22:07 2910369

Nordek, Низкий поклон. Голова пока кипит ))) Взял на вооружение. Никаких конвертеров теперь

Gnom_aka_Lexander 22-02-2020 21:15 2910449

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

Beavimo 24-02-2020 09:35 2910606

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

Iska 24-02-2020 18:04 2910684

Цитата:

Цитата Beavimo
как сделать чтобы сетап, удалял самого себя после инсталляции? »

Никогда не делайте так.

Beavimo 24-02-2020 22:54 2910737

Iska, :) боюсь даже спрашивать почему...

Iska 25-02-2020 00:05 2910745

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

Beavimo 25-02-2020 01:04 2910751

Iska, ты наверное не понял я хочу удалятор на основе инсталлятора построить
Скрытый текст

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Test]
"DisplayName"="Test"
"Publisher"="Test.com"
"DisplayVersion"="1.0.0.0"
"DisplayIcon"="C:\\Test\\Test.exe"
"InstallLocation"="C:\\Test\\"
"UninstallString"="C:\\Test\\Test.exe"
"NoModify"=dword:00000001

это поможет организовать иконку в программы и компоненты

Iska 25-02-2020 05:21 2910764

Цитата:

Цитата Beavimo
я хочу удалятор на основе инсталлятора построить »

Beavimo, а так — тем более не делайте.

Nordek 26-02-2020 02:12 2910937

Цитата:

Цитата Iska
а так — тем более не делайте. »

Быть может не то, что вы подумали?!

Цитата:

Цитата Beavimo
я хочу удалятор на основе инсталлятора построить »

Например #532 (Варианты перебираю с помощью поиска. Вы же не хотите для себя этого сделать.).

Gnom_aka_Lexander 26-02-2020 12:06 2910977

Beavimo, Есть объект UninstallProgressForm, тоже самое, что и Wizardform, делать с ним можно тоже все, что душе заблагорассудиться - менять размеры, накладывать картинки, добавлять объекты, в том числе и NoteboockPage, соответственно и страницы. Нет нужды делать отдельный деинсталлятор, все можно сделать и на оригинальном.

Iska 26-02-2020 17:22 2911022

Цитата:

Цитата Nordek
Быть может не то, что вы подумали?! »

Ну, как было написано — так я и понял.

Beavimo 27-02-2020 06:27 2911083

Nordek, Я видел "532" пост, когда искал решение "удаление перед установкой" несколько раз.

Не понимая заданного вопроса "TROY Diamond" (Мне нужно, чтобы мой установщик при запуске находил уже ранее установленное приложение, НЕ только моим, НО и другими установщиками) - просто проходил мимо.
Теперь понял, спасибо за наводку :hi:

Но мне не то нужно, может есть возможность выполнить батник, или же конслольные команды после нажатия на финиш инсталлятора?
Банально мне нужно чтобы мой инсталятор само уничтожался после выполнения, как это делает unins000.exe...

Tco 03 08-03-2020 21:55 2912440

Инсталлятор самоуничтожится после выполнения!

procedure CurStepChanged(CurStep: TSetupStep);
var ResultCode: Integer;
begin
if CurStep = ssDone then
begin
SaveStringToFile(ExpandConstant('{userappdata}\del.bat'), '@echo off' +#13#10+ ':trydel' +#13#10+ 'del "' + ExpandConstant('{srcexe}') + '"' +#13#10+ 'if exist "' + ExpandConstant('{srcexe}') + '" goto trydel' +#13#10+ 'del "' + ExpandConstant('{userappdata}\del.bat') + '"', False);
Exec(ExpandConstant('{userappdata}\del.bat'), '', '', SW_HIDE, ewNoWait, ResultCode);
end;
end;

VLADEV 09-03-2020 17:56 2912516

Буду признателен. Не нашел (плохо искал наверно)

у меня папка установки берется из реестра. ={reg:HKLM64\SOFTWARE\Avid\install,Main Path} (как пример)
Все нормально никаких проблем. Мне просто нужно чтобы при установке этот путь показывался но НЕ давал сменить.
в Inno Script Studio пробовал. или не нашел или просто не появляется путь вообще.
Спасибо заранее.

Gnom_aka_Lexander 09-03-2020 18:43 2912525

Цитата:

Цитата VLADEV
показывался но НЕ давал сменить. »

код
Код:

procedure InitializeWizard();
begin
  WizardForm.DirBrowseButton.Enabled := False;
  WizardForm.DirEdit.Enabled := False;
end;


Beavimo 10-03-2020 01:09 2912568

Tco 03, робит :clapping:

Alex S 11-03-2020 20:15 2912840

Всем доброго вечера! Давненько я думал избавиться от длинного ключа тихой установки (/verysilent) и заменить его коротким (/S) как у других аналогов InnoSetup.
Читая архив наткнулся на уже готовое решение...
Взял на испытание. В целом код с задачей справляется хорошо, но нашёл одно НО. Заключается оно в регистре.
Ключ в нижнем регистре отрабатывает хорошо, а в верхнем не хочет.
Долго уже чешу бестолковку :clever-ma , но решить задачу не могу.
Прошу помощи в решении задачи с верхним регистром или может у кого-нибудь есть другое решение замены длинного ключа на короткий.

Alex S 11-03-2020 20:33 2912844

Вопрос снимаю. Опробовал на другом компьютере и всё работает в верхнем и нижнем регистре.
Видать у меня в системе проблемы...
Хотя, если есть у кого-нибудь альтернативные решения буду рад взглянуть!!!

Alex S 17-03-2020 23:00 2913598

Новая проблема с этим кодом (писал о нем несколькими сообщениями ранее).
Добавил языки в инсталлятор и тихая установка при помощи этого кода не работает.
При запуске с коротким ключом "/S" выводит окно выбора языка (чего не должно быть), жму "Ок" и дальше устанавливает тихо.
Если в функции InitializeSetup параллельно происходят еще какие-то операции (в моем случае это распаковка некоторых *.bmp во временную папку),
то при запуске с коротким ключом выводит окно выбора языка, после нажатия "Ок" и установка проходит в обычном режиме с показом всех последующих окон.
В общем так уже не работает:
[Setup]
AppName=Silent Install Key
AppVerName=Silent Install Key v 1.0
OutputBaseFilename=SilentInstallKey_setup
DefaultDirName={pf}\SilentInstallKey
CreateAppDir=no

[Languages]
Name: "english"; MessagesFile: "compiler:Languages\English.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[code]

function InitializeSetup(): Boolean;
var
i, ResultCode: Integer;
begin
for i := 1 to ParamCount do
if LowerCase(ParamStr(i)) = '/S' then
begin
Exec(ExtractFileName(ExpandConstant('{srcexe}')), '/verysilent', ExtractFileDir(ExpandConstant('{srcexe}')), SW_SHOWNORMAL, ewNoWait, ResultCode);
Exit;
end;
Result := True;
end;

Прошу помощи в решении задачи...

Gnom_aka_Lexander 20-03-2020 19:05 2914067

Alex S, Так не пробовал?
код

Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma2/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Languages]
Name: "english"; MessagesFile: "compiler:Languages\English.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[_Code]
function InitializeSetup(): Boolean;
var
  i, ResultCode: Integer;
begin
  // проверяем с 1, потому что ParamStr(0) всегда будет имя исполняемого файла
  for i := 1 to ParamCount do
    if LowerCase(ParamStr(i)) = '/v' then
      begin
        Exec(ExtractFileName(ExpandConstant('{srcexe}')), '/verysilent /LANG=english', ExtractFileDir(ExpandConstant('{srcexe}')), SW_SHOWNORMAL, ewNoWait, ResultCode);
        Exit;
      end;
  Result := True;
end;

хотя, если верить справке, именно ключ /LANG может вызвать окно запроса выбора языка.
Можно еще такой вариант попробовать:
код
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[_Code]
function InitializeLanguageDialog(): Boolean;
var
  i : Integer;
  R : Boolean;
begin
  Result := True;
  R := False;
  for i := 1 to ParamCount do
    begin
      R :=  LowerCase(ParamStr(i)) = '/verysilent';
      if R then Break;
    end;
  if R then Result := False; // тут конструкция в виде Result := not R; может криво стработать, поэтому надежнее так.
end;


Так, возможно, более правильно:
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[_Code]
function InitializeLanguageDialog(): Boolean;
var
  i : Integer;
begin
  Result := True;
  for i := 1 to ParamCount do
    if  LowerCase(ParamStr(i)) = '/verysilent' then
    begin
      Result := False;
      Break;
    end;
end;


Alex S 20-03-2020 23:00 2914092

Gnom_aka_Lexander, спасибо большое!
Приклеил к исходному коду Вашу функцию InitializeLanguageDialog и всё стало работать нормально.
В InitializeSetup ключ /LANG не понадобился...
Первые тесты пока без глюков.

Gnom_aka_Lexander 21-03-2020 22:06 2914220

Alex S,
Вот так, теоретически, тоже должно сработать
Код:

function InitializeLanguageDialog(): Boolean;
begin
  Result := Pos('/verysilent', LowerCase(GetCmdTail))=-1;
end;


Вспомнил, есть еще WizardSilent:
Код:

function InitializeLanguageDialog(): Boolean;
begin
  Result := not WizardSilent;
end;


Alex S 22-03-2020 01:32 2914230

Всё верно, работает.
При таком варианте тихая установка проходит успешно, а вот при запуске установщика в обычном режиме не отображается окно выбора языка...
Предыдущий вариант пока работает нормально. Тестирую дальше...
Спасибо за помощь! :bow:

VLADEV 24-03-2020 12:34 2914470

Здравствуйте знатоки. Вопросик.
Есть папки (source) например Папка1, Папка2

Что нужно сделать чтобы после компиляции был не общий BIN а папка1.bin папка2.bin ну и общий exe.

Т.е что бы в случае их изменения менялись только они .
Надеюсь понятно пояснил.
Спасибо.

и еще Возможно ли это

есть код заменяющий строчку в текстовом файле. Нужно чтобы поменялся на ссылку {app}


Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  UnicodeStr: string;
  ANSIStr: AnsiString;
begin
  if (CurStep = ssPostInstall) then
  begin
  LoadStringFromFile(ExpandConstant('{app}\Files\ops.txt'), ANSIStr)
  UnicodeStr := String(ANSIStr);
  StringChangeEx(UnicodeStr, 'DSTCOPY', 'DSTCOPY = "{app}"', False)
  SaveStringToFile(ExpandConstant('{app}\Files\ops.txt'), AnsiString(UnicodeStr), False);
  end;
end;

всем кто ответит пивА и девочек на выбор )))

Gnom_aka_Lexander 24-03-2020 19:56 2914543

VLADEV, первое - невозможно без применения внешних архиваторов вместо встроенного сжатия . по второму -DSTCOPY = "{app}" нужно заключить в ExpandConstant. либо, как на другом форуме подсказали, использовать WizardDirValue

VLADEV 24-03-2020 22:28 2914556

Спасибо огромное.
WizardDirValue действительно отлично помог.
только мне надо ссылку в кавычки. а знаний не хватает
т.е у меня щаз предположим C:\Program Files (x86) а нужно "C:\Program Files (x86)"

Gnom_aka_Lexander,

1 вопрос это больше хотелка. поиском пробовал ничего вразумительного не нашел.
Если это сложно для новичка , то пока хотелку закрою.

Gnom_aka_Lexander 24-03-2020 22:43 2914558

VLADEV, Сам файл случайно не ини?
Код:

StringChangeEx(UnicodeStr, 'DSTCOPY', 'DSTCOPY = "'+ExpandConstant('{app}')+'"', False)
Как-то так будет с кавычками

VLADEV 24-03-2020 23:13 2914560

ФЛУД.
От всей души желаю тебе сисястую любовницу. ))))
Нет файл простой текст

iglezz 24-03-2020 23:22 2914565

VLADEV,
Цитата:

Цитата VLADEV
Есть папки (source) например Папка1, Папка2
Что нужно сделать чтобы после компиляции был не общий BIN а папка1.bin папка2.bin ну и общий exe.
Т.е что бы в случае их изменения менялись только они . »

Как-то так :)
Способ 1: папка1.bin папка2.bin как архивы
Включаем в состав установщика распаковщик (7-Zip, UnRAR, ...)
Через ExtractTemporaryFile() извлекаем распаковщик
Через Exec() его запускаем для распаковки архива папка1.bin
Через Exec() его запускаем для распаковки архива папка2.bin

Способ 2: папка1.bin папка2.bin как inno-установщики
// Прокатит или нет - не знаю, надо проверять. Но теоретически вместо .exe можно использовать любое расширение.
Через Exec() запускаем для распаковки архивов inno-установщик с именем папка1.bin
Через Exec() запускаем для распаковки архивов inno-установщик с именем папка2.bin

В целом:
Точкой входа в запуск всего этого шаманства может быть либо скрипт (bat/wsh/ps/...), либо базовый .iss-скрипт с использованием директив препроцессора.
Как сравнивать соответствие папки и готового bin? Можно на стадии сборки (например, препроцессором) читать файл со списком файлов и свойствами, по которым будет детектиться соответствие/различие и сравнивать, параллельно писать новый файл (для целей замены, если понадобится собирать новый *.bin)
С виду это может показаться лютым шаманством, но на самом деле, применив простенький скилл "Декомпозиция", задача решится, пусть и не за два клика.
Всё это теория, но практика будет с конкретным ТЗ

Beavimo 29-03-2020 08:42 2914993

Добрый День Форумчане! Пришел опять к вам за советом, как можно убрать описание файла, и его версию?
Скрытый текст



Может сторонним софтом можно удалить эти данные?

boss911 29-03-2020 15:06 2915016

Цитата:

Цитата Beavimo
как можно убрать описание файла, и его версию? »

Если редактирование "SetupLdr.e32" не помогает, то, видимо, ни как.

ZVSRus 29-03-2020 16:15 2915021


Beavimo 29-03-2020 18:03 2915029

ZVSRus, да так, а как ето сделать?

ZVSRus 30-03-2020 14:05 2915124

Цитата:

Цитата Beavimo
а как ето сделать?

Редактируется Редакторами ресурсов (например Restorator-ом) скомпелированный установщик. В ресурсах самого компилятора не пробовал.

Beavimo 31-03-2020 10:47 2915200

ZVSRus, я так и думал, но не пробовал, щас попробую

Alsag 07-04-2020 20:36 2916204

Здравствуйте!
Мне не нужна помощь. Дело такое, создаю ярлык в папке Автозагрузка
Name: "{userstartup}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; WorkingDir: "{app}"
Программа запускается в развёрнутом виде, каждый раз её приходится сворачивать в трей.
А если в свойствах ярлыка сделать так
Программа призапуске будет сама своррачиваться в трей.
Вопрос такой как это сделать в скрипте Name: "{userstartup}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; WorkingDir: "{app}"

iglezz 07-04-2020 21:09 2916210

Цитата:

Цитата Alsag
Вопрос такой как это сделать в скрипте .... »

Читать справку
Код:

Flags: runminimized

Alsag 07-04-2020 21:26 2916216

Цитата:

Цитата iglezz
Читать справку »

Благодарю вас за помощь. Всё работает.

mig73 12-04-2020 16:41 2916894

Русская справка Inno Setup Preprocessor (ISPP) v6.0.4

passstrada 17-04-2020 15:22 2917695

Обнаружил проблему. Во время запуска Обновления.
Отображения окна - "Клиент игры не найден! Обновление не может быть установлено!" Нажимаю ОК
И идёт продолжение запуска обновления, а должно закрыть окно Обновления.

В чем может быть проблема?

Код:
Скрытый текст
Код:

//Процедура, Оформление окон
procedure LoadVCLStyle(VClStyleFile: String); external 'LoadVCLStyleW@files:VclStylesInno.dll stdcall';
procedure UnLoadVCLStyles; external 'UnLoadVCLStyles@files:VclStylesInno.dll stdcall';

//Процедура, Splash
procedure ShowSplashScreen(p1:HWND;p2:AnsiString;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer);
external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';

//Объеденение две функции в одну, первая, Оформление окон
Function InitializeSetup1(): Boolean;
begin
  ExtractTemporaryFile('Amakrits.vsf');
  LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
  Result := True;
end;

procedure DeinitializeSetup();
begin
  UnLoadVCLStyles;
end;

//Объеденение две функции в одну, вторая, Обновление
Function InitializeSetup2(): Boolean;
var ResultStr: String;
begin
  RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
  if ResultStr='{#AppVer}' then
begin
  Result := MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
  if Result = False then
  MsgBox('Поиск клиента игры...' #13#13 'Обновление клиента прервано.', mbInformation, MB_OK);
end
  else MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK)
end;
//Читаем значение параметра Version из реестра и присваиваем его переменной ResultStr
//Если значение параметра Version равно 1.0, обновление устанавливается, если не равно или не существует – установка прекращается

//Запуск функций, сначала первую за ней вторую (более правильное объеденение двух функций в одну)
Function InitializeSetup(): Boolean;
begin
 InitializeSetup1();
 InitializeSetup2();
 Result := True;
end;

//Функция, Splash
procedure InitializeWizard();
begin
  ExtractTemporaryFile('Splash.png');
  ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}\Splash.png'),1000,3000,1000,0,255,True,$FFFFFF,10);
end;


iglezz 17-04-2020 15:41 2917698

Цитата:

Цитата passstrada
В чем может быть проблема? »

В том, что InitializeSetup() возвращает True вместо предполагаемого, по логике, результата функции InitializeSetup2()

passstrada 17-04-2020 15:44 2917700

Цитата:

Цитата iglezz
В том, что InitializeSetup() возвращает True вместо предполагаемого, по логике, результата функции InitializeSetup2() »

Можно ли как то исправить эту проблему?
Может как то переделать код, или объеденить 2 функции по другому?

ПопробЫвал вызвать через procedure
Получилось что-то такое:
Скрытый текст
Код:

Procedure Skins();
begin
  ExtractTemporaryFile('Amakrits.vsf');
  LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
end;

Function InitializeSetup2(): Boolean;
var ResultStr: String;
begin
  RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
  if ResultStr='{#AppVer}' then
begin
  Result := MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
  if Result = False then
  MsgBox('Обновление клиента отменено!', mbInformation, MB_OK);
end
  else MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK);

  Skins();
  Result := True;
end;


Но скин срабатывает только после Splash, тоисть окна проверки (Обновления) без оформления.

Тоисть нужна procedura наоборот, вроде такого:
Скрытый текст
Код:

Procedure Update();
var ResultStr: String;
begin
  RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
  if ResultStr='{#AppVer}' then
begin
  Result := MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
  if Result = False then
  MsgBox('Обновление клиента отменено!', mbInformation, MB_OK);
end
  else MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK);
end;

Function InitializeSetup2(): Boolean;
begin
  ExtractTemporaryFile('Amakrits.vsf');
  LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
  Result := True;

  Update();
end;


Но она отказывается работать.

iglezz 17-04-2020 19:02 2917731

passstrada,
Например так
Код:

function CheckInstalled(): Boolean;
var ResultStr: String;
begin
        RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
        if ResultStr='{#AppVer}' then Result := True else Result := False;
end;

function GetUserConfirmation(Message: String): Boolean;
begin
        if MsgBox(Message, mbConfirmation, MB_YESNO) = IDYES then Result := True else Result := False;
end;

function InitializeSetup(): Boolean;
var ReturnValue: Boolean;
begin
        // это вместо InitializeSetup1()
        ExtractTemporaryFile('Amakrits.vsf');
        LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));

        // это вместо InitializeSetup2()
        ReturnValue := False;

        if CheckInstalled() then
                ReturnValue := GetUserConfirmation('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?')
        else
                MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK)

        Result := ReturnValue;
end;


Хотя непонятно зачем дополнительно спрашивать про "Продолжить установку?", если гуй всё равно используется.

add:
Чтобы не лепить "Result := True;" где попало неплохо бы справку почитать по Inno и Pascal

El Sanchez 17-04-2020 19:05 2917732

Цитата:

Цитата passstrada
И идёт продолжение запуска обновления, а должно закрыть окно Обновления. »

passstrada,
Скрытый текст

Код:

function InitializeSetup: Boolean;
var
  ResultStr: string;
begin
  Result := False;
  ExtractTemporaryFile('Amakrits.vsf');
  LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
  if RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr) and
    (ResultStr = '{#AppVer}') then
  begin
    Result := MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
    if not Result then
      MsgBox('Поиск клиента игры...' #13#13 'Обновление клиента прервано.', mbInformation, MB_OK);
  end else
    MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK);
end;


nik1967 17-04-2020 19:06 2917733

passstrada,
А так не катит?

//Читаем значение параметра Version из реестра и присваиваем его переменной ResultStr
//Если значение параметра Version равно 1.0, обновление устанавливается, если не равно или не существует – установка прекращается
Function InitializeSetup(): Boolean;
var ResultStr: String;
begin
ExtractTemporaryFile('Amakrits.vsf');
LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
if ResultStr='{#AppVer}' then begin
Result:= MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
if not Result then
MsgBox('Поиск клиента игры...' #13#13 'Обновление клиента прервано.', mbInformation, MB_OK);
end else MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK)
end;

El Sanchez 17-04-2020 19:50 2917738

Цитата:

Цитата nik1967
А так не катит? »

nik1967, в данном примере прокатит, но есть нюанс. Чему будет равен Result, если ResultStr='{#AppVer}' вернет False?

nik1967 22-04-2020 21:25 2918593

Цитата:

Цитата El Sanchez
Чему будет равен Result »

False

El Sanchez 25-04-2020 15:54 2918954

Цитата:

Цитата nik1967
False »

nik1967, верно, InitializeSetup не вызывается из другой процедуры и переменная Result инициализируется в ней значением по умолчанию после оператора begin.
Теперь сделаем ее вызываемой: переименуем ее в InitializeSetup2, например, и вызовем ее из InitializeSetup следующим образом:

Код:

function InitializeSetup2: Boolean;
var
  ResultStr: string;
begin
  ExtractTemporaryFile('Amakrits.vsf');
  LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
  RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
  if ResultStr = '{#AppVer}' then
  begin
    Result := MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
    if not Result then
      MsgBox('Поиск клиента игры...' #13#13 'Обновление клиента прервано.', mbInformation, MB_OK);
  end else
    MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK);
end;

function InitializeSetup: Boolean;
begin
  Result := True; // что-то делаем с Result, в итоге Result равен True
  // ...
  Result := InitializeSetup2; // вызываем InitializeSetup2
end;


При входе в InitializeSetup2 после begin Result равен True и в случае невыполнения ResultStr = '{#AppVer}' пользователь увидит сообщение "Клиент игры не найден" и установка продолжится, что есть непредвиденное поведение. В данном случае Result не инициализируется в InitializeSetup2, это было сделано раньше, в InitializeSetup после begin. Потом в строке Result := True переменной присвоено значение True и дальше передана по ссылке в InitializeSetup2. Функции на самом деле являются процедурами, где первым параметром идет переменная c именем Result и которая передается по ссылке.
Так что пример выше на самом деле выглядит так:

Код:

procedure InitializeSetup2(var Result: Boolean);
var
  ResultStr: string;
begin
  // тут Result передан по ссылке из InitializeSetup и равен True
  ExtractTemporaryFile('Amakrits.vsf');
  LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
  RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
  if ResultStr = '{#AppVer}' then
  begin
    Result := MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
    if not Result then
      MsgBox('Поиск клиента игры...' #13#13 'Обновление клиента прервано.', mbInformation, MB_OK);
  end else // непредвиденное поведение: тут Result равен True, т.к. нигде не используется выше в теле процедуры
    MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK);
end;

procedure InitializeSetup(var Result: Boolean);
begin
  // тут Result инициализируется значением по умолчанию False
  Result := True; // что-то делаем с Result, в результате Result равен True
  // ...
  InitializeSetup2(Result); // вызываем InitializeSetup2
end;


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

Log 101 13-05-2020 13:30 2920974

Здравствуйте! Мне нужна помощь.
Есть рабочий скрипт (его код ниже), который должен создать ярлык на папку. Ярлык создается, но если искать этот ярлык через программу, то программа его не видит. (Даже в Экселе - Файл/Открыть - ярлык не виден).
1.Что в скрипте не так?
2.Как в конце установки вывести галку с предложением открыть папку с настройками (из "{commonappdata}\Inno\Программа") после окончания установки?

Код:

[Setup]
AppName=Программа 2020
; AppVerName=1.0
AppPublisher=Pro, Inc.
AppCopyright=Copyright (C) 2020
AppVersion=2.0.0.0
DefaultDirName="{commonappdata}\Inno\Программа"
DisableStartupPrompt=yes
DisableReadyPage=yes
DisableDirPage=yes
DefaultGroupName=Inno 5\Настройки
DisableProgramGroupPage=yes
OutputBaseFilename=setup-auto
Compression=lzma
SolidCompression=yes
Uninstallable=no
DisableWelcomePage=no
WizardSmallImageFile=WizSmall2.bmp

[Messages]
WelcomeLabel1=Вас приветствует Мастер установки Inno 5
WelcomeLabel2=Программа установит [name/ver] на Ваш компьютер.%n%nТребуется закрыть программу "Inno 5" перед тем, как продолжить.
FinishedHeadingLabel=Завершение Мастера установки Inno 5
FinishedLabelNoIcons=[name/ver] установлены на Ваш компьютер.
FinishedLabel=[name] установлены.%n%nНастройки находятся в папке "Программа" на Рабочем столе компьютера.
InstallingLabel=Пожалуйста, подождите пока [name] установится на Ваш компьютер.

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

[Files]
Source: "{src}\Программа\*"; DestDir: "{app}\"; Flags: external recursesubdirs skipifsourcedoesntexist

[Icons]
Name: "{group}\Настройки"; Filename: "{commonappdata}\Inno\Программа"
Name: "{commondesktop}\Программа"; Filename: "{commonappdata}\Inno\Программа"; Comment: "Папка содержит настройки программы"

Спасибо!

Log 101 16-05-2020 12:08 2921381

Друзья, может кто знает, как решается этот вопрос? (см. предыдущее сообщение)

habib2302 16-05-2020 12:26 2921386

Log 101, У меня все ярлыки создаются как на рабочем столе так и в меню пуск.
Цитата:

Цитата Log 101
Ярлык создается, но если искать этот ярлык через программу, то программа его не видит. (Даже в Экселе - Файл/Открыть - ярлык не виден). »

Чтобы ярлык виделся в любой программе замените {commondesktop} на {userdesktop}
Цитата:

Цитата Log 101
Как в конце установки вывести галку с предложением открыть папку с настройками (из "{commonappdata}\Inno\Программа") после окончания установки? »

Добавьте эту строку.
Код:

[Run]
Filename: "{win}\explorer.exe"; Parameters: "{commonappdata}\Inno\Программа"; Description: "Открыть папку с настройками"; Flags: nowait postinstall skipifsilent


ZVSRus 16-05-2020 14:49 2921403

Цитата:

Цитата Log 101
Есть рабочий скрипт (его код ниже), который должен создать ярлык на папку. Ярлык создается, но если искать этот ярлык через программу, то программа его не видит. (Даже в Экселе - Файл/Открыть - ярлык не виден).
1.Что в скрипте не так?
2.Как в конце установки вывести галку с предложением открыть папку с настройками (из "{commonappdata}\Inno\Программа") после окончания установки?

Извиняюсь за любопытство! Через какую программу, и какой ярлык вы хотите видеть?
На рабочем столе ярлык папки создается, формулировка ярлык через программу, если вы имеете ввиду Пуск > Программы > Inno 5 > Настройки > Настройки, тогда последняя папка и есть ярлык. Других ярлыков согласно скрипта нет.

Цитата:

(Даже в Экселе - Файл/Открыть - ярлык не виден)
Ярлык какого либо файла, и ярлык папки это разные понятия.

Log 101 16-05-2020 16:31 2921417

Цитата:

Извиняюсь за любопытство! Через какую программу, и какой ярлык вы хотите видеть?
Ярлык, который должен создастся на Рабочем столе для всех пользователей. Программы, которые должны увидеть ярлык, например, "Экселе" - Файл/Открыть или "Ableton" - File/Open.

Цитата:

Чтобы ярлык виделся в любой программе замените {commondesktop} на {userdesktop}
...но тогда только у текущего пользователя будет ярлык, если я правильно понимаю.
Можно ли создать ярлык все-таки для всех пользователей? И чтобы он был видим и через программы тоже.

Цитата:

Цитата habib2302
»
Добавьте эту строку.
Код:
[Run]
Filename: "{win}\explorer.exe"; Parameters: "{commonappdata}\Inno\Программа"; Description: " »

Спасибо!

ZVSRus 16-05-2020 16:56 2921421

Цитата:

Цитата Log 101
Ярлык, который должен создастся на Рабочем столе для всех пользователей. Программы, которые должны увидеть ярлык, например, "Экселе" - Файл/Открыть или "Ableton" - File/Open.

Все в вашем скрипте правильно, с константой {commondesktop} ярлыки будут создаваться на всех рабочих столах пользователей.
Если вы имеете ввиду Microsoft Excel то ярлык на рабочем столе виден Файл > Открыть > Рабочий стол (типы файлов: Все файлы)

Log 101 16-05-2020 20:22 2921449

Цитата:

Цитата ZVSRus
Все в вашем скрипте правильно, с константой {commondesktop} ярлыки будут создаваться на всех рабочих столах пользователей.
Если вы имеете ввиду Microsoft Excel то ярлык на рабочем столе виден Файл > Открыть > Рабочий стол (типы файлов: Все файлы) »

Спасибо за ответ, но к сожалению ярлык с константой {commondesktop} через программу под Win10/7 не виден. (Могу сделать скриншот.) Он виден, если использовать {userdesktop} вместо {commondesktop}, как предложил habib2302. Но такой вариант уже не подойдет.
Может ярлыку для всех пользователей не хватает какого-то атрибута?..

ZVSRus 17-05-2020 09:44 2921484

Цитата:

Цитата Log 101
к сожалению ярлык с константой {commondesktop} через программу под Win10/7 не виден

Из под вашего скрипта установил программу, ярлыки на рабочем столе и в меню пуск создаются.
Создал ещё одну учетную запись (обычные права, не админ), зашел от имени зтого пользователя, ярлык на рабочем столе виден.
Создал Microsoft Excel Файл > Открыть > Рабочий стол (типы файлов: Все файлы) ярлык на рабочем столе виден.
Win7 Максимальная, Win10 нет.

PS: Во всех ваших вопросах есть какая то недосказанность.

Log 101 18-05-2020 07:09 2921577

Вложений: 1
Цитата:

Цитата ZVSRus
Из под вашего скрипта установил программу, ярлыки на рабочем столе и в меню пуск создаются. »

Для полноты картины вот мой Рабочий стол. На нем 2 ярлыка, созданные через Inno. Один создавался для {commondesktop}, другой для {userdesktop}. Оба ярлыка на Рабочем столе. Но программа видит только тот, который был создан для {userdesktop}.

ZVSRus 18-05-2020 09:19 2921592

Картинки


Вопрос не к Inno Setup, а к вашей ОС

Log 101 18-05-2020 10:59 2921600

Цитата:

Цитата ZVSRus
Вопрос не к Inno Setup, а к вашей ОС »

Если бы только у меня так было, но проверялся скрипт на других компьютерах тоже. На Win7 - у всех по-разному, на Win10 - у всех, как у меня.
P.S. Win10 стоит лицензионная.

Nordek 18-05-2020 13:00 2921621

Цитата:

Цитата Log 101
Но программа видит только тот »

Ярлыки и папки общего рабочего стола

Log 101 18-05-2020 20:48 2921683

Цитата:

Цитата Nordek
Ярлыки и папки общего рабочего стола »

Спасибо. Буду разбираться.

Log 101 19-05-2020 19:18 2921779

Цитата:

Цитата Nordek
Ярлыки и папки общего рабочего стола »

Спасибо за ссылку, но там на вопрос того пользователя так и не ответили.
Для информации: ОС, на которой проверялся скрипт, "Win10 Домашняя" лицензионная.
Может кто-то сталкивался с подобного рода проблемой?

Nordek 19-05-2020 21:56 2921796

Цитата:

Цитата Log 101
Может кто-то сталкивался с подобного рода проблемой? »

При вашем скрипте: В Windows 7 из сторонней программы через Файл » Открыть/File » Open - ярлыки видны, в Windows 10 - не видны и это нормально, используйте {userdesktop}. Недоразумение никак не связано с Inno Setup, проблему ищите в самой Windows.

Log 101 20-05-2020 05:44 2921811

Если проблему не обойти, подскажите, пожалуйста, как в скрипте зашить проверку на версию Windows. И если Win7/ХР, то чтобы установка сама шла в {commondesktop}, если же Win10, то в {userdesktop}. Остается тогда вопрос: куда отнести Win8...

Но тогда предвижу еще одну проблему: если ставить будет Админ под своим логином, а не Пользователь, то ярлык будет у Админа, а у Пользователя (для которого вся установка) ярлыка не будет.

mig73 20-05-2020 07:35 2921817

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

Alsag 30-05-2020 14:32 2923294

Цитата:

Цитата mig73
Возможно открою Африку, но именно в Win10 ярлык именно на Панели задач создать пока невозможно. Остальные ярлыки создаются без вопросов хоть где на любой ОС, исключая Панель задач Win10. »

Программа MPC-BE, Bandicam 4.5.8.1673 Repack elchupacabra при установки создают ярлык на панели задач в Win10

slondovolen 13-06-2020 13:32 2924916

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

passstrada 13-06-2020 17:09 2924950

Как убрать кнопку с выбором типа установки?
Полная установка
Компактная установка
Выборочная установка

habib2302 13-06-2020 17:18 2924953

passstrada, в скрипте в разделе Types уберите все кроме "Полная установка" и поставьте флаг Flags: iscustom

Код:

[Types]
Name: full; Description: Полная установка; Flags: iscustom


passstrada 14-06-2020 23:16 2925101

Вложений: 1
Резервное копирование изменяемых оригинальных файлов для последующего восстановления.

Решил удалить свои старые сообщения, связать их в кучу, и прикрепить сюда (что бы не мусорить).
Здесь пытался найти ответ на:
13.06.2020 в 12:39

Хочу создать модпак, и столкнулся с такой вот идеей
Нужно что бы во время установки мода в указанную папку, и выборе модификаций, делалось backup оригинальных файлов в папку backup с bat файлом, который отправится на рабочий стол.
Допустим я выбираю Мод1 в котором файлы:
Скрытый текст

*\Data\Gfx2\UI\BattleScreenHUD\Arrow.txt
*\Data\Gfx2\UI\BattleScreenHUD\capturebaseicon.txt
*\Data\Gfx2\UI\BattleScreenHUD\ChatCommandsOuterSectorBg.txt
*\Data\Gfx2\UI\BattleScreenHUD\markers\explosion_bk.txt
*\Data\Gfx2\UI\BattleScreenHUD\markers\standart_damage_marker.txt


И оригинал этих файлов отправился в папку backup:
Скрытый текст

*\Data\Gfx2\UI\BattleScreenHUD\Arrow.txt
*\Data\Gfx2\UI\BattleScreenHUD\capturebaseicon.txt
*\Data\Gfx2\UI\BattleScreenHUD\ChatCommandsOuterSectorBg.txt
*\Data\Gfx2\UI\BattleScreenHUD\markers\explosion_bk.txt
*\Data\Gfx2\UI\BattleScreenHUD\markers\standart_damage_marker.txt


И так далее, при выборе Мод2 копия оригинала в backup...

Зачем это делать?
На рабочем столе будет создан ярлык bat файла, который при открытии будет делать замену файлов, на оригинальные файлы (которые и будут храниться в папке backup)
Или не батник, а допустим какой-то exe файл.

Не чего особо не нагуглил, что подскажите?

13.06.2020 в 19:45

Подскажите пожалуйста
Я всё же интересуюсь сделать backup файлов, которые заменяет, это так скажем "обновление"
Нашел такой вот код? Что скажите?
Скрытый текст
Код:

[Files]
Source: Files\*.*; DestDir: {app}; Flags: ignoreversion recursesubdirs; BeforeInstall: CreateBackup

[Code
function MoveFile(const srcFile, destFile: PChar):Integer;
external 'MoveFileA@kernel32.dll stdcall';

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
MoveDir(ExpandConstant('{app}\Backup\'),ExpandConstant('{app}'));
RemoveDir(ExpandConstant('{app}\Backup\'));
end;
end;

procedure CreateBackup;
var
srcFile, destFile: string;
basePath, shortPath: string;
begin
basePath:= ExpandConstant('{app}');
srcFile:= ExpandConstant(CurrentFileName);
shortPath:= srcFile;
StringChangeEx(shortPath, basePath, '', True);
destFile:= ExpandConstant('{app}\Backup') + shortPath;
ForceDirectories(ExtractFilePath(destFile));
MoveFile(PChar(srcFile), PChar(destFile));
end;


Мой код:
Скрытый текст
Код:

#define AppName "Modpack"
#define AppVer "v1.0"

[Setup]
AppName={#AppName}
AppVerName=Modpack {#AppVer}
AppVersion={#AppVer}
DefaultDirName=Data

Compression=none

OutputDir=C:\Users\vladi\Desktop
OutputBaseFilename={#AppName} {#AppVer}
InfoBeforeFile=readme.rtf                     
SetupIconFile=SetupIconFile.ico
WizardSmallImageFile=WizardSmallImageFile.bmp

DisableProgramGroupPage=yes
DisableFinishedPage=True
DisableReadyPage=True

CreateUninstallRegKey=no
Uninstallable=no

[Languages]
;Язык по умолчанию интерфейса установщика
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Messages]
SelectDirLabel3=Укажите папку с игрой

[Icons]
;Создание ярлыка на рабочем столе после успешной установки приложения
Name: "{commondesktop}\Вернуть оригинальные файлы"; IconFilename: bat.ico; Filename: "{app}\_backup\backup.bat"

[InstallDelete]
;Файлы\папки которые должны удалится при Установке приложения

[Types]
Name: full; Description: Полная установка; Flags: iscustom

[Components]
Name: mods; Description: Выберите модификации:;
Name: mods\pritsel; Description: Прицелы:;
Name: mods\pritsel\1; Description: Прицел CrosINC; Flags: exclusive
Name: mods\pritsel\2; Description: Прицел Дамоклов Меч; Flags: exclusive
Name: mods\pritsel\3; Description: Прицел White_v3.1; Flags: exclusive

Name: mods\angar; Description: Ангары:;
Name: mods\angar\1; Description: Ангар Brotherhood Sanctuary; Flags: exclusive
Name: mods\angar\2; Description: Ангар Hangar_WOT; Flags: exclusive
Name: mods\angar\3; Description: Ангар на карте Мираж; Flags: exclusive

[Files]
Source: C:\Mods\pritsel\crosinc\*; Components: mods\pritsel\1; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: C:\Mods\pritsel\damoklov-mech\*; Components: mods\pritsel\2; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: C:\Mods\pritsel\white\*; Components: mods\pritsel\3; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

Source: C:\Mods\angar\Brotherhood-Sanctuary\*; Components: mods\angar\1; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: C:\Mods\angar\Hangar_WOT\*; Components: mods\angar\2; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: C:\Mods\angar\miragg\*; Components: mods\angar\3; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

;Файлы, Оформление окон
Source: "VclStylesinno.dll"; DestDir: {app}; Flags: dontcopy
Source: "SmokeyQuartzKamri.vsf"; DestDir: {app}; Flags: dontcopy

;Файлы, Splash
Source: "isgsg.dll"; DestDir: "{tmp}"; Flags: ignoreversion dontcopy nocompression
Source: "splash.png"; DestDir: "{tmp}"; Flags: ignoreversion dontcopy nocompression

[Code
//Процедура, Оформление окон
procedure LoadVCLStyle(VClStyleFile: String); external 'LoadVCLStyleW@files:VclStylesInno.dll stdcall';
procedure UnLoadVCLStyles; external 'UnLoadVCLStyles@files:VclStylesInno.dll stdcall';

//Процедура, Splash
procedure ShowSplashScreen(p1:HWND;p2:AnsiString;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer);
external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';

//Функция, Оформление окон
function InitializeSetup(): Boolean;
begin
  ExtractTemporaryFile('SmokeyQuartzKamri.vsf');
  LoadVCLStyle(ExpandConstant('{tmp}\SmokeyQuartzKamri.vsf'));
  Result := True;
end;
procedure DeinitializeSetup();
begin
  UnLoadVCLStyles;
end;

//Функция, Splash
procedure InitializeWizard();
begin
  ExtractTemporaryFile('splash.png');
  ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}\splash.png'),1000,3000,1000,0,255,True,$FFFFFF,10);
end;



13.06.2020 в 21:08

Есть вторая идея которую довольно реально решить.
При установке, старые файлы переименовать.
А в батнике сделать наоборот, удалять новый файл, а старый переименовать обратно.
Что думаете? Как лучше?

14.06.2020 в 10:41

Нашел такой вот код, на просторах интернета.
Помогите втулить в свой код, а то у меня ошибки, то на PChar в первом случаи, то на MoveFile во втором.

При инсталляции, в "бэкап" сохраняются (перемещением) только те файлы,которые инсталлятор заменяет.
При удалении, эти же файлы восстанавливаются (тоже перемещением).
Скрытый текст
Код:

function MoveFile(const srcFile, destFile: PChar): Integer;
  external 'MoveFileA@kernel32.dll stdcall';
 
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usPostUninstall then
  begin
    MoveDir(ExpandConstant('{app}\Install_Rus\Backup\'), ExpandConstant('{app}'));
    RemoveDir(ExpandConstant('{app}\Install_Rus\Backup\'));
    RemoveDir(ExpandConstant('{app}\Install_Rus\'));
  end;
end;


Скрытый текст
Код:

procedure CreateBackup;
var
  srcFile, destFile: string;
  basePath, shortPath: string;
begin
  if IsTaskSelected('src') then
  begin
    basePath := ExpandConstant('{app}');
    srcFile := ExpandConstant(CurrentFileName);
    shortPath := srcFile;
    StringChangeEx(shortPath, basePath, '', True);
    destFile := ExpandConstant('{app}\Install_Rus\Backup') + shortPath;
    ForceDirectories(ExtractFilePath(destFile));
    MoveFile(PChar(srcFile), PChar(destFile));
  end;
end;



13.06.2020 в 21:08

Что-то вышло, с вот таким вот кодом:
Скрытый текст
Код:

//Backup
function MoveFile(const srcFile, destFile: PAnsiChar): Integer; external 'MoveFileA@kernel32.dll stdcall';

procedure CreateBackup;
var
srcFile, destFile: string;
basePath, shortPath: string;
begin
if IsTaskSelected('src') then
begin
  basePath := ExpandConstant('{app}');
    srcFile := ExpandConstant(CurrentFileName);
    shortPath := srcFile;
  StringChangeEx(shortPath, basePath, '', True);
  destFile := ExpandConstant('{app}\Backup') + shortPath;
 ForceDirectories(ExtractFilePath(destFile));
 MoveFile(PAnsiChar(srcFile), PAnsiChar(destFile));
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
 if CurUninstallStep = usPostUninstall then
begin
  MoveDir(ExpandConstant('{app}\Backup\'), ExpandConstant('{app}'));
  RemoveDir(ExpandConstant('{app}\Backup\'));
end;
end;


Что думаете?
Вроде работает

Ну и я нашел ответ на этот вопрос, и решил поделится с вами:

Моя проблема решилась. Код программы работает отлично.

Для лучшего понимания как работает и для чего нужен:
Допустим вы устанавливаете модификации или обновление на программу или игру, и вам нужно что бы старые файлы сохранились, а в последующем вернулись, если что-то пойдёт не так.
(По началу я думал создать Батник для восстановления файлов, но лучшим способом всё-таки получилось через uninstall).
При установке, в корне программы/игры, создается папка "Backup", туда же помещается наш uninstall.
В итоге при удалении "обновления" старые файлы возвращаются на своё место, новые же удаляются + папка Backup удаляется.

Так как у меня вызывало ошибки на "PChar", я уже прочитав руководство, и изменил на "PAnsiChar", в SHFileOperation.iss:
Руководство: Unicode Pascal Scripting notes: The Unicode compiler sees type 'String' as a Unicode string, and 'Char' as a Unicode character. Its 'AnsiString' type hasn't changed and still is an ANSI string. Its 'PChar' type has been renamed to 'PAnsiChar'.

Для тех кто сюда зайдёт, прикладываю файл и код, может пригодится кому-то в будущем.
Код который вы будите использовать в своем коде:
Скрытый текст
Код:

;Подключаем и выполняем указанный файл
#include "SHFileOperation.iss"

[Setup]
;Создание инсталлятора
Uninstallable=yes
;Куда поместить деинсталлятор
UninstallFilesDir={app}\Backup

[Messages]
;Изменение сообщений в установщике
ConfirmUninstall=Вы действительно ходите вернуть оригинальные файлы?
UninstalledAll=Оригинальные файлы восстановлены!

[Icons]
;Создание ярлыка на рабочем столе после успешной установки приложения
Name: "{commondesktop}\Вернуть оригинальные файлы"; IconFilename: "{app}\Backup\backup.ico"; Filename: "{app}\Backup\unins000.exe"

[Tasks]
;Если хотите, что бы спрашивалось, "Сделать Бэкап заменяемых файлов?" в установке, уберите ";" для активации функции
;Name: src; Description: Сделать Бэкап заменяемых файлов?
; + ОБЯЗАТЕЛЬНО убрать в [C0de] "//". Смотрите ниже

[_Code]
//Начало кода, Backup
function MoveFile(const srcFile, destFile: PAnsiChar): Integer; external 'MoveFileA@kernel32.dll stdcall';

procedure CreateBackup;
var
srcFile, destFile: string;
basePath, shortPath: string;
//begin //Для активации кнопки для Бэкапа убрать в начале begin "//". И в [Tasks] перед Name убрать ";"
//if IsTaskSelected('src') then //Для активации кнопки для Бэкапа убрать в начале if "//". И в [Tasks] перед Name убрать ";"
begin
  basePath := ExpandConstant('{app}');
    srcFile := ExpandConstant(CurrentFileName);
    shortPath := srcFile;
  StringChangeEx(shortPath, basePath, '', True);
  destFile := ExpandConstant('{app}\Backup') + shortPath; //Создание папки под названием "Backup" в программе. Те файлы которые будут ЗАМЕНЕНЫ отправятся в эту папку
 ForceDirectories(ExtractFilePath(destFile));
 MoveFile(PAnsiChar(srcFile), PAnsiChar(destFile));
end;
//end; //Для активации кнопки для Бэкапа убрать в начале end; "//". И в [Tasks] перед Name убрать ";"

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
 if CurUninstallStep = usPostUninstall then
begin
  MoveDir(ExpandConstant('{app}\Backup\'), ExpandConstant('{app}')); //От куда брать файлы при восстановлении бэкапа
  RemoveDir(ExpandConstant('{app}\Backup')); //При uninstall удалятся указанная папка Backup
end;
end;
//Конец кода, Backup


+ прилаживаю файл в архиве, который нужен для подключения: Файл 161699

Надеюсь я кому-то помог :happy:

1Виталий1 17-06-2020 11:14 2925319

Помогите пожалуйста как прописать два раза команду:procedure InitializeWizard();
procedure InitializeWizard();
begin
RedesignWizardForm;
end;
procedure InitializeWizard();
begin
ExtractTemporaryFile('bass.dll');
ExtractTemporaryFile('CallbackCtrl.dll');
ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('volmax.png');
ExtractTemporaryFile('volmin.png');
ExtractTemporaryFile('voldote.png')
ExtractTemporaryFile('volpb.png')
ExtractTemporaryFile('MusicButton.png');
ExtractTemporaryFile('music.mp3');

BASS_Init('{tmp}\music.mp3')
BASS_CreateMediaPlayer(WizardForm, '{tmp}\volmax.png', '{tmp}\volmin.png', '{tmp}\volpb.png', '{tmp}\voldote.png', 70, 325)
end;

procedure DeinitializeSetup();
begin
Bass_DeInit;
gdipShutdown
end;

passstrada 18-06-2020 22:53 2925497

Цитата:

Цитата 1Виталий1
Помогите пожалуйста как прописать два раза команду:procedure InitializeWizard(); »

Попробуй в конце InitializeWizard добавить
Код:

begin
RedesignWizardForm;
end
end;

Тоисть:
Скрытый текст

Код:

procedure InitializeWizard();
begin
ExtractTemporaryFile('bass.dll');
ExtractTemporaryFile('CallbackCtrl.dll');
ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('volmax.png');
ExtractTemporaryFile('volmin.png');
ExtractTemporaryFile('voldote.png')
ExtractTemporaryFile('volpb.png')
ExtractTemporaryFile('MusicButton.png');
ExtractTemporaryFile('music.mp3');

BASS_Init('{tmp}\music.mp3')
BASS_CreateMediaPlayer(WizardForm, '{tmp}\volmax.png', '{tmp}\volmin.png', '{tmp}\volpb.png', '{tmp}\voldote.png', 70, 325)
        begin
        RedesignWizardForm;
        end
end;

procedure DeinitializeSetup();
begin
Bass_DeInit;
gdipShutdown
end;


ZVSRus 19-06-2020 07:57 2925506

Код:

procedure InitializeWizard();
begin
  RedesignWizardForm;

  ExtractTemporaryFile('bass.dll');
  ExtractTemporaryFile('CallbackCtrl.dll');
  ExtractTemporaryFile('botva2.dll');
  ExtractTemporaryFile('volmax.png');
  ExtractTemporaryFile('volmin.png');
  ExtractTemporaryFile('voldote.png')
  ExtractTemporaryFile('volpb.png')
  ExtractTemporaryFile('MusicButton.png');
  ExtractTemporaryFile('music.mp3');

  BASS_Init('{tmp}\music.mp3')
  BASS_CreateMediaPlayer(WizardForm, '{tmp}\volmax.png', '{tmp}\volmin.png', '{tmp}\volpb.png', '{tmp}\voldote.png', 70, 325)
end;

procedure DeinitializeSetup();
begin
  Bass_DeInit;
  gdipShutdown
end;


Ispanets 05-07-2020 00:25 2927278

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

Tco 03 05-07-2020 13:08 2927325

Ispanets, Что именно хотите сделать? Какое дополнительное ПО? Браузер от Яндекса? Поиск от Яндекса? Или какую-нибудь другую хрень от Яндекса? ПО в самом инсталляторе или нужно скачать и потом установить?

Ispanets 05-07-2020 13:54 2927335

в лс скинул

Ispanets 06-07-2020 08:08 2927394

Да мне нужно доп по поставить в инсталятор, не могу найти специалиста по Inno Setup

habib2302 09-07-2020 20:58 2927830

Доброе время суток. Нужна помощь. Нужно получить версию программы из реестра, сравнить версию указанную в скрипте и выдать msgbox старая версия или свежая.

Udwratu2 04-08-2020 17:03 2930142

Как сделать ассоциацию файлов установить драйвер UltraISO ?

Udwratu2 04-08-2020 19:26 2930159

Root: HKCR; Subkey: ".iso"; ValueData: "{#AppName}"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""
Root: HKCR; Subkey: "{#AppName}"; ValueData: "Program {#AppName}"; Flags: uninsdeletekey; ValueType: string; ValueName: ""
Root: HKCR; Subkey: "{#AppName}\DefaultIcon"; ValueData: "{app}\{#AppExeName},0"; ValueType: string; ValueName: ""
Root: HKCR; Subkey: "{#AppName}\shell\open\command"; ValueData: """{app}\{#AppExeName}"" ""%1"""; ValueType: string; ValueName: ""

Так ли? Что с драйвером делать и как добавить пункты в контекстное меню?

pollipen 11-08-2020 07:05 2930745

Парни добавление Брандмауэр
А, если надо добавить 2 программы то как сделать?
[code][Setup]
#define AppName "My Program"
#define AppExeName "MyProg.exe"

Код:


procedure CurStepChanged(CurStep: TSetupStep); var
  RC: Integer;
  SIn, SOut: String;
    begin
    if CurStep=ssInstall then
    begin
    Exec(ExpandConstant('netsh.exe'), 'advfirewall firewall delete rule name="{#AppName}"','', SW_HIDE, ewWaitUntilTerminated, RC)
  SIn:='advfirewall firewall add rule name="{#AppName}" dir=in action=block program='+ExpandConstant('"{app}\{#AppExeName}"')+' enable=yes'; Exec('netsh',  SIn,'', SW_HIDE, ewWaitUntilTerminated, RC)
  SOut:='advfirewall firewall add rule name="{#AppName}" dir=out action=block program='+ExpandConstant('"{app}\{#AppExeName}"')+' enable=yes'; Exec('netsh', SOut,'', SW_HIDE, ewWaitUntilTerminated, RC)
end
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); var
  RC: Integer;
  begin
    if CurUninstallStep=usUninstall then
  begin
  Exec(ExpandConstant('netsh.exe'), 'advfirewall firewall delete rule name="{#AppName}"','', SW_HIDE, ewWaitUntilTerminated, RC)
end
end;


Earlex 05-09-2020 09:18 2933000

Как правильно делить и обновлять файловое содержимое без необходимости замены большинства bin-архивов по паре гигов весом? (к примеру, чтобы пользователь скачивал не весь мод, а только апдейт раздачи с новым setup.exe и bin-архивом на 100 мегабайт, который быд подходил уже к имеющимся архивам?

denisporf@vk 05-09-2020 14:43 2933012

Два вопроса.
1. Как сделать, чтобы основной файл приложение (exe) сохранялся, где положено. По умолчанию он сохраняется в корне папки Crusader Kings 3\*, вместо Crusader Kings 3\launcher\*.
2. Как у ярлыка изменить (добавить свою) иконку?

Скрытый текст

; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppId={{B6002F96-06E4-4939-9EAB-AA961EB7EF1A}
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
AppPublisher=My Company, Inc.
AppPublisherURL=http://www.example.com/
AppSupportURL=http://www.example.com/
AppUpdatesURL=http://www.example.com/
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
AllowNoIcons=yes
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1

[Files]
Source: "e:\Test\Crusader Kings 3\launcher\"; DestDir: "{app}"; Flags: ignoreversion
Source: "E:\Test\Crusader Kings 3\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов

[Icons]
Name: "{group}\My Program"; Filename: "{app}\"
Name: "{group}\{cm:ProgramOnTheWeb,My Program}"; Filename: "http://www.example.com/"
Name: "{group}\{cm:UninstallProgram,My Program}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\My Program"; Filename: "{app}\"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\My Program"; Filename: "{app}\"; Tasks: quicklaunchicon

[Run]
Filename: "{app}\"; Description: "{cm:LaunchProgram,My Program}"; Flags: shellexec postinstall skipifsilent

boss911 05-09-2020 19:42 2933026

Цитата:

Цитата denisporf@vk
Два вопроса. »

Код:

[Setup]
OutputDir=D:\My setup

Код:

[Icons]
Name: {group}\{cm:UninstallProgram,}; Filename: {uninstallexe}; WorkingDir: {app}; IconFilename: {sys}\shell32.dll; IconIndex: 31


Nordek 08-09-2020 18:44 2933369

Цитата:

Цитата denisporf@vk
1. Как сделать, чтобы основной файл приложение (exe) сохранялся, где положено. По умолчанию он сохраняется в корне папки Crusader Kings 3\*, вместо Crusader Kings 3\launcher\*. »

Цитата:

Цитата denisporf@vk
Source: "e:\Test\Crusader Kings 3\launcher\"; DestDir: "{app}"; Flags: ignoreversion »

На сколько я понимаю в скрипте это назначен каталог откуда попадает в инсталлятор исполняемый файл - если так, то:
это
Код:

Source: "e:\Test\Crusader Kings 3\launcher\"; DestDir: "{app}"; Flags: ignoreversion
лишняя запись в скрипте т.к у вас уже есть запись:
Код:

Source: "E:\Test\Crusader Kings 3\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
- т.к. recursesubdirs - обрабатывает подкаталоги, createallsubdirs - создаёт все подкаталоги.
Если в e:\Test\Crusader Kings 3\ содержится папка launcher, и соблюдены все условия - Не вижу препятствий, т.к. на выходе при установке будет такая же структура, которая попала в инсталлятор.

Попало например в инсталлятор Crusader Kings 3\* - В инсталляторе будет структура вида:
Код:

\
\bin\base1.img
\bin\base2.img
\bin\base3.img
\launcher\start.exe
\launcher\component1.dll
\launcher\component2.dll
\launcher\component3.dll

На выходе DestDir: "{app}" получите:
Код:

MyApp\
MyApp\bin\base1.img
MyApp\bin\base2.img
MyApp\bin\base3.img
MyApp\launcher\start.exe
MyApp\launcher\component1.dll
MyApp\launcher\component2.dll
MyApp\launcher\component3.dll


Также для ярлыков и задач укажите распололожение к файлу для выполнения, например вместо этого:
Код:

[Icons]
Name: {group}\My Program; Filename: {app}\
Name: {commondesktop}\My Program; Filename: {app}\; Tasks: desktopicon
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\My Program; Filename: {app}\; Tasks: quicklaunchicon

на это:
Код:

[Icons]
Name: {group}\My Program; Filename: {app}\launcher\start.exe
Name: {commondesktop}\My Program; Filename: {app}\launcher\start.exe; Tasks: desktopicon
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\My Program; Filename: {app}\launcher\start.exe; Tasks: quicklaunchicon


Не забудьте задать расположение к файлу для выполнения после установки:
Код:

[Run]
Filename: {app}\launcher\start.exe; Description: {cm:LaunchProgram,My Program}; Flags: shellexec postinstall skipifsilent

P.S. start.exe указан в качестве примера, замените на имя вашего исполняемого файла.


В другом случае вам предётся отдельно добавлять исполняемый файл, например:
Код:

Source: e:\Test\Crusader Kings 3\launcher\start.exe; DestDir: {app}\launcher; Flags: ignoreversion

Earlex 09-09-2020 17:51 2933496

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

Имеется ini файл, который принадлежит нескольким компонентами, первый влияет на множитель высоты, вторые два изменяют цвет.

Код:

[settings]
height2x = 0 // 1 or 2
color = black // black or white

Т.е. имеется 4 версии файла - по одному с разными цветами + по одному такому же со включенным множителем высоты.


Как есть:



Как хотелось бы


Наверное надо писать условие, но я в паскале не бум-бум.

Qunever 09-09-2020 18:35 2933498

Код:

[Setup]
AppName=UltraISO
AppVerName=UltraISO Premium V9.73
AppId=UltraISO
AppVersion=9.73
AppPublisher=EZB Systems, Inc.
DefaultDirName={pf32}\UltraISO
DefaultGroupName=UltraISO
UninstallDisplayIcon={app}\UltraISO.exe
OutputBaseFilename=UISO97~1.EXE
Compression=lzma2
DisableDirPage=auto
DisableProgramGroupPage=auto
LicenseFile=embedded\License.txt
WizardImageFile=embedded\WizardImage0.bmp
WizardSmallImageFile=embedded\WizardSmallImage0.bmp

[Files]
Source: "{app}\UltraISO.exe"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: overwritereadonly ignoreversion
Source: "{app}\isoshell.dll"; DestDir: "{app}"; Check: "NotX64"; MinVersion: 0.0,5.0; Flags: regserver noregerror onlyifdoesntexist 32bit
Source: "{app}\isoshl64.dll"; DestDir: "{app}"; Check: "IsX64"; MinVersion: 0.0,5.0; Flags: regserver noregerror onlyifdoesntexist 64bit
Source: "{app}\drivers\ISODrive.sys"; DestDir: "{app}\drivers"; Tasks: isodrive; Check: "IsWin2k"; MinVersion: 0.0,5.0; Flags: onlyifdoesntexist ignoreversion
Source: "{app}\drivers\ISODrv64.sys"; DestDir: "{app}\drivers"; Tasks: isodrive; Check: "IsWin2k"; MinVersion: 0.0,5.0; Flags: onlyifdoesntexist ignoreversion
Source: "{app}\drivers\IsoCmd.exe"; DestDir: "{app}\drivers"; Tasks: isodrive; Check: "IsWin2k"; MinVersion: 0.0,5.0; Flags: overwritereadonly ignoreversion
Source: "{app}\drivers\bootpart.sys"; DestDir: "{app}\drivers"; Check: "IsWin2k"; MinVersion: 0.0,5.0; Flags: overwritereadonly ignoreversion
Source: "{app}\drivers\bootpt64.sys"; DestDir: "{app}\drivers"; Check: "IsWin2k"; MinVersion: 0.0,5.0; Flags: overwritereadonly ignoreversion
Source: "{app}\drivers\bootpart.exe"; DestDir: "{app}\drivers"; Check: "IsWin2k"; MinVersion: 0.0,5.0; Flags: overwritereadonly ignoreversion
Source: "{cf32}\EZB Systems\lame_enc.dll"; DestDir: "{cf32}\EZB Systems"; MinVersion: 0.0,5.0; Flags: overwritereadonly ignoreversion
Source: "{app}\ultraiso.chm"; DestDir: "{app}"; MinVersion: 0.0,5.0;
Source: "{app}\License.txt"; DestDir: "{app}"; MinVersion: 0.0,5.0;
Source: "{app}\Readme.txt"; DestDir: "{app}"; MinVersion: 0.0,5.0;
Source: "{app}\History.txt"; DestDir: "{app}"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_de.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_fr.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_it.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_es.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_pt.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_nl.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_se.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_pl.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_cz.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_hu.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_ru.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_ua.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_bg.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_tr.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_kr.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_gr.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_yu.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_by.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_he.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_br.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_dk.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_no.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_lv.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_ar.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_si.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_cn.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_tw.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_et.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_sk.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_ct.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_fi.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_mk.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_hr.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_ro.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_lt.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_sr.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_ir.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_jp.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_vn.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_my.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;
Source: "{app}\lang\lang_id.dll"; DestDir: "{app}\lang"; MinVersion: 0.0,5.0;

[Dirs]
Name: "{userdocs}\My ISO Files";
Name: "{app}\backup";

[Registry]
Root: HKLM; Subkey: "Software\EasyBoot Systems"; MinVersion: 0.0,5.0; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: "Software\EasyBoot Systems\UltraISO"; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\EasyBoot Systems"; MinVersion: 0.0,5.0; Flags: uninsdeletekeyifempty
Root: HKCU; Subkey: "Software\EasyBoot Systems\UltraISO"; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKLM; Subkey: "Software\EasyBoot Systems\UltraISO\5.0"; ValueType: String; ValueData: "{app}"; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\EasyBoot Systems\UltraISO\5.0"; ValueType: String; ValueData: "{app}"; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKLM; Subkey: "Software\EasyBoot Systems\UltraISO\5.0"; ValueName: "Shared"; ValueType: String; ValueData: "{cf32}\EZB Systems"; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\EasyBoot Systems\UltraISO\5.0"; ValueName: "Shared"; ValueType: String; ValueData: "{cf32}\EZB Systems"; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\EasyBoot Systems\UltraISO\5.0"; ValueName: "XPBurn"; ValueType: String; ValueData: "0"; MinVersion: 0.0,5.0; Flags: createvalueifdoesntexist uninsdeletekey
Root: HKCU; Subkey: "Software\EasyBoot Systems\UltraISO\5.0"; ValueName: "JolietFirst"; ValueType: String; ValueData: "0"; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\EasyBoot Systems\UltraISO\5.0"; ValueName: "ISOFolder"; ValueType: String; ValueData: "{userdocs}\My ISO Files"; Check: "DirExists(ExpandConstant('{userdocs}'))"; MinVersion: 0.0,5.0; Flags: createvalueifdoesntexist uninsdeletekey
Root: HKCU; Subkey: "Software\EasyBoot Systems\UltraISO\5.0"; ValueName: "UseSkins"; ValueType: String; ValueData: "1"; MinVersion: 0.0,5.0; Flags: createvalueifdoesntexist uninsdeletekey
Root: HKCU; Subkey: "Software\EasyBoot Systems\UltraISO\5.0"; ValueName: "SoundEffect"; ValueType: String; ValueData: "1"; MinVersion: 0.0,5.0; Flags: createvalueifdoesntexist uninsdeletekey
Root: HKCU; Subkey: "Software\EasyBoot Systems\UltraISO\5.0"; ValueName: "Language"; ValueType: String; ValueData: "1033"; Languages: "en"; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKLM; Subkey: "Software\EasyBoot Systems\UltraISO\5.0"; ValueName: "Install"; ValueType: String; ValueData: "1"; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKCR; Subkey: ".iso"; ValueType: String; ValueData: "UltraISO"; Tasks: associate; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKCR; Subkey: ".isz"; ValueType: String; ValueData: "UltraISO"; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKCR; Subkey: ".ui"; ValueType: String; ValueData: "UltraISO"; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKCR; Subkey: "UltraISO"; ValueType: String; ValueData: "UltraISO File"; Tasks: associate; Languages: "en"; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKCR; Subkey: "UltraISO\shell\open\command"; ValueType: String; ValueData: """{app}\UltraISO.exe"" ""%1"""; Tasks: associate; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKCR; Subkey: ".bin"; ValueType: String; ValueData: "binimage"; Tasks: associate; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKCR; Subkey: "binimage"; ValueType: String; ValueData: "BIN File"; Tasks: associate; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKCR; Subkey: "binimage\DefaultIcon"; ValueType: String; ValueData: """{app}\UltraISO.exe"",0"; Tasks: associate; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKCR; Subkey: "binimage\shell\Convert to ISO\command"; ValueType: String; ValueData: """{app}\UltraISO.exe"" -bin2iso ""%1"""; Tasks: associate; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKCR; Subkey: "binimage\shell\open\command"; ValueType: String; ValueData: """{app}\UltraISO.exe"" ""%1"""; Tasks: associate; MinVersion: 0.0,5.0; Flags: uninsdeletekey
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\ISODrive\Parameters"; ValueName: "AutoMount"; ValueType: Dword; ValueData: "$1"; Tasks: isodrive; Check: "IsWin2k"; MinVersion: 0.0,5.0; Flags: uninsdeletekey

[Run]
Filename: "{app}\Readme.txt"; Description: "View the README file"; Languages: "en"; MinVersion: 0.0,5.0; Flags: shellexec postinstall unchecked skipifsilent nowait
Filename: "{app}\UltraISO.exe"; Description: "Launch UltraISO"; Languages: "en"; MinVersion: 0.0,5.0; Flags: postinstall skipifsilent nowait
Filename: "{app}\drivers\isocmd.exe"; Parameters: "-i"; Tasks: isodrive; Check: "IsWin2k"; MinVersion: 0.0,5.0;

[UninstallRun]
Filename: "{app}\drivers\isocmd.exe"; Parameters: "-r"; Tasks: isodrive; Check: "IsWin2k"; MinVersion: 0.0,5.0;

[Icons]
Name: "{group}\UltraISO"; Filename: "{app}\UltraISO.exe"; WorkingDir: "{app}"; MinVersion: 0.0,5.0;
Name: "{group}\UltraISO Help"; Filename: "{app}\ultraiso.chm"; MinVersion: 0.0,5.0;
Name: "{group}\UltraISO Online Order"; Filename: "http://www.ezbsystems.com/ultraiso/order.htm"; MinVersion: 0.0,5.0;
Name: "{group}\UltraISO Web Site"; Filename: "http://www.ezbsystems.com/index.php"; MinVersion: 0.0,5.0;
Name: "{group}\UltraISO Readme"; Filename: "{app}\Readme.txt"; MinVersion: 0.0,5.0;
Name: "{group}\UltraISO Revision History"; Filename: "{app}\History.txt"; MinVersion: 0.0,5.0;
Name: "{group}\Uninstall UltraISO"; Filename: "{uninstallexe}"; MinVersion: 0.0,5.0;
Name: "{commondesktop}\UltraISO"; Filename: "{app}\UltraISO.exe"; WorkingDir: "{app}"; Tasks: desktopicon; MinVersion: 0.0,5.0;

[Tasks]
Name: "desktopicon"; Description: "Create a &desktop icon"; Languages: "en"; MinVersion: 0.0,5.0;
Name: "associate"; Description: "&Associate UltraISO with the .iso file extension"; Languages: "en"; MinVersion: 0.0,5.0;
Name: "isodrive"; Description: "&Setup ISO CD/DVD emulator (ISODrive)"; Languages: "en"; MinVersion: 0.0,5.0;

[UninstallDelete]
Type: files; Name: "{sys}\drivers\isodrive.sys";
Type: files; Name: "{sys}\drivers\ISODrv64.sys";

[CustomMessages]
en.NameAndVersion=%1 version %2
en.AdditionalIcons=Additional shortcuts:
en.CreateDesktopIcon=Create a &desktop shortcut
en.CreateQuickLaunchIcon=Create a &Quick Launch shortcut
en.ProgramOnTheWeb=%1 on the Web
en.UninstallProgram=Uninstall %1
en.LaunchProgram=Launch %1
en.AssocFileExtension=&Associate %1 with the %2 file extension
en.AssocingFileExtension=Associating %1 with the %2 file extension...

[Languages]
Name: "en"; MessagesFile: "embedded\en.isl";

Помогите пожалуйста исправить ошибки, скрипт не компилируется.
Я не могу понять в чем именно причина...

pzadrotov@vk 11-09-2020 00:51 2933641

Всем привет, ответьте пожалуйста на вопрос:
Имеется рабочий скрипт, после успешной работы, в список "Программы и компоненты" в Win10, добавляется установленная программа.
Мне не нужно чтоб туда что-то добавлялось. Ни туда, ни в реестр, никуда. Чтоб ничего не создвалось никакого uninstall.exe, никаких папок вообще. Мой скрипт, просто подцепляет по выбору файлы типа setup.exe, которые сами устанавливают все нужное и вносят в ОС все изменения. Что нужно прописать в скрипте и где? Напишите пожалуйста нужные строчки кода.

boss911 11-09-2020 08:39 2933656

Цитата:

Цитата pzadrotov@vk
Чтоб ничего не создвалось никакого uninstall.exe »

Код:

[Setup]
Uninstallable=no


pzadrotov@vk 11-09-2020 10:05 2933662

del

pzadrotov@vk 11-09-2020 11:46 2933678

Спасибо, разобрался и добавил вашу строку. Появились еще вопросы:
Есть готовый скрипт(инсталятор), он сперва запускает без диалогов главный файл - setup.exe, потом на выбор предлагает установить доп. компоненты(тоже отдельные сетапы). Все установочные файлы находятся в папках, рядом с инсталятором. То есть сам инсталятор пустой, и без файлов ничего не установит. Я не знаю, как мне запаковать эти установочные файлы в сам инсталятор. Чтобы при запуске, он распаковывал их во временную папку, а после окончания работы инсталятора, удалял их. Подскажите пожалуйста как можно так сделать? Вот скрипт:
Скрытый текст
Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "AOE"
#define MyAppVersion ""

[Setup]
; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppName={#MyAppName}
AppVerName={#MyAppName} {#MyAppVersion}
CreateAppDir=no
; Uncomment the following line to run in non administrative install mode (install for current user only.)
;PrivilegesRequired=lowest
OutputDir=C:\Users\AspireM3400\Desktop
OutputBaseFilename=AOE Setup
Compression=lzma
SolidCompression=yes
WizardStyle=modern
Uninstallable=no

[code]
procedure InitializeWizard();
begin
WizardForm.FilenameLabel.Hide //Прячем извлекаемые файлы
WizardForm.ProgressGauge.Hide //Прячем прогресс-бар
end;

function InitializeSetup(): boolean;
var
  ResultCode: integer;
begin
    if Exec(ExpandConstant('{src}\AOE1\RU\setup.exe'), '', '', SW_SHOW,
      ewWaitUntilTerminated, ResultCode) then
  begin
  end
  else begin
  end;
  Result := True;
end;

[Run]
Filename: "{src}\AOE1ROR\RU\setup.exe"; Tasks: "AOE_RU2";
Filename: "{src}\UPatch Setup.exe"; Tasks: "AOE_UP";

[Tasks]
Name: "AOE_RU2"; Description: "AOE(RU)";
Name: "AOE_UP"; Description: "UPatch";

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"


boss911 12-09-2020 01:55 2933765

Цитата:

Цитата pzadrotov@vk
Все установочные файлы находятся в папках, рядом с инсталятором. »

Все установочные файлы с папками, что рядом с инсталлятором, которые нужно упаковать, положите, например, в одну папку "AOE_Distr".

Цитата:

Цитата pzadrotov@vk
Чтобы при запуске, он распаковывал их во временную папку, а после окончания работы инсталятора, удалял их. »

Код:

[Setup]
Compression=lzma2/ultra64
InternalCompressLevel=ultra64
SolidCompression=yes

[Files]
Source: AOE_Distr\*; DestDir: {tmp}; Flags: recursesubdirs createallsubdirs

И везде в своем скрипте замените {src} на {tmp}.

Только учтите, в вашем скрипте отключен прогресс распаковки файлов, если на их распаковку (во временную папку) нужно время (большой объем), то визуально это будет смотреться, как будто ничего не происходит.

pzadrotov@vk 12-09-2020 12:54 2933791

Цитата:

Цитата boss911
в вашем скрипте отключен прогресс распаковки файлов »

файлы не большие, но прогресс распаковки все же включил, спасибо. Но отключил полностью сжатие, так как на выходе получается практически одинаковый размер инсталлятора. А время на распаковку существенное, по сравнению с копированием.
Спасибо за подсказку, все получилось, все устанавливается. Но есть маленькое НО. Код, который должен запускать в самом начале главный сетап, почему то не срабатывает. Пришлось его закомментировать и добавить запуск в секцию [run]. В общем вот такой скрипт получился:
Скрытый текст
Код:

#define MyAppName "AOE"
#define MyAppVersion "AOE"

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppVersion}
CreateAppDir=no
OutputDir=C:\Users\AspireM3400\Desktop
OutputBaseFilename=AOE Setup
Compression=none
;SolidCompression=yes
WizardStyle=modern
Uninstallable=no

[code]
procedure InitializeWizard();
begin
//WizardForm.FilenameLabel.Hide //Прячем извлекаемые файлы
WizardForm.ProgressGauge.Hide //Прячем прогресс-бар
end;

//function InitializeSetup(): boolean;
//var
//  ResultCode: integer;
//begin
//    if Exec(ExpandConstant('{tmp}\RU\setup.exe'), '', '', SW_SHOW,
//      ewWaitUntilTerminated, ResultCode) then
//  begin
//  end
//  else begin
//  end;
//  Result := True;
//end;

[Files]
Source: "C:\Users\AspireM3400\Desktop\AOE1\*"; DestDir: "{tmp}"; Flags: ignoreversion recursesubdirs createallsubdirs;

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Run]
Filename: "{tmp}\RU\setup.exe";
Filename: "{tmp}\RUROR\setup.exe"; Tasks: "AOE_ROR";
Filename: "{tmp}\UPatch HD Setup.exe"; Tasks: "AOE_UP";

[Tasks]
Name: "AOE_ROR"; Description: "AOE ROR(RU)";
 Name: "AOE_UP"; Description: "UPatch";


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

Earlex 12-09-2020 15:30 2933797

Можно ли делать DiskSpanning для отдельных файлов, т.е. паковать в .bin не обязательные для скачивания конкретные файлы типа озвучки?

pzadrotov@vk 12-09-2020 22:09 2933818

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

ZVSRus 14-09-2020 13:27 2933996

pzadrotov@vk
Цитата:

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

Цитата:

По умолчанию при установке создается унинстал, который удаляет приложение, но не удаляет "мусор", который оставляет приложение в процессе работы и саму папку.
Деинсталлятор удаляет только то что прописано в скрипте. Но так-как почти каждая программа при первом запуске создает в разных директориях свои папки для работы, то для таких целей (удаление мусора как вы выразились) в Inno Setup есть секция [UninstallDelete],
в которой прописываются все "мусорные" папки с адресами к ним.

Как то так:

[UninstallDelete]

Type: files; Name: "{win}\MYPROG.INI" = Параметр Name указывает имя отдельного файла или маску
Type: filesandordirs; Name: ""{pf}\4KDownload\4kvideodownloader"; = Функции те же, что и у files за исключением, что также может задавать имя папки, в этом случае удаляются все ее файлы и подпапки.
Type: dirifempty; Name: "{localappdata}\4kdownload.com" = При использовании этого типа параметр Name должен задавать папку, но не содержать масок. Папка будет удалена только если она пустая.

Цитата:

Как сделать, чтоб при удалении был запрос типа: удалять все полностью, или оставить папку с мусором?
В этом случае вам придется создать свою страницу перед страницей с прогресс баром деинсталлятора, и разместить на ней свои компоненты (чекбоксы, радиобатоны, лейблы), чтобы у пользователя был выбор что делать.
И второй вариант разместить свои компоненты непосредственно на странице с прогресс баром деинсталлятора, в данном случае удалятся будет в реальном времени, то есть только чекбокс отметили сразу все удалилось. При нажатии "Далее" начнется удаление основной папки программы.

pzadrotov@vk 15-09-2020 12:34 2934109

ZVSRus, boss911, спасибо, очень помогли, все работает и удаляется правильно.
Возможно ли еще как то убрать последнее окно оповещения "Завершение установки" с кнопочкой <Завершить>? Потому что последний файл инсталятора, после установки автоматически запускает приложение, которое порой(не всегда), закрывает окно "Завершение установки". В итоге это окно продолжает висеть, на заднем фоне.
Постарался расписать подробно. :unsure:


Да, еще вот что. Я сделал запись в реестр, чтоб инсталятор делал проверку на наличие установленной программы и в успешном случае, не устанавливал повторно.
Писал по стандарту Root: HKLM.... и далеее, но посмотрел в реестр, почему то запись идетне в HKEY_LOCAL_MACHINE, а в HKEY_CURRENT_USER. Можете сказать почему так?

Flix 15-09-2020 13:28 2934122

Цитата:

Цитата pzadrotov@vk
Возможно ли еще как то убрать последнее окно оповещения "Завершение установки" с кнопочкой <Завершить>? »

Код:

[Setup]
DisableFinishedPage=yes

Цитата:

Я сделал запись в реестр, чтоб инсталятор делал проверку на наличие установленной программы и в успешном случае, не устанавливал повторно.
Писал по стандарту Root: HKLM.... и далеее, но посмотрел в реестр, почему то запись идетне в HKEY_LOCAL_MACHINE, а в HKEY_CURRENT_USER. Можете сказать почему так?
Проверьте внимательно свой сценарий ещё раз, что и куда вы пишете. Сам инсталлятор не занимается самодеятельностью.

pzadrotov@vk 15-09-2020 14:27 2934127

За "завершение установки", спасибо, не показывается больше.
Цитата:

Цитата Flix
Проверьте внимательно свой сценарий ещё раз, что и куда вы пишете. Сам инсталлятор не занимается самодеятельностью. »

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

Более того, я сделал проверку на наличие установки
Код:

[code]
function InitializeSetup(): Boolean;
begin
  Result:= True;
  if RegValueExists(HKLM, 'SOFTWARE\Microsoft\Games\Age of Empires\1.00', 'CDPath') then begin
    MsgBox('Age of Empires уже установлена! Установка будет прекращена', mbConfirmation, MB_OK);
    Result:= False;
  end;
end;

И что интересно, проверка работает правильно, но в реестре по данной ветке нет записей, зато есть в HKEY_CURRENT_USER по этому же пути.

ZVSRus 15-09-2020 15:08 2934131

pzadrotov@vk
Цитата:

Я сделал запись в реестр, чтоб инсталятор делал проверку на наличие установленной программы и в успешном случае, не устанавливал повторно.
Ну чтобы вам что-то подсказать, нужно видеть что вы пишете и где, хотя бы кусок скрипта.
Второе, может сделали запись не в реестр, а в скрипт прописали какой то код чтобы шла проверка на наличие записей в реестре, и далее устанавливать программу или нет.
И еще, если вы доводите до ума тот скрипт что выкладывали выше (пост #676) где у вас в секции [RUN] идет запуск 3 отдельных сетапников, а сам ваш инстал пустой, как вы описывали ранее, тогда просто нужно смотреть скрипт, что, куда и как.

boss911 15-09-2020 15:11 2934133

Цитата:

Цитата pzadrotov@vk
Писал по стандарту Root: HKLM.... и далеее »

Покажите эту строку из [Registry] полностью. Если установка проводится на x64 OS, реестр смотрите и в \SOFTWARE\Wow6432Node.

pzadrotov@vk 15-09-2020 15:33 2934134

Цитата boss911:
смотрите и в \SOFTWARE\Wow6432Node »
Точно, так и есть, спасибо, помогли разобраться. Вот полная строка:
Код:

Root: HKLM; Subkey: "SOFTWARE\Microsoft\Games\Age of Empires\1.00"; ValueName: "CDPath"; ValueType: String; ValueData: "{src}"; Flags: uninsdeletekey

pzadrotov@vk 15-09-2020 16:00 2934139

И еще, по поводу HKEY_CURRENT_USER, чтоб вы не удивлялись почему там появляется запись в реестре, туда тоже прописывается куча чего то:
Скрытый текст
Код:

[Registry]
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; MinVersion: 0,5.01; Flags: uninsdeletekey
Root: HKCU; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; MinVersion: 0,5.01; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "Res"; ValueType: String; ValueData: "Default (1024x768)"; Check: "isRes0"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "Res"; ValueType: String; ValueData: "1024x600"; Check: "isRes1"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "Res"; ValueType: String; ValueData: "1280x720"; Check: "isRes2"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "Res"; ValueType: String; ValueData: "1280x800"; Check: "isRes3"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "Res"; ValueType: String; ValueData: "1280x1024"; Check: "isRes4"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "Res"; ValueType: String; ValueData: "1360x768"; Check: "isRes5"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "Res"; ValueType: String; ValueData: "1366x768"; Check: "isRes6"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "Res"; ValueType: String; ValueData: "1440x900"; Check: "isRes7"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "Res"; ValueType: String; ValueData: "1600x900"; Check: "isRes8"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "Res"; ValueType: String; ValueData: "1680x1050"; Check: "isRes9"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "Res"; ValueType: String; ValueData: "1920x1080"; Check: "isRes10"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "Res"; ValueType: String; ValueData: "1920x1200"; Check: "isRes11"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "Res"; ValueType: String; ValueData: "2560x1440"; Check: "isRes12"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "ResNum"; ValueType: Dword; ValueData: "$0"; Check: "isRes0"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "ResNum"; ValueType: Dword; ValueData: "$1"; Check: "isRes1"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "ResNum"; ValueType: Dword; ValueData: "$2"; Check: "isRes2"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "ResNum"; ValueType: Dword; ValueData: "$3"; Check: "isRes3"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "ResNum"; ValueType: Dword; ValueData: "$4"; Check: "isRes4"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "ResNum"; ValueType: Dword; ValueData: "$5"; Check: "isRes5"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "ResNum"; ValueType: Dword; ValueData: "$6"; Check: "isRes6"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "ResNum"; ValueType: Dword; ValueData: "$7"; Check: "isRes7"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "ResNum"; ValueType: Dword; ValueData: "$8"; Check: "isRes8"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "ResNum"; ValueType: Dword; ValueData: "$9"; Check: "isRes9"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "ResNum"; ValueType: Dword; ValueData: "$A"; Check: "isRes10"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "ResNum"; ValueType: Dword; ValueData: "$B"; Check: "isRes11"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "ResNum"; ValueType: Dword; ValueData: "$C"; Check: "isRes12"; MinVersion: 0,5.01;
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "Upatch Size"; ValueType: Dword; ValueData: "$400"; Check: "isRes0"; MinVersion: 0,5.01; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "Upatch Size"; ValueType: Dword; ValueData: "$400"; Check: "isRes1"; MinVersion: 0,5.01; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "Upatch Size"; ValueType: Dword; ValueData: "$500"; Check: "isRes2"; MinVersion: 0,5.01; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "Upatch Size"; ValueType: Dword; ValueData: "$500"; Check: "isRes3"; MinVersion: 0,5.01; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "Upatch Size"; ValueType: Dword; ValueData: "$500"; Check: "isRes4"; MinVersion: 0,5.01; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "Upatch Size"; ValueType: Dword; ValueData: "$550"; Check: "isRes5"; MinVersion: 0,5.01; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "Upatch Size"; ValueType: Dword; ValueData: "$556"; Check: "isRes6"; MinVersion: 0,5.01; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "Upatch Size"; ValueType: Dword; ValueData: "$5A0"; Check: "isRes7"; MinVersion: 0,5.01; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "Upatch Size"; ValueType: Dword; ValueData: "$640"; Check: "isRes8"; MinVersion: 0,5.01; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "Upatch Size"; ValueType: Dword; ValueData: "$690"; Check: "isRes9"; MinVersion: 0,5.01; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "Upatch Size"; ValueType: Dword; ValueData: "$780"; Check: "isRes10"; MinVersion: 0,5.01; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "Upatch Size"; ValueType: Dword; ValueData: "$780"; Check: "isRes11"; MinVersion: 0,5.01; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "Upatch Size"; ValueType: Dword; ValueData: "$A00"; Check: "isRes12"; MinVersion: 0,5.01; Flags: uninsdeletevalue
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "Ver"; ValueType: Dword; ValueData: "$2AFC"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "Wnd"; ValueType: Dword; ValueData: "$0"; MinVersion: 0,5.01; Flags: createvalueifdoesntexist
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "EditorEnh"; ValueType: Dword; ValueData: "$0"; MinVersion: 0,5.01; Flags: createvalueifdoesntexist
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "EnableHT"; ValueType: Dword; ValueData: "$0"; MinVersion: 0,5.01; Flags: createvalueifdoesntexist
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "EnableHU"; ValueType: Dword; ValueData: "$0"; MinVersion: 0,5.01; Flags: createvalueifdoesntexist
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "LangNum"; ValueType: Dword; ValueData: "$1"; Check: "isEN"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "LangNum"; ValueType: Dword; ValueData: "$2"; Check: "isDE"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "LangNum"; ValueType: Dword; ValueData: "$3"; Check: "isFR"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "LangNum"; ValueType: Dword; ValueData: "$4"; Check: "isES"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "LangNum"; ValueType: Dword; ValueData: "$5"; Check: "isIT"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "LangNum"; ValueType: Dword; ValueData: "$6"; Check: "isPT"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "LangNum"; ValueType: Dword; ValueData: "$7"; Check: "isPL"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "LangNum"; ValueType: Dword; ValueData: "$8"; Check: "isRU"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "LangNum"; ValueType: Dword; ValueData: "$9"; Check: "isCNt"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "LangNum"; ValueType: Dword; ValueData: "$A"; Check: "isCNs"; MinVersion: 0,5.01;
Root: HKCU; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "ModNameDir"; ValueType: String; ValueData: "<None>"; MinVersion: 0,5.01;
Root: HKCU; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "UseSPName"; ValueType: Dword; ValueData: "$0"; MinVersion: 0,5.01; Flags: createvalueifdoesntexist
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "ImproveRC"; ValueType: Dword; ValueData: "$1"; MinVersion: 0,5.01;
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "UP_ShowS"; ValueType: Dword; ValueData: "$0"; MinVersion: 0,5.01; Flags: createvalueifdoesntexist uninsdeletevalue
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "UP_ShowT"; ValueType: Dword; ValueData: "$0"; MinVersion: 0,5.01; Flags: createvalueifdoesntexist uninsdeletevalue
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "Path Finding"; ValueType: Dword; ValueData: "$3"; MinVersion: 0,5.01;
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "MP Path Finding"; ValueType: Dword; ValueData: "$3"; MinVersion: 0,5.01;
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "Music Volume"; ValueType: Dword; ValueData: "$0"; MinVersion: 0,5.01;
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "Sound Volume"; ValueType: Dword; ValueData: "$0"; MinVersion: 0,5.01;
Root: HKLM; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "UPatch Mouse"; ValueType: Dword; ValueData: "$0"; MinVersion: 0,5.01; Flags: createvalueifdoesntexist uninsdeletevalue
Root: HKCU; Subkey: "Software\Microsoft\Games\Age of Empires\1.00"; ValueName: "UP Scrolling"; ValueType: Dword; ValueData: "$28"; MinVersion: 0,5.01; Flags: uninsdeletevalue
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.0"; ValueName: "Zone"; MinVersion: 0,5.01; Flags: deletevalue
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "Lang"; MinVersion: 0,5.01; Flags: deletevalue
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "ShowS"; MinVersion: 0,5.01; Flags: deletevalue
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "ShowT"; MinVersion: 0,5.01; Flags: deletevalue
Root: HKCU; Subkey: "SOFTWARE\Microsoft\Microsoft Games\Age of Empires Expansion\1.1"; ValueName: "Launched"; MinVersion: 0,5.01; Flags: deletevalue
Root: HKCU; Subkey: "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"; ValueName: "{app}\EMPIRESX.EXE"; MinVersion: 0,5.01; Flags: deletevalue
Root: HKLM; Subkey: "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"; ValueName: "{app}\EMPIRESX.EXE"; MinVersion: 0,5.01; Flags: deletevalue
Root: HKLM; Subkey: "SOFTWARE\Microsoft\DirectDraw\Compatibility\Age of Empires Expansion"; MinVersion: 0,5.01; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\Microsoft\DirectDraw\Compatibility\Age of Empires Expansion"; ValueName: "Name"; ValueType: String; ValueData: "EMPIRESX.EXE"; MinVersion: 0.0,6.0;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\DirectDraw\Compatibility\Age of Empires Expansion"; ValueName: "ID"; ValueType: Binary; ValueData: "66 AD 44 38"; MinVersion: 0.0,6.0;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\DirectDraw\Compatibility\Age of Empires Expansion"; ValueName: "Flags"; ValueType: Binary; ValueData: "00 08 00 00"; MinVersion: 0.0,6.0;
Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"; ValueName: "{app}\EMPIRESX.EXE"; ValueType: String; ValueData: "~ DWM8And16BitMitigation HighDpiAware"; MinVersion: 0.0,6.02;
Root: HKLM64; Subkey: "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"; ValueName: "{app}\EMPIRESX.EXE"; ValueType: String; ValueData: "~ DWM8And16BitMitigation HighDpiAware"; Check: "IsWin64"; MinVersion: 0.0,6.02;


Otake2018 05-10-2020 17:29 2935608

Здраствуйте. Подскажите пожалуйста, как прописать в скрипте проверку MD5 определенного файла по пути "корневая папка"/dta/languagecore.pbo.dayz.bisign. Если MD5 совпало - устанавливать. Не совпало - не устанавливать и показать экран с ошибкой. С другом соорудили вот такой скрипт. Проблема в том, что даже когда ошибка показывается, установка всё равно продолжается. Помогите пожалуйста решить проблему.

Скрытый текст

[code]
Function GetInstallDir(Dir: String): String;
var
Win64: String;
begin
Dir := '';
case IsWin64 of
True: Win64 := '\Wow6432Node';
False: Win64 := '';
end;
RegQueryStringValue(HKLM, 'Software' + Win64 + '\bohemia interactive\dayz','main', Dir);
Result := Dir;
end;

[Languages]
Name: "english"; MessagesFile: "compiler:Languages\English.isl"

[Files]

Source: "D:\Дейз\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

[code]
function PrepareToInstall(var NeedsRestart: Boolean): String;
var
MD5: String;
LanguagecorepbodayzbisignDirectory: String;
MD5_NEEDED: String;

begin
LanguagecorepbodayzbisignDirectory:= WizardDirValue() + '\dta\languagecore.pbo.dayz.bisign';
MD5_NEEDED:= '472DB8D2BD38B235D9B4CCE7AF3B063B7C5A9F41';

Log('File path:' + LanguagecorepbodayzbisignDirectory);
MD5 := GetMD5OfFile(LanguagecorepbodayzbisignDirectory);
Log('MD5: ' + MD5);

if not (MD5 = Lowercase(MD5_NEEDED)) then
begin
MsgBox('Текст', mbError, mb_Ok);
end;
end;
end.

El Sanchez 07-10-2020 07:10 2935736

Цитата:

Цитата Otake2018
С другом соорудили вот такой скрипт. Проблема в том, что даже когда ошибка показывается, установка всё равно продолжается. »

Otake2018, функция PrepareToInstall должна возвращать строку, например, Result := 'Текст ошибки', MsgBox тут не нужен.

DirtyJohny 10-10-2020 18:13 2936036

Вложений: 1
Я возможно конкретно запоздал с темой.Я новичок в данной теме и напоролся на один баг,на который не смог найти исправление.Дело в скине а точнее в белой полоске.Перерыл многие сайты и гайды заметил,что даже в них эта полоска не фиксировалась,можно ли ее закрасить?Сам скин идеален.Даже пробовал замену ISSkinU.dll, не помогает. Версии Inno тоже пробовал разные, помогите,если не трудно)Исходник тоже прикреплю.

habib2302 10-10-2020 18:49 2936038

DirtyJohny, это нормальное явление. используйте vlc стили

DirtyJohny 10-10-2020 19:49 2936044

habib2302, Воу, а как можно заюзать, не подскажешь?

habib2302 10-10-2020 20:27 2936046

DirtyJohny, https://krinkels.org/threads/vcl-sty...no-setup.2349/

DirtyJohny 11-10-2020 11:45 2936085

Вложений: 1
habib2302, Огромное спасибо за наводку. Единственное,что осталось так это цвет шрифта в основном окне, как можно исправить?)Я думаю полезно будет для других оставить акутальные ссылки на компоненты VCL, потому прилагаю ссылку на Inno setup https://yadi.sk/d/aIme10_Lk0z1mQ и на последнюю версию Setup VCL Styles Inno https://github.com/RRUZ/vcl-styles-p...es/tag/1.5.4.1

habib2302 11-10-2020 12:25 2936089

DirtyJohny, для каждого элемента надо указывать цвет
Код:

procedure InitializeWizard();
begin
  with WizardForm.SelectDirLabel do
  begin
    Font.Color := clGreen;
    ParentFont := False;
  end;
end;


passstrada 12-10-2020 16:56 2936214

Помогите:
1. Скопировать папку с файлами (+ скрытые) в папку C:\Users\Users\Dropbox (не знаю какая константа)
2. В конце установки запустить dropbox_offline.exe с ключами /S /SP- (правильно ли указано?)

[Files]
Source: "C:\Users\vladi\Desktop\Dudonchik\fold\*"; DestDir: "{USERPROFILE?}"; Flags: recursesubdirs
Source: "C:\Users\vladi\Desktop\Dudonchik\dropbox_offline.exe"; DestDir: "{tmp}\Dropbox\";

[Run]
Filename: "{tmp}\Dropbox\dropbox_offline.exe"; Parameters: "/S /SP-"

habib2302 12-10-2020 17:00 2936215

Цитата:

Цитата passstrada
1. Скопировать папку с файлами (+ скрытые) в папку C:\Users\Users\Dropbox (не знаю какая константа) »

В Dropbox можно изменить путь к папке. И вместо {USERPROFILE} лучше найти ветку в реестре и параметр где указывается путь. Считать пути из реестра и копировать.
Цитата:

Цитата passstrada
2. В конце установки запустить dropbox_offline.exe с ключами /S /SP- (правильно ли указано?) »

Да. Правильно

passstrada 12-10-2020 17:20 2936218

Вложений: 1
habib2302, у меня установка должна быть так:
Я пришел к такому выводу, после того, как увидел что после установки Dropbox. В папке синхронизации создается файл с параметрами конфигурации. Я ее скопировал.
И если просто создать папку Dropbox, то после установки, Dropbox скажет, что он захочет переименовать ее. А с этими параметрами, просто останется в ней.
Тоисть с этими параметрами сразу начнется синхронизация после установки Dropbox (ну, после входа конечно же ж)
Поэтому:
Скопировать папку Dropbox с параметрами конфигурации, что бы сразу после установки Dropbox он их подцепил, и после входа в аккаунт сразу начал синхронизацию.
Так что мне нужно сначала копирование папки, со всем содержимым (и скрытыми файлами), а после выполняется установка Dropbox.
Но я не знаю какая константа пути C:\Users\Users\Dropbox, разве USERPROFILE ? У меня ошибка, а в документации не нашел правильной константы, помогите.

Последовательность будет такая:
1. Копирование файлов для последующей синхронизации.
2. Установка Дропбокса.
3. Конец.

*файл с конфигурацией dropbox прикреплю, для наглядности

habib2302 12-10-2020 17:52 2936223

Цитата:

Цитата passstrada
{USERPROFILE?} »

вместо {USERPROFILE} надо вписать %USERPROFILE%

passstrada 12-10-2020 18:34 2936226

Цитата:

Цитата habib2302
вместо {USERPROFILE} надо вписать %USERPROFILE% »

если быть точнее - {%USERPROFILE}, наверное что-то в новых версиях подправили

habib2302 12-10-2020 18:47 2936227

passstrada, в новой версии нет такой константы,а эта константа %USERPROFILE% виндовая. Для инно используйте {sd}\Users\{username}

Iska 12-10-2020 19:06 2936230

Цитата:

Цитата habib2302
…используйте {sd}\Users\{username} »

habib2302, обломится, ежели кто восхочет установить на XP. И на любой версии — не факт, что имя пользователя тождественно имени каталога его профиля.

habib2302 12-10-2020 19:18 2936232

Iska, понятно, но можно указать мин и мак версию или использовать эту константу %USERPROFILE%

Nordek 12-10-2020 23:22 2936253

Цитата:

Цитата passstrada
В папке синхронизации создается файл с параметрами конфигурации. »

Что-то никаких параметров там не видел.

Цитата:

Цитата passstrada
разве USERPROFILE ? »

А почему нет?
Код:

{%USERPROFILE}
Вы хотя бы справку читаете!?
Откройте справку из первого сообщения и почитайте про Константы, даже на русском есть.

P.S. К слову. Ещё ютуберы жалуются на линуксоидов, что они такие злые, и почему на LORе новичков тролят. Вы даже не удосуживаетесь справку открыть (тем более на русском), так ещё на "простецкой" Windows.

VLADEV 12-10-2020 23:57 2936256

Здравствуйте опять.
Помогите расставить кавычки в параметрах запуска. Всю голову сломал.

Оригинал запуска файла с параметрами.
Код:

sqlite3.exe local.ssdb "SELECT Path from Locations where LocationID == (SELECT Data from Misc where Code == 'DefaultLocation') and Trim(Path) != '' and Trim(RefName) != '';" > 1.log
Скрипт который не работает (((
Код:

[Run]
Filename: "{commonappdata}\sqlite3.exe"; Parameters: """local.ssdb "SELECT Path from Locations where LocationID == (SELECT Data from Misc where Code == 'DefaultLocation') and Trim(Path) != '' and Trim(RefName) != '';" ""> 1.log"""

:help:

boss911 13-10-2020 00:59 2936263

Цитата:

Цитата VLADEV
Скрипт который не работает »

Не знаю, как оно должно прописываться в командной строке, так что, исходя из вашего примера, предположительно так:
Код:

[Run]
Filename: {commonappdata}\sqlite3.exe; Parameters: "local.ssdb ""SELECT Path from Locations where LocationID == (SELECT Data from Misc where Code == 'DefaultLocation') and Trim(Path) != '' and Trim(RefName) != '';"" ""> 1.log"""


VLADEV 13-10-2020 13:02 2936293

Правильно вроде так (учитавая ЛОГ инно)

Код:

Parameters: "local.ssdb ""SELECT Path from Locations where LocationID == (SELECT Data from Misc where Code == 'DefaultLocation') and Trim(Path) != '' and Trim(RefName) != '';"" > 1.log";
но сцуко не работает и все (((

VLADEV 13-10-2020 16:25 2936323

Вообщем пока переделал батник в exe , с ним все работает. Мистика....

boss911 13-10-2020 16:56 2936327

Цитата:

Цитата VLADEV
Вообщем пока переделал батник в exe »

А как в батнике выглядит запуск sqlite3.exe с рабочими параметрами? И зачем в EXE, если IS может запустить батник?

Iska 13-10-2020 17:38 2936332

Цитата:

Цитата VLADEV
но сцуко не работает и все ((( »

Здесь часто помогает Process Monitor с фильтрами Process Create и Process Start — можно посмотреть, что приходит в конечном итоге процессу в командную строку.

DirtyJohny 13-10-2020 22:35 2936361

Все заработало, еще раз низкий поклон ответившему. Правда осталось одно неприятное явление. При запуске инсталлятора, приветственное окно не двигается, думаю это последняя просьба помочь мне XD Сердечно прошу помощи)

VLADEV 14-10-2020 02:33 2936394

Цитата:

Цитата boss911
А как в батнике выглядит запуск sqlite3.exe с рабочими параметрами? И зачем в EXE, если IS может запустить батник? »

у меня в 1 сообщении как раз строка команды из батника
я не правильно написал , я хотел запустить sqlite3.exe с параметрами. Вот они и не пошли -(2ое сообщение)

воспользовался BAT to exe и получил exe который уже запускал в ИС (без проблем)

вместе с Gnom_aka_Lexander, мы уже все сделали. Из ЛОГ файла вытащили путь установки.

Если хотите могу кинуть вам исходник всего этого.

boss911 14-10-2020 15:01 2936449

Цитата:

Цитата VLADEV
у меня в 1 сообщении как раз строка команды из батника »

Если пример из батника рабочий, то, по идеи, должно быть так:
Код:

[Run]
Filename: {commonappdata}\sqlite3.exe; Parameters: "local.ssdb ""SELECT Path from Locations where LocationID == (SELECT Data from Misc where Code == 'DefaultLocation') and Trim(Path) != '' and Trim(RefName) != '';"""

- здесь убрал вывод сообщенй программы (sqlite3.exe) в файл (>1.log), так как не является параметром, в данном случае работать не будет и может мешать.

Если нужен вывод в log файл, тогда так:
Код:

[Run]
Filename: {cmd}; Parameters: "/C """"{commonappdata}\sqlite3.exe"" ""{commonappdata}\local.ssdb"" ""SELECT Path from Locations where LocationID == (SELECT Data from Misc where Code == 'DefaultLocation') and Trim(Path) != '' and Trim(RefName) != '';"" >""{commonappdata}\1.log"""""


VLADEV 15-10-2020 14:25 2936558

boss911, Да , так все работает. Спасибо. :laugh:

Все равно мне нужно было запускать это в самом начале поэтому через код.

Код:

  begin
    ExtractTemporaryFileEx('sqlite3.exe', ExpandConstant('{commonappdata}\SmartSound Software Inc\Libraries'));
    ExtractTemporaryFileEx('ss.exe', ExpandConstant('{commonappdata}\SmartSound Software Inc\Libraries'));
    Exec(ExpandConstant('{commonappdata}\SmartSound Software Inc\Libraries\ss.exe'), '', '', sw_hide,
    ewWaitUntilTerminated, ResultCode);
  end;


habib2302 19-10-2020 19:04 2936911

Доброе время суток. Как присвоить команду к каждому компоненту (для нормальной установки и распаковки портативной версии), чтобы можно было использовать тихую установку. https://drive.google.com/uc?id=1ZRIR...xport=download

ZVSRus 20-10-2020 09:05 2936938

Цитата:

Цитата habib2302
Как присвоить команду к каждому компоненту (для нормальной установки и распаковки портативной версии), чтобы можно было использовать тихую установку.

Пример

habib2302 20-10-2020 12:13 2936963

ZVSRus, Пробовал этот метод, но не работает. Может вы поможете соединить мой скрипт с вашим примером

ZVSRus 20-10-2020 12:31 2936964

Цитата:

Цитата habib2302
Пробовал этот метод, но не работает.

Что конкретно не работает. Пример что привел выше, или что. В примере есть скомпилированный Setup.exe и два батника, запустите и проверьте.

habib2302 20-10-2020 12:51 2936969

Цитата:

Цитата ZVSRus
В примере есть скомпилированный Setup.exe »

При чем тут пример. Вы склейте два скрипта

ZVSRus 20-10-2020 13:12 2936971

Цитата:

Цитата habib2302
При чем тут пример. Вы склейте два скрипта

Вам что нужно то, примеры, подсказки, или что-бы кто то за вас сделал?

habib2302 25-10-2020 10:28 2937480

ZVSRus, Посмотрите, правильно ли сделал?
Скрытый текст
Код:

#define AppName "Axialis IconWorkshop"
#define AppVersion "6.9.1"
#include "include\botva2.iss"

[Setup]
AppName={#AppName}
AppVerName={#AppName} {#AppVersion}
AppId={#AppName}
AppVersion={#AppVersion}
AppCopyright=Xabib © 2020
AppPublisher=Axialis Software
AllowNoIcons=yes
DefaultDirName={code:GetDefaultDirName}\{#AppName}
DefaultGroupName={#AppName}
DisableWelcomePage=yes
DisableReadyPage=yes
DisableFinishedPage=yes
DirExistsWarning=no
PrivilegesRequiredOverridesAllowed=dialog
SetupIconFile=Install.ico
UninstallDisplayIcon={app}\IconWorkshop.exe
UninstallDisplayName={#AppName} {#AppVersion}
OutputBaseFilename={#AppName} {#AppVersion} RePack (& Portable) by Xabib
VersionInfoDescription={#AppName} RePack by Xabib
VersionInfoVersion={#AppVersion}
Compression=lzma2/ultra64
SolidCompression=true
InternalCompressLevel=ultra64
LZMADictionarySize=65536
LZMAMatchFinder=BT
LZMANumFastBytes=273
Uninstallable=not IsInPortableMode
UsePreviousAppDir=no
CreateUninstallRegKey=not IsInPortableMode
RawDataResource=Botva>botva2.dll,WMSI>WMSI.png

[Languages]
Name: enu; MessagesFile: compiler:default.isl
Name: rus; MessagesFile: compiler:Languages\russian.isl

[Messages]
BeveledLabel=RePack by Xabib
SelectLanguageTitle={#AppName}

[CustomMessages]
enu.CreateConfigShowOptions=Show options window (when finishing install)
enu.CreateDefaultConfig=Create default configuration
enu.ForbiddenDirMessage=In portable mode, %1 should not be installed in "Program Files" or similar system directories.
enu.InstallModePageCaption=Pick Installation Mode
enu.InstallModePageDescription=Do you prefer integration into Windows or a portable installation?
enu.InstallModePageNormalOption=Normal - Integrates into Windows
enu.InstallModePagePortableOption=Portable - Supports removeable drives (e.g., USB pen drives)
enu.InstallModePageSubCaption=Choose a normal installation that integrates into Windows (e.g., Startmenu, optional Explorer context menu), or a portable installation that can run on any compatible Windows machine.
enu.LanguageFilesComponent=Languages
enu.OpenInstallFolderAfterInstall=Open installation target folder
enu.ProgramFilesComponent=Program Files
enu.StatusRunHxDToCreateConfigFile=Create configuration file...
enu.TaskConfigurationFile=Configuration file:
enu.WriteProtectConfig=Make readonly
enu.PortableButtonInstall=&Unpack
rus.CreateConfigShowOptions=Показать окно параметров (после завершения установки)
rus.CreateDefaultConfig=Создать конфигурацию по умолчанию
rus.ForbiddenDirMessage=В портативном режиме %1 не следует устанавливать в «Program Files» или аналогичных системных каталогах.
rus.InstallModePageCaption=Выберите тип установки
rus.InstallModePageDescription=Предпочитаете интеграцию в Windows или портативную версию?
rus.InstallModePageNormalOption=Нормальная - интеграция в Windows
rus.InstallModePagePortableOption=Портативная - поддерживает переносимые устройства (USB/HDD)
rus.InstallModePageSubCaption=Выберите нормальный тип для установки программы в Windows (добавление в меню Пуск, опционально в контекстное меню) или портативную для работы программы на любом ПК, совместимым с Windows
rus.LanguageFilesComponent=Языки
rus.OpenInstallFolderAfterInstall=Открыть папку установки
rus.ProgramFilesComponent=Program Files
rus.StatusRunHxDToCreateConfigFile=Создать файл конфигурации...
rus.TaskConfigurationFile=Файл конфигурации:
rus.WriteProtectConfig=Сделать доступным только для чтения
rus.PortableButtonInstall=&Распаковать

[Files]
Source: "{app}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: not IsInPortableMode;
Source: "{userdocs}\*"; DestDir: "{userdocs}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: not IsInPortableMode;
Source: "{userappdata}\*"; DestDir: "{userappdata}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: not IsInPortableMode;
Source: "{app}\*"; DestDir: "{app}\App\IconWorkshop"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: IsInPortableMode;
Source: "{userdocs}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: IsInPortableMode;
Source: "{userappdata}\*"; DestDir: "{app}\App\DefaultData"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: IsInPortableMode;
Source: "IconWorkshopPortable.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: IsInPortableMode;
Source: "IconWorkshop_RUS.reg"; DestDir: "{app}\Data"; DestName: "IconWorkshop.reg"; Flags: ignoreversion; Languages: rus; Check: IsInPortableMode;
Source: "IconWorkshop_ENG.reg"; DestDir: "{app}\Data"; DestName: "IconWorkshop.reg"; Flags: ignoreversion; Languages: enu; Check: IsInPortableMode;

#include "include\Registry.iss"

[Run]
Filename: netsh.exe; Parameters: "advfirewall firewall add rule name=""{#AppName}"" dir=in action=block program=""{app}\IconWorkshop.exe"" enable=yes"; Check: not IsInPortableMode; Flags: runhidden;
Filename: netsh.exe; Parameters: "advfirewall firewall add rule name=""{#AppName}"" dir=out action=block program=""{app}\IconWorkshop.exe"" enable=yes"; Check: not IsInPortableMode; Flags: runhidden;

[Icons]
Name: {group}\{#AppName}; Filename: {app}\IconWorkshop.exe; Check: not IsInPortableMode;
Name: {group}\{cm:UninstallProgram,{#AppName}}; Filename: {uninstallexe}; Check: not IsInPortableMode;
Name: {autodesktop}\{#AppName}; Filename: {app}\IconWorkshop.exe; Tasks: desktopicon; Check: not IsInPortableMode;

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Check: not IsInPortableMode;

[UninstallRun]
Filename: taskkill; Parameters: "/f /im IconWorkshop.exe"; Flags: RunHidden;
Filename: netsh.exe; Parameters: "advfirewall firewall delete rule name=""{#AppName}"""; Check: not IsInPortableMode; Flags: runhidden;

#include "include\UninstallDelete.iss"

[INI]
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "0"; Check: not IsInPortableMode;

; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Deleted Items\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Deleted Items\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Deleted Items\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "1"; Check: not IsInPortableMode;

; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Icons\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Icons\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Icons\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "6"; Check: not IsInPortableMode;

; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Media Files\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Media Files\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Media Files\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "12"; Check: not IsInPortableMode;

; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Media Files\Images\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Media Files\Images\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Media Files\Images\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "8"; Check: not IsInPortableMode;

; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Objects\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Objects\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Objects\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "14"; Check: not IsInPortableMode;

[Code]
#ifdef UNICODE
  #define A "W"
#else
  #define A "A"
#endif

const
  RT_RCDATA = 10;

var
  InputOptionPage: TInputOptionWizardPage;
  lResStream: TResourceStream;
  lPicHandle: THandle;
  i: integer;
    Install: TNewRadioButton;
  Portable: TNewRadioButton;
  PortablePanel: TPanel;
  InstallerPanel: TPanel;

function CheckParam(s: string): boolean;
begin
  for i := 0 to ParamCount do
  begin
    Result := ParamStr(i) = s;
    if Result then Break;
  end;
end;

function GetInstallDir(S: String): String;
begin
  if CheckParam('/P') then
    Result:= ExpandConstant('{userdesktop}\{#AppName}')
  else
    Result:= ExpandConstant(S);
end;

function InstallCheck: Boolean;
begin
  Result := Install.Checked or CheckParam('/I');
end;

function IsInPortableMode: Boolean;
begin
  Result := InputOptionPage.Values[1] and CheckParam('/P');
end;

function GetDefaultDirName(const AParam: string): string;
begin
  if ExpandConstant('{param:portable|0}') = '1' then
    Result := ExpandConstant('{userdesktop}') else
    Result := ExpandConstant('{autopf}');
end;

//Запрет распаковки в системные папки-----Start-----
function IsForbiddenDir(const ADir: string): Boolean;
begin
  Result := IsAdminInstallMode and
    ((not IsWin64 and (Pos(ExpandConstant('{win}'), ADir) = 1)) or
    (not IsWin64 and (Pos(ExpandConstant('{commonpf32}'), ADir) = 1)) or
    (IsWin64 and (Pos(ExpandConstant('{commonpf64}'), ADir) = 1)));
end;
//Запрет распаковки в системные папки-----Finish-----
//Замена пути распаковки в зависимости от типа-----Start-----
procedure InstallModeListBoxClick(Sender: TObject);
begin
  if IsInPortableMode and (CompareText(WizardDirValue, ExpandConstant('{autopf}\{#AppName}')) = 0) then
    WizardForm.DirEdit.Text := ExpandConstant('{userdesktop}\{#AppName}')
  else if not IsInPortableMode and (CompareText(WizardDirValue, ExpandConstant('{userdesktop}\{#AppName}')) = 0) then
    WizardForm.DirEdit.Text := ExpandConstant('{autopf}\{#AppName}');
end;
//Замена пути распаковки в зависимости от типа-----Finish-----
//Создание новой страницы-----Start-----
procedure CreateInstallModePage;
begin
  InputOptionPage := CreateInputOptionPage(wpWelcome, ExpandConstant('{cm:InstallModePageCaption}'),
    ExpandConstant('{cm:InstallModePageDescription}'), ExpandConstant('{cm:InstallModePageSubCaption}'), True, False);
  InputOptionPage.Add(ExpandConstant('{cm:InstallModePageNormalOption}'));
  InputOptionPage.Add(ExpandConstant('{cm:InstallModePagePortableOption}'));;
  InputOptionPage.Values[1] := ExpandConstant('{param:portable|0}') = '1';
  InputOptionPage.Values[0] := not InputOptionPage.Values[1];
  InputOptionPage.CheckListBox.OnClickCheck := @InstallModeListBoxClick;
end;
//Создание новой страницы-----Finish-----
//Замена текста в кнопке "Далее" в зависимости от типа-----Start-----
procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    wpSelectTasks:
      begin
        if not IsInPortableMode then
          WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall) else
          WizardForm.NextButton.Caption := ExpandConstant('{cm:PortableButtonInstall}');
      end;
  end;
end;
//Замена текста в кнопке "Далее" в зависимости от типа-----Finish-----
//Уведомление о запрете распаковки в системные папки-----Start-----
function NextButtonClick(CurPageID: Integer): Boolean;
begin
  Result := True;
  case CurPageId of
    wpSelectDir:
      if IsInPortableMode then
      begin
        Result := not IsForbiddenDir(WizardDirValue);
        if not Result then
          MsgBox(ExpandConstant('{cm:ForbiddenDirMessage,{#AppName}}'), mbError, MB_OK);
      end;
  end;
end;
//Уведомление о запрете распаковки в системные папки-----Finish-----
//Отключение страници создания папку в Пуске при выборе типа Портативная-----Start-----
function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result := False;
  case PageID of
    wpSelectProgramGroup:
      Result := IsInPortableMode;
  end;
end;
//Отключение страници создания папку в Пуске при выборе типа Портативная-----Finish-----
function GetFromRes(const ResName, SaveFileName: String): Boolean;
begin
    lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
  try
    lResStream.SaveToFile(ExpandConstant('{tmp}\') + SaveFileName);
  finally
    lResStream.Free;
    Result := FileExists(ExpandConstant('{tmp}\') + SaveFileName);
  end;
end;
//Подгрузка новой страницы-----Start-----
procedure InitializeWizard;
begin
  CreateInstallModePage;
  with WizardForm do
  begin
  if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_WMSI', 'WMSI.png') then
    begin
      lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\WMSI.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, False);
      WizardSmallBitmapImage.Hide;
      ImgSetVisibility(lPicHandle, True);
      ImgApplyChanges(MainPanel.Handle);
    end;
  end;
end;
//Подгрузка новой страницы-----Finish-----
procedure DeinitializeSetup();
begin
  gdipShutDown();
end;

function SetFileAttributes(lpFileName: string; dwFileAttributes: integer): integer;
external 'SetFileAttributes{#A}@kernel32.dll stdcall';

procedure CurStepChanged(CurStep: TSetupStep);
var
  RC: integer;
begin
  if CurStep = ssInstall then
begin
  Exec(ExpandConstant('taskkill'), ' /f /im IconWorkshop.exe', '', SW_HIDE, ewWaitUntilTerminated, RC);
end;
  if CurStep = ssDone then
begin
  if not IsInPortableMode then
  SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
  SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Deleted Items\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
  SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Icons\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
  SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Media Files\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
  SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Media Files\Images\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
  SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Objects\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
end;
  if CurStep = ssDone then
begin
  if not IsInPortableMode then
  if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') and not WizardSilent then
  MsgBox('Готово!', mbInformation, MB_OK)
  else
  if not WizardSilent then
  MsgBox('Установка {#AppName} была прервана!', mbError, MB_OK);
end;
  if CurStep = ssDone then
begin
  if IsInPortableMode then
  if not WizardSilent then
  if FileExists(ExpandConstant('{app}\IconWorkshopPortable.exe' )) then
  MsgBox('Готово!', mbInformation, MB_OK)
  else
  if not FileExists(ExpandConstant('{app}\IconWorkshopPortable.exe' )) then
  MsgBox('Установка {#AppName} была прервана!', mbError, MB_OK);
end;
end;

procedure InitializeUninstallProgressForm;
begin
  with UninstallProgressForm do
  begin
    if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_WMSI', 'WMSI.png') then
  begin
    lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\WMSI.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, False);
    WizardSmallBitmapImage.Hide;
    ImgSetVisibility(lPicHandle, True);
    ImgApplyChanges(MainPanel.Handle);
    end;
  end;
end;

procedure DeinitializeUninstall();
begin
  gdipShutDown();
end;


Egiptyanin245 27-10-2020 00:43 2937681

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

Iska 27-10-2020 22:37 2937824

Цитата:

Цитата Egiptyanin245
ВОПРОС, как сделать что бы исполняемый файл игнорировался программой при повторном запуске или перезаписывался вновь? »

Переписать:
Цитата:

Цитата Egiptyanin245
программа которая скомпеллирована из двух исполняемых файлов и запускается из экзешника без установки. »


Egiptyanin245 28-10-2020 11:30 2937868

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

Вячеслав.Мартыновских@vk 22-11-2020 00:44 2940674

Скиньте плиз все srep и rep одним архивом, и isdone 5 и 6 версию финал

habib2302 22-11-2020 15:36 2940714

Вячеслав.Мартыновских@vk, в https://krinkels.org/ все это есть

niki12899@vk 14-12-2020 21:35 2942984

El Sanchez, Доброго времени суток. Недавно мне скинули сие чудо - http://forum.oszone.net/post-2012750-1182.html
Вопрос был такой:
"Простите за мою тупость, но в коде довольно плохо разбираюсь. Я так понимаю там есть переменные которые зависят от действия? Можно небольшое пояснение к этому коду?
Ну в плане того, как этим пользоваться, что нужно менять и в целом, как это использовать в целях распаковки моего архива.
P.S. я там вижу, что у него есть какая то последовательность. Он сам пакует файл, а потом распаковывает? Или я как обычно несу херню)"
Можете помочь в данном вопросе?

Если вкратце, то меня интересует просто, как сделать бинарник большого размера (что я уже узнал, путём изменения расширения rar на bin) и как его подключить к своему установщику.

El Sanchez 15-12-2020 16:44 2943048

Вложений: 1
Цитата:

Цитата niki12899@vk
Если вкратце, то меня интересует просто, как сделать бинарник большого размера (что я уже узнал, путём изменения расширения rar на bin) и как его подключить к своему установщику. »

niki12899@vk, архив(ы) вы сами делаете, берёте папки и файлы установленной игры и пакуете их с помощью 7-zip, в один или несколько архивов это решаете вы. Вот вам шаблон, где идет распаковка архива dummy.bin, находящегося рядом с установщиком, в папку установки:
Скрытый текст

Код:

[Setup]
AppName=test
AppVerName=test
DefaultDirName={pf}\test

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl

[CustomMessages]
ru.SevenZipStatusExtractFiles=Распаковка файлов из %1:
ru.SevenZipProgressCaptions=Прогресс:%nСкорость:%nПрошло:%nОсталось:
ru.SevenZipProgressInfo=%1%% (%2 из %3)%n%4%n%5%n%6
ru.SevenZipExtractFailed=При распаковке архива %1 произошла ошибка. Код ошибки: %2

[Files]
Source: 7-zip32.dll; Flags: dontcopy
#ifndef IS_ENHANCED
  #if VER < 0x06000000
; https://web.archive.org/web/20150510131335if_/http://restools.hanzify.org/inno/callbackctrl/InnoCallbackCtrl_V1.1.zip
Source: CallbackCtrl.dll; Flags: dontcopy
 
#endif
#endif

[Code]
const
  WM_GETFONT = $0031;
  WM_SETTEXT = $000C;
  WM_USER    = $0400;

  PBM_SETPOS    = WM_USER + 2;
  PBM_SETRANGE32 = WM_USER + 6;

  GWL_STYLE = -16;

  WS_CLIPSIBLINGS = $04000000;
  WS_VISIBLE      = $10000000;
  WS_CHILDWINDOW  = $40000000;
  SS_RIGHT = $2;

  CP_ACP  = 0;
  CP_UTF8 = 65001;

  FNAME_MAX32 = 512;
  MAX_PATH = 260;

  ARCEXTRACT_BEGIN    = 0;
  ARCEXTRACT_INPROCESS = 1;

type
  { 7-zip.dll. }
  TExtractingInfo = record
    szSourceFileName: PAnsiChar;
    szDestFileName: PAnsiChar;
    dwFileSize: DWORD;
    szFileSize: PAnsiChar;
    dwWriteSize: DWORD;
    szWriteSize: PAnsiChar;
    dwProgress: DWORD;
    szSpeed: PAnsiChar;
    szElapsed: PAnsiChar;
    szRemain: PAnsiChar;
  end;

  { User-defined data passed to callback. }
  TArcParam = record
    FilenameLabelHWND: HWND;
    ProgressGaugeHWND: HWND;
    ProgressInfoHWND: HWND;
  end;

#ifndef IS_ENHANCED
  #if VER < 0x06000000
 
TExtractCallbackProc = function (nState: UINT; var ExtInfo: TExtractingInfo; var ArcParam: TArcParam): BOOL;
  #endif
#endif

// Unicode and Character Set Functions
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string;
  cchWideChar: Integer; lpMultiByteStr: AnsiString; cbMultiByte, lpDefaultChar: Integer;
  lpUsedDefaultChar: Longint): Integer; external 'WideCharToMultiByte@kernel32.dll stdcall';
function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: AnsiString;
  cbMultiByte: Integer; lpWideCharStr: string; cchWideChar: Integer): Integer; external 'MultiByteToWideChar@kernel32.dll stdcall';
// Shell Lightweight Utility Functions
function PathCompactPath(hDC: THandle; lpszPath: string; dx: UINT): BOOL; external 'PathCompactPathW@shlwapi.dll stdcall';
// Painting and Drawing Functions
function GetDC(hWnd: HWND): THandle; external 'GetDC@user32.dll stdcall';
// Device Context Functions/
function SaveDC(hdc: THandle): Integer; external 'SaveDC@gdi32.dll stdcall';
function RestoreDC(hdc: THandle; nSavedDC: Integer): BOOL; external 'RestoreDC@gdi32.dll stdcall';
function ReleaseDC(hWnd: HWND; hDC: THandle): Integer; external 'ReleaseDC@user32.dll stdcall';
function SelectObject(hdc, hgdiobj: THandle): THandle; external 'SelectObject@gdi32.dll stdcall';
// Window Functions
function GetClientRect(hWnd: HWND; var lpRect: TRect): BOOL; external 'GetClientRect@user32.dll stdcall';
// Message Functions
function SendMessageString(hWnd: HWND; Msg: UINT; wParam: Longint; lParam: string): Longint; external 'SendMessageW@user32.dll stdcall';
// Window Class Functions
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongW@user32.dll stdcall';
// 7-zip.dll Functions
function SevenZip(const CmdLine: AnsiString; ArcProc: Longint; var LParam: TArcParam): Integer; external 'SevenZip@files:7-zip32.dll stdcall';
#ifndef IS_ENHANCED
  #if VER < 0x06000000
// CallbackCtrl.dll Functions
function WrapExtractProc(Callback: TExtractCallbackProc; ParamCount: Integer): LongWord; external 'wrapcallbackaddr@files:callbackctrl.dll stdcall';
  #endif
#endif

var
  ProgressInfoContainer, ProgressInfo: TNewStaticText;
  ArcProc: LongWord;

function UTF8Encode(const Value: string): AnsiString;
var
  Len: Integer;
begin
  if Value = '' then Exit;
  Len := WideCharToMultiByte(CP_UTF8, 0, Value, -1, '', 0, 0, 0);
  if Len = 0 then Exit;
  Result := StringOfChar(#0, Len - 1);
  if WideCharToMultiByte(CP_UTF8, 0, Value, -1, Result, Len, 0, 0) = 0 then Exit;
end;

function UTF8Decode(const Value: AnsiString): string;
var
  Len: Integer;
begin
  if Value = '' then Exit;
  Len := MultiByteToWideChar(CP_UTF8, 0, Value, -1, '', 0);
  if Len = 0 then Exit;
  Result := StringOfChar(#0, Len - 1);
  if MultiByteToWideChar(CP_UTF8, 0, Value, -1, Result, Len) = 0 then Exit;
end;

function ExtractCallbackProc(nState: UINT; var ExtInfo: TExtractingInfo; var ArcParam: TArcParam): BOOL;
var
  LText: string;
  DC, SaveIndex: THandle;
  LRect: TRect;
begin
  { Avoid call VCL methods or get/set properties. }
  Result := True;
  case nState of
    ARCEXTRACT_BEGIN:
      begin
        DC := GetDC(ArcParam.FilenameLabelHWND);
        SaveIndex := SaveDC(DC);
        try
          SelectObject(DC, SendMessage(ArcParam.FilenameLabelHWND, WM_GETFONT, 0, 0));
          GetClientRect(ArcParam.FilenameLabelHWND, LRect);
          LText := UTF8Decode(ExtInfo.szDestFileName);
          PathCompactPath(DC, LText, LRect.Right - LRect.Left);
          SendMessageString(ArcParam.FilenameLabelHWND, WM_SETTEXT, 0, LText);
        finally
          if SaveIndex <> 0 then
            RestoreDC(DC, SaveIndex);
          ReleaseDC(ArcParam.FilenameLabelHWND, DC);
        end;
      end;
    ARCEXTRACT_INPROCESS:
      begin
        PostMessage(ArcParam.ProgressGaugeHWND, PBM_SETRANGE32, 0, 100);
        PostMessage(ArcParam.ProgressGaugeHWND, PBM_SETPOS, ExtInfo.dwProgress, 0);
        LText := FmtMessage(CustomMessage('SevenZipProgressInfo'), [IntToStr(ExtInfo.dwProgress),
          ExtInfo.szWriteSize, ExtInfo.szFileSize, ExtInfo.szSpeed, ExtInfo.szElapsed, ExtInfo.szRemain]);
        SendMessageString(ArcParam.ProgressInfoHWND, WM_SETTEXT, 0, LText);
      end;
  end;
end;

procedure ExtractPackage(const AFileName, ADestPath: string);
var
  CmdLine: AnsiString;
  ArcParam: TArcParam;
  ResultCode: Integer;
begin
  if FileExists(AFileName) then
  try
    WizardForm.StatusLabel.Caption := FmtMessage(CustomMessage('SevenZipStatusExtractFiles'), [ExtractFileName(AFileName)]);
    ProgressInfoContainer.Show;
    CmdLine := UTF8Encode(ExpandConstant(Format('x -y "%s" -o"%s\"', [AFileName, ADestPath])));
    ArcParam.FilenameLabelHWND := WizardForm.FilenameLabel.Handle;
    ArcParam.ProgressGaugeHWND := WizardForm.ProgressGauge.Handle;
    ArcParam.ProgressInfoHWND := ProgressInfo.Handle;
    ResultCode := SevenZip(CmdLine, ArcProc, ArcParam);
    if ResultCode <> 0 then
      RaiseException(FmtMessage(CustomMessage('SevenZipExtractFailed'), [ExtractFileName(AFileName), Format('0x%.8x', [ResultCode])]));
  except
    ShowExceptionMessage;
  finally
    ProgressInfoContainer.Hide;
    WizardForm.StatusLabel.Caption := SetupMessage(msgStatusExtractFiles);
    WizardForm.FilenameLabel.Caption := '';
  end;
end;

procedure CreateInstallingPage;
begin
  { ProgressInfoContainer. }
  ProgressInfoContainer := TNewStaticText.Create(WizardForm);
  with ProgressInfoContainer do
  begin
    Parent := WizardForm.InstallingPage;
    Align := alBottom;
    AutoSize := False;
    Caption := CustomMessage('SevenZipProgressCaptions');
    Height := Parent.ClientHeight - WizardForm.ProgressGauge.Top - WizardForm.ProgressGauge.Height - ScaleY(5);
  end;

  { ProgressInfo. }
  ProgressInfo := TNewStaticText.Create(WizardForm);
  with ProgressInfo do
  begin
    Parent := ProgressInfoContainer;
    Align := alRight;
    AutoSize := False;
    Width := Parent.ClientWidth div 2;
    SetWindowLong(Handle, GWL_STYLE, WS_CHILDWINDOW or WS_VISIBLE or WS_CLIPSIBLINGS or SS_RIGHT);
  end;
#ifdef IS_ENHANCED
 
ArcProc := CallbackAddr('ExtractCallbackProc');
#elif VER >= 0x06000000
 
ArcProc := CreateCallback(@ExtractCallbackProc);
#else
 
ArcProc := WrapExtractProc(@ExtractCallbackProc, 3);
#endif
end;

procedure InitializeWizard;
begin
  CreateInstallingPage;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssPostInstall:
      begin
        ExtractPackage(ExpandConstant('{src}\dummy.bin'), ExpandConstant('{app}'));
      end;
  end;
end;


В шаблоне нет секции UninstallDelete, т.к. я не знаю структуры ваших файлов и папок. Деинсталлятор ничего не знает про извлекаемые из архива файлы, поэтому в ней описываете корневые файлы и папки из архивов.

niki12899@vk 04-01-2021 18:03 2945015

El Sanchez, Видимо я совсем тупой... Простите, можете подробнее процесс описать? Я вставил этот код в Inno Setup. После компиляции создался exe (mySetup) после установки которого создаётся папка "test", где лежит два файла. Но не суть. Я хочу узнать, как мне конкретно подключить свой архив с файлами, чтобы программа потом его распаковывала.

El Sanchez 08-01-2021 19:06 2945389

Цитата:

Цитата niki12899@vk
Простите, можете подробнее процесс описать? Я вставил этот код в Inno Setup. »

niki12899@vk, в CurStepChanged по шаблону ExtractPackage(<путь к файлу архива>, <путь папки для разархивации>) пишете ваши архивы. В примере ExtractPackage распаковывает файл dummy.bin, находящегося рядом с установщиком, в папку установки.

Евгений.Довгополый@vk 22-03-2021 19:11 2953662

Всем Привет. Можете подсказать как написать код : Вот что я хочу. Есть игра. Я сделал к ней дополнение и у меня получилось три папки и в игре есть такие же папки. И мне надо чтоб из моих установилось все туда. А то я не пойму как это сделать.

Евгений.Довгополый@vk 23-03-2021 03:47 2953682

niki12899@vk,

burza 02-04-2021 21:37 2954638

Народ помогите выкачать скрипт пожалуйста с кринкла https://krinkels.org/resources/r-g-mexaniki.82/
очень прошу помочь) можна кинуть на burzabu@gmail.com

Iska 02-04-2021 22:20 2954640

burza, читайте: Добавление новой группы и условия перехода в неё, или почему я не могу скачивать без ограничений | Форум Krinkels.org.

burza 02-04-2021 22:58 2954643

Цитата:

Цитата Iska
читайте: Добавление новой группы и условия перехода в неё, или почему я не могу скачивать без ограничений | Форум Krinkels.org. »

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

Iska 02-04-2021 23:24 2954646

burza, то есть, не Вы, а кто-то другой должен бросить всё и пойти туда, зарегистрироваться, набрать десять симпатий, загрузить тот скрипт и, в нарушение тамошних правил, выдать его Вам на блюдечке с голубой каёмочкой?!

Ничего у Вас не треснет, а, коллега?

VLADEV 07-04-2021 12:59 2955102

burza, 3 бакса стоит вход в закачку. Раз вы учитесь то думаю Вам не только этот скрипт понадобится. (ИМХО)

Boogiman23 08-04-2021 09:46 2955202

Добрый день, уважаемые форумчане. Кто в курсе: как обойти ограничение в Inno Setup на размер создаваемого файла в 2.100.000.000 байт? То есть, задача перепаковать игру с дополнительным патчем. Игра в установленном виде весит 12,7 Гб. При компиляции Inno Setup создаёт аж 6 файлов (не считая основного exe-шника): 5 файлов по 1,95 Гб каждый и один (видимо, остаточный) на 1,55 Гб. Оригинальный установщик игры имеет 5 дополнительных bin файлов размерами 3,33 Гб, 2,19 Гб, 142 Мб, 26,7 Мб и 5,93 Мб. Как так получается, что в оригинале возможен размер файлов больше 1,95 Гб, а при компиляции в Inno Setup - нет? Может быть, есть какие-то скрытые настройки в Inno Setup, которые отвечают за снятие данного ограничения? Или же для создания больших bin файлов надо использовать какой-то другой компилятор? Если кто знает такой - подскажите, пожалуйста. Ведь такая возможность точно есть, поскольку имеются игры, в которых bin-арники весят по 20-40 Гб!

boss911 08-04-2021 13:44 2955230

Цитата:

Цитата Boogiman23
поскольку имеются игры, в которых bin-арники весят по 20-40 Гб! »

Это 7Zip или FreeArc архивы. В шапке есть ссылки, как работать с этими архивами. Далее не подскажу.
Обойти ограничение в 2100000000 байт нельзя, только способом ниже - через сторонний архив.

http://forum.oszone.net/post-2012750-1182.html
http://forum.oszone.net/post-1300871-729.html

Boogiman23 08-04-2021 17:50 2955250

Благодарю, boss911, за подсказку!

Boogiman23 09-04-2021 20:51 2955394

Цитата:

Цитата boss911
Обойти ограничение в 2100000000 байт нельзя, только способом ниже - через сторонний архив. »

Ну, хорошо, сторонний архив. Но ведь даже если запаковать файлы игры другим архиватором, сделав, например, 3 файла по 4 Гб, то при создании установщика через Inno Setup всё равно же будет выскакивать ошибка о превышении размера одного файла! Ведь эти же новосозданные 3 файла надо добавлять в установщик на этапе создания оного. Или же существует какой-нибудь хороший аналог Inno Setup, в котором нет такой фигни?

Iska 09-04-2021 21:07 2955395

Boogiman23, Вы не поняли. Если я всё правильно понимаю, то:
  • эти файлы (архива) вообще не входят в состав установщика;
  • у Вас будет отдельно — установщик, и отдельно — архив.
Т.е., нет никакого:
Цитата:

Цитата Boogiman23
то при создании установщика через Inno Setup »

где Вы помещаете файлы архива внутрь инсталляции InnoSetup, не надо:
Цитата:

Цитата Boogiman23
Ведь эти же новосозданные 3 файла надо добавлять в установщик на этапе создания оного. »


Boogiman23 09-04-2021 21:51 2955396

Вложений: 2
Iska, а как же всё это правильно сделать, чтоб создать нормальную установку игры?
Вот, для большего понимания:
Это размер установленной игры: 09.04.jpg
А это размер исходной установки: 09.041.jpg

danilious@vk 16-08-2021 00:24 2964291

"Здравствуйте! Честное слово, "весь интернет" облазил, но ничего не нашел. Я мало что понимаю в inno setup, но хотел бы спросить, как сделать выборочную загрузку, чтобы человек ставил и убирал галочки перед тем или иным файлом. Спасибо"
Видимо я плохо искал)) Но чтобы другим людям также не париться.
Как сделать выборочную загрузку в Inno Setup?
https://golos.io/~34ff1xx3wuxy/razra...ereklyuchateli

ToBeLife 19-08-2021 16:44 2964594

Здравствуйте.
Подскажите по вопросу о is7z.dll:
1. Она распаковывает лишь 7z или 7z-sfx-архив тоже умеет?
2. Воспользовался прилагаемым примером (с прописыванием путей), но кроме сообщения о "неверном пароле", более ничего. Распаковка не происходит.
- нужно что-то дописать или библиотека не умеет работать с новыми версиями 7z?


Boogiman23,
А упаковать файлы, скажем в 7zip или WinRar с нужным размером, а в inno прописать распаковку?

vei136@vk 24-09-2021 11:54 2967429

Доброго времени суток,

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

Требования к установочнику:
Скрытый текст
1. Окно при запуске приложения (прикрепил пикчу)
2. Окно выбора директории + кнопка выбора.
3. Кнопка установить
4. Лоадинг бар
(кнопки есть в 3 стилях (active/hover/disabled))

pollipen 31-10-2021 12:42 2970210

ребята как запустить файл средствами инно сетап msp

boss911 31-10-2021 13:39 2970216

Цитата:

Цитата pollipen
как запустить файл средствами инно сетап msp »

Код:

[Run]
Filename: {sys}\msiexec.exe; Parameters: /update "{tmp}\Update.msp"; Flags: waituntilterminated

Всю информацию по параметрам смотрите в msiexec.exe (просто запустить).

pollipen 15-11-2021 17:08 2972014

ребята помогите
хочу сделать браузер по умолчанию (Google Chrom)
так же ассоциации с файлом (Google Chrom)
может какой скрипт есть?

boss911 15-11-2021 18:46 2972024

Цитата:

Цитата pollipen
хочу сделать браузер по умолчанию (Google Chrom)
так же ассоциации с файлом (Google Chrom) »

Я Google Chrome не пользуюсь, все, что могу предложить, это попробовать установить Chrome в качестве браузера по умолчанию (ассоциации с файлами предположительно) с помощью ключа командной строки --make-default-browser:
Код:

[Run]
Filename: {app}\Chrome\Application\chrome.exe; Parameters: --make-default-browser; Flags: waituntilterminated

Но есть отзывы, что ключ работает только для Win7 (надо проверять).

pollipen 16-11-2021 06:56 2972075

Цитата:

Цитата boss911
Но есть отзывы, что ключ работает только для Win7 (надо проверять). »

да проверил на 7 нормально ,а дальше 8-10 уже не хочет по умолчанию.

Афганец 14-01-2022 20:55 2977655

Как выше уже писалось не мог тоже получить регистрацию на форуме krinkels.org нашел и сети что здесь также обсуждается Inno Setup
Установил Inno Setup 6.2.0
Собрал программу, запустил ее установку после сборки, исправил всё что мне нужно, пользуясь различными мануалами.
Но есть одна проблема которую не могу решить. Помогите найти причину.
В общем суть такая.
В программе в подпапке есть два ехе файла запустив которые можно запустить программу. Обзовем их:
INPA.exe и INPALOAD.exe
находятся они тут:
C:\EC-APPS\INPA\BIN\INPA.exe
C:\EC-APPS\INPA\BIN\INPALOAD.exe
Проблема заключается в том, что в главной папке EC-APPS создается файл INPALOAD.exe естественно что запустив его программа дает ошибку при запуске.
Иконка на рабочем столе создается с правильным адресом запуска стартового файла: C:\EC-APPS\INPA\BIN\INPALOAD.exe

Как сделать чтобы файл INPALOAD.exe не создавался в этой директории: C:\EC-APPS\INPALOAD.exe
Этот файл указан как файл запуска программы:
#define MyAppExeName "INPALOAD.exe"

lmiol 14-02-2022 00:36 2979977

Всем доброго времени суток
Появилась необходимость скачивать архив, распаковывать и устанавливать. Inno Setup версия 6.2.0
Решили заюзать Inno Download Plugin (он вроде самый адекватный)
перевели установщик в silent режим, чтобы избавиться от лишних окон и кнопок
получилось как-то так (idp.iss не прилагаю, он у нас без изменений)

HTML код:

#define MyAppName "bla"
#define MyAppVersion "1.0.0"
#define MyAppPublisher "bla"
#define MyAppURL "https://www.bla.com/"
#define MyAppExeName "bla.exe"
#include ReadReg(HKLM, 'Software\WOW6432Node\Mitrich Software\Inno Download Plugin', 'InstallDir') + '\idp.iss'

[Setup]
; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{9B58D044-A076-47B2-B426-FC6CA298390A}}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={autopf}\{#MyAppName}
; Remove the following line to run in administrative install mode (install for all users.)
PrivilegesRequired=lowest
PrivilegesRequiredOverridesAllowed=commandline
OutputDir=C:\bla\App Installer
OutputBaseFilename=bla-setup
;SetupIconFile=C:\bla\App Installer\installerIcon.ico
Compression=zip
SolidCompression=yes
WizardStyle=classic
AllowCancelDuringInstall=no
WindowResizable=yes
;SignTool=MsSign $f 
DisableProgramGroupPage=yes


[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Files]
  Source: "C:\bla\App Installer\7za.exe"; DestDir: {tmp}; Flags: deleteafterinstall
  Source: "{tmp}\bla-portable.zip"; DestDir: "{app}"; Flags: external ignoreversion recursesubdirs deleteafterinstall; ExternalSize: 323584
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"

[Run]
Filename: "{tmp}\7za.exe"; Parameters: "x ""{app}\bla-portable.zip"" -o""{app}\"" * -r -aoa"; Flags: runhidden runascurrentuser;
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall

[Messages]
SetupWindowTitle={#MyAppName}

[code]
#ifdef UNICODE
  #define AW "W"
#else
  #define AW "A"
#endif
type
  HINSTANCE = THandle;




function ShellExecute(hwnd: HWND; lpOperation: string; lpFile: string;
  lpParameters: string; lpDirectory: string; nShowCmd: Integer): HINSTANCE;
  external 'ShellExecute{#AW}@shell32.dll stdcall';

function InitializeSetup: Boolean;
begin
  // if this instance of the setup is not silent which is by running
  // setup binary without /SILENT parameter, stop the initialization
  Result := WizardSilent;
  // if this instance is not silent, then...
  if not Result then
  begin
    // re-run the setup with /SILENT parameter; because executing of
    // the setup loader is not possible with ShellExec function, we
    // need to use a WinAPI workaround
    if ShellExecute(0, '', ExpandConstant('{srcexe}'), '/SILENT', '',
      SW_SHOW) <= 32
    then
      // if re-running this setup to silent mode failed, let's allow
      // this non-silent setup to be run
      Result := True;
  end;
end; 



procedure InitializeWizard();
begin
  WizardForm.ProgressGauge.Visible := True;
  WizardForm.PageNameLabel.Height := 0;
  WizardForm.PageDescriptionLabel.Height := 0;
  WizardForm.StatusLabel.Visible := True;
  WizardForm.Bevel.Visible  := False;
  WizardForm.CancelButton.Height := 0;
  WizardForm.Bevel1.Visible := False;
  WizardForm.WizardSmallBitmapImage.Visible := False;
  //WizardForm.Color := clWhite;
  //WizardForm.Color := $2B2E33;
  WizardForm.MainPanel.Color  := WizardForm.Color;
  WizardForm.InnerPage.Color := WizardForm.Color;
  WizardForm.TasksList.Color := WizardForm.Color;
  WizardForm.InstallingPage.Color := WizardForm.Color;
  WizardForm.FilenameLabel.Visible := False;
  WizardForm.Width:=640;
  WizardForm.Height:=270;
  idpAddFileSize('https://api.bla.com/download/bla-portable.zip', ExpandConstant('{tmp}\bla-portable.zip'), 71188480);
  idpDownloadAfter(wpReady);

end;

procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer);
begin 
    WizardForm.StatusLabel.Caption := 'Installing, please wait...';
    //WizardForm.StatusLabel.Top :=-5;
    WizardForm.ProgressGauge.Top :=34;
    WizardForm.MainPanel.Visible := False;
    //WizardForm.StatusLabel.Font.Color := $8D7C72;
    //WizardForm.StatusLabel.Font.Color :=clWhite;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
  WizardForm.Bevel1.Visible := false ;
  WizardForm.MainPanel.Visible := false ;
  WizardForm.InnerNotebook.Top:=50;
  WizardForm.OuterNotebook.height := 400 ;
end;



Всё отлично работает, но есть пару но

1 Идёт окно Downloading вызываемое IDP, нажимаем на крестик закрытия окна и в появившемся модальном окне подтверждаем на Yes
Вместо того чтобы прервать Загрузку он пытается дальше выполнить установку и создает ярлыки

2 Идёт окно Downloading вызываемое IDP, отключаем wifi, в появившемся модальном окне где говорят "интернет пропал" и спрашивают "Повторить или Отмена?" нажимаем Отмена
Вместо того чтобы прервать загрузку он пытается дальше выполнить установку и создает ярлыки

Я долго гуглил решения и нашел вот это
https://stackoverflow.com/questions/...tion-from-code
Пользователь Martin Ba объясняет что вроде бы WizardForm.Close не работает в silentmode
и что можно определить два типа обратных вызовов нажатия кнопки отмены [code]: глобальная CancelButtonClick процедура, каждая страница мастера также имеет параметр, OnCancelButtonClick: TWizardPageCancelEvent который можно установить.

Но что-то я не разобрался как именно трекать Сancel в кейсе 2 и Yes в кейсе 1

кто-нибудь работал с IDP и Режиме silent?

Т.е. ожидаемый результат в обоих двух кейсах
- Не идёт распаковка архива который не был получен
- Не идёт установка ярлыков
- Нет других ошибок
- Вместо загрузки показывается временный текст "Rollback changes..." или "Canceling installation..." который показывается пока там всё отменяется, по окончанию нужных действий установщик просто закрывается

Barkasun 14-02-2022 10:43 2979989

Может быть, есть какие-то скрытые настройки в Inno Setup?

lmiol 16-02-2022 13:21 2980179

Цитата:

Цитата lmiol
Всем доброго времени суток
Появилась необходимость скачивать архив, распаковывать и устанавливать. Inno Setup версия 6.2.0
Решили заюзать Inno Download Plugin (он вроде самый адекватный)
перевели установщик в silent режим, чтобы избавиться от лишних окон и кнопок
получилось как-то так (idp.iss не прилагаю, он у нас без изменений)

...

Всё отлично работает, но есть пару но
1 Идёт окно Downloading вызываемое IDP, нажимаем на крестик закрытия окна и в появившемся модальном окне подтверждаем на Yes
Вместо того чтобы прервать Загрузку он пытается дальше выполнить установку и создает ярлыки
2 Идёт окно Downloading вызываемое IDP, отключаем wifi, в появившемся модальном окне где говорят "интернет пропал" и спрашивают "Повторить или Отмена?" нажимаем Отмена
Вместо того чтобы прервать загрузку он пытается дальше выполнить установку и создает ярлыки
Я долго гуглил решения и нашел вот это
https://stackoverflow.com/questions/...tion-from-code
Пользователь Martin Ba объясняет что вроде бы WizardForm.Close не работает в silentmode
и что можно определить два типа обратных вызовов нажатия кнопки отмены [code]: глобальная CancelButtonClick процедура, каждая страница мастера также имеет параметр, OnCancelButtonClick: TWizardPageCancelEvent который можно установить.
Но что-то я не разобрался как именно трекать Сancel в кейсе 2 и Yes в кейсе 1
кто-нибудь работал с IDP и Режиме silent? »

плачу 1000₽ за готовое, работоспособное решение
Оплату произведу после тестирования вашего setup.exe, укажите прямую ссылку на ZIP чего угодно размером на 20-30 мегабайт, либо звонок с демонстрацией экрана )
Регресс баги/проблемы должны отсутствовать или вам придется править за свой счет =)

El Sanchez 17-02-2022 11:25 2980236

Цитата:

Цитата lmiol
Появилась необходимость скачивать архив, распаковывать и устанавливать. Inno Setup версия 6.2.0 »

Скрытый текст

Код:

#define MyAppName "bla"
#define MyAppVersion "1.0.0"
#define MyAppPublisher "bla"
#define MyAppURL "https://www.bla.com/"
#define MyAppExeName "bla.exe"

[Setup]
AppId={{9B58D044-A076-47B2-B426-FC6CA298390A}}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
AllowCancelDuringInstall=no
DefaultDirName={autopf}\{#MyAppName}
; bla-portable.zip extracted size
ExtraDiskSpaceRequired=8293003
WizardStyle=classic

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl

[Messages]
SetupWindowTitle={#MyAppName}

[Files]
Source: 7za.exe; DestDir: {tmp}; Flags: deleteafterinstall

[Run]
Filename: {tmp}\7za.exe; Parameters: "x ""{tmp}\bla-portable.zip"" -o""{app}\"" * -r -aoa"; Flags: runhidden runascurrentuser;
Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}; Flags: nowait postinstall skipifdoesntexist

[Code]
function ShellExecute(hwnd: HWND; const lpOperation, lpFile, lpParameters, lpDirectory: string;
  nShowCmd: Integer): THandle; external 'ShellExecuteW@shell32.dll stdcall';

var
  DownloadPage: TDownloadWizardPage;

procedure ModifyWizardForm;
begin
  WizardForm.MainPanel.Hide;
  WizardForm.Bevel.Hide;
  WizardForm.Bevel1.Hide;
  WizardForm.Width := ScaleX(640);
  WizardForm.Height := ScaleY(270);
  DownloadPage := CreateDownloadPage(SetupMessage(msgWizardPreparing), SetupMessage(msgPreparingDesc), nil);
end;

function InitializeSetup: Boolean;
begin
  Result := WizardSilent;
  if not Result then
    ShellExecute(0, 'open', ExpandConstant('{srcexe}'), '/SILENT', '', SW_SHOWNORMAL);
end;

procedure InitializeWizard;
begin
  ModifyWizardForm;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssInstall:
      begin
        DownloadPage.Clear;
        DownloadPage.Add('https://github.com/jrsoftware/issrc/archive/refs/heads/main.zip', 'bla-portable.zip', '');
        DownloadPage.Show;
        try
          DownloadPage.Download;
        except
          if DownloadPage.AbortedByUser then
            SuppressibleMsgBox(AddPeriod(GetExceptionMessage), mbCriticalError, MB_OK, IDOK);
        finally
          DownloadPage.Hide;
        end;
      end;
  end;
end;


lmiol 17-02-2022 12:48 2980247

Цитата:

Цитата El Sanchez

У нас есть уже скрипт по работе с нативным загрузчиком от Inno Setup (который появился с 6.1.2 версии)

HTML код:

#define MyAppName "bla"
#define MyAppVersion "1.0.0"
#define MyAppPublisher "2PPL Interactive"
#define MyAppURL "https://www.bla.com/"
#define MyAppExeName "bla.exe"

[Setup]
; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
;SignTool=signtools $f
AppId={{9B58D044-A076-47B2-B426-FC6CA298390A}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={autopf}\{#MyAppName}
DisableProgramGroupPage=yes
PrivilegesRequired=lowest
PrivilegesRequiredOverridesAllowed=commandline
OutputDir=C:\bla\App Installer
OutputBaseFilename=bla-setup
SetupIconFile=C:\bla\App Installer\installerIcon.ico
Compression=zip
SolidCompression=yes
WizardStyle=classic
AllowCancelDuringInstall=no
WindowResizable=no

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Files]
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
Source: "C:\bla\App Installer\bla-portable\7za.exe"; DestDir: {tmp}; Flags: deleteafterinstall

[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"

[Run]
Filename: "{tmp}\7za.exe"; Check: ShouldRun; Parameters: "x ""{tmp}\bla-portable.zip"" -r -aoa -o""{app}"" *"; Flags: runhidden runascurrentuser;
Filename: "{app}\{#MyAppExeName}"; Check: ShouldRun; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall;

[Messages]
SetupWindowTitle={#MyAppName} {#MyAppVersion}

[code]

//----------------------
//Silent Mode

#ifdef UNICODE
  #define AW "W"
#else
  #define AW "A"
#endif
type HINSTANCE = THandle;

function ShellExecute(hwnd: HWND; lpOperation: string; lpFile: string;
  lpParameters: string; lpDirectory: string; nShowCmd: Integer): HINSTANCE;
  external 'ShellExecute{#AW}@shell32.dll stdcall';

function InitializeSetup: Boolean;
begin
  // if this instance of the setup is not silent which is by running
  // setup binary without /SILENT parameter, stop the initialization
  Result := WizardSilent;
  // if this instance is not silent, then...
  if not Result then
  begin
    // re-run the setup with /SILENT parameter; because executing of
    // the setup loader is not possible with ShellExec function, we
    // need to use a WinAPI workaround
    if ShellExecute(0, '', ExpandConstant('{srcexe}'), '/SILENT', '',
      SW_SHOW) <= 32
    then
      // if re-running this setup to silent mode failed, let's allow
      // this non-silent setup to be run
      Result := True;
  end;
end;


//----------------------
//Native Download

var DownloadPage: TDownloadWizardPage;

function OnDownloadProgress(const Url, Filename: string; const Progress, ProgressMax: Int64): Boolean;
begin
  DownloadPage.Msg2Label.Visible := False;
  if ProgressMax <> 0 then begin
    //Log(Format('  %d of %d bytes done.', [Progress, ProgressMax]))
    end
  else
    Log(Format('Successfully downloaded file to {tmp}: %s', [FileName]));
  Result := True;
end;

var DownloadShowed: Boolean;
var DownloadErrored: Boolean;

function ShouldRun: Boolean;
begin
  Result := not(DownloadErrored);
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  WizardForm.Bevel1.Visible := false;
  WizardForm.MainPanel.Visible := false;
  WizardForm.InnerNotebook.Top := 50;
  WizardForm.OuterNotebook.height := 400;

  if CurPageID = wpInstalling then begin
    if DownloadShowed = False then begin
      DownloadPage.Clear();
      DownloadPage.Show();
    end;
  end;
  if CurPageID = DownloadPage.ID then begin
    if DownloadShowed = False then begin
      DownloadShowed := True
      DownloadPage.Add('https://api.bla.com/download/bla-portable.zip', 'bla-portable.zip', '');      DownloadPage.Msg1Label.Font.Color := $8D7C72;
      DownloadPage.Msg1Label.Top := DownloadPage.Msg1Label.Top - 5;
      DownloadPage.ProgressBar.Top := DownloadPage.ProgressBar.Top - 65;
      DownloadPage.SetText('Installing...','');
      DownloadPage.Msg2Label.Visible := False;
      DownloadPage.Msg2Label.Top := 400;
    end;

    try
      DownloadPage.Download();
    except
      SuppressibleMsgBox(AddPeriod(GetExceptionMessage), mbCriticalError, MB_OK, IDOK);
      DownloadErrored := True;
      WizardForm.Close;
    finally
      DownloadPage.Hide();
    end;
  end;
end;

//----------------------
//Init window and style

procedure InitializeWizard();
begin
  WizardForm.ProgressGauge.Top := WizardForm.ProgressGauge.Top + 10;
  WizardForm.ProgressGauge.Visible := True;
  WizardForm.PageNameLabel.Height := 0;
  WizardForm.PageDescriptionLabel.Height := 0;
  WizardForm.StatusLabel.Visible := True;
  WizardForm.Bevel.Visible := False;
  WizardForm.CancelButton.Height := 0;
  WizardForm.Bevel1.Visible := False;
  WizardForm.WizardSmallBitmapImage.Visible := False;
  WizardForm.MainPanel.Color := WizardForm.Color;
  WizardForm.InnerPage.Color := WizardForm.Color;
  WizardForm.TasksList.Color := WizardForm.Color;
  WizardForm.InstallingPage.Color := WizardForm.Color;
  WizardForm.FilenameLabel.Visible := False;
  WizardForm.Width := 640;
  WizardForm.Height := 270;

  DownloadPage := CreateDownloadPage(SetupMessage(msgWizardPreparing), SetupMessage(msgPreparingDesc), @OnDownloadProgress);
end;

procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer);
begin 
    WizardForm.StatusLabel.Caption := 'Installing, please wait...';
    WizardForm.StatusLabel.Top := -5;
    WizardForm.ProgressGauge.Top := 40;
    WizardForm.MainPanel.Visible := False;
    WizardForm.StatusLabel.Font.Color := $8D7C72;
end;

мы его тестировали и остались недовольны.
Во время загрузки он довольно сильно лагает (тормозит окно)
из плюсов в нём только наличие прогрессбара в таскбаре пока идёт загрузка, но в остальном он довольно корявый. (по крайней мере на текущий момент)
Проверяли мы на 6.2.0

Всё же хочется исправить те 2 кейса для IDP
и использовать именно его (с нашим дизайном)

dracosha 17-02-2022 16:31 2980274

lmiol, всё то, что предлагает господин El Sanchez не имеет ни тормозов, ни глюков. Лучше вежливо попросите его о помощи и этот парень продемонстрирует вам своё мастерство в таком духе, что после увиденного вам ничего не останется как сказать, что этот парень просто волшебник. El Sanchez виртуозно владеет компьютерными языками. Это тот человек, который не копирует код, а пишет его с нуля. Методов написания любого кода существует масса, но не каждый умеет так оптимизированно писать код, как господин El Sanchez.

Vanadiy777 17-02-2022 19:29 2980295

Цитата:

Цитата lmiol
У нас есть уже скрипт по работе с нативным загрузчиком от Inno Setup »

Цитата:

Цитата lmiol
мы его тестировали и остались недовольны. »

Цитата:

Цитата lmiol
из плюсов в нём только наличие прогрессбара в таскбаре пока идёт загрузка, »

Цитата:

Цитата lmiol
Всё же хочется исправить те 2 кейса для IDP »

lmiol, извините, коллега, возможно сейчас влезаю не в свое дело...

Вы простите, но возникает вопрос - Вам "шашечки", или ехать?

Маэстро El Sanchez дал Вам готовое решение по ваш компилятор..., причем, заметьте, абсолютно бесплатно...

P.S. Ни чего личного...

lmiol 18-02-2022 07:56 2980321

Цитата:

Цитата dracosha
lmiol, всё то, что предлагает господин El Sanchez не имеет ни тормозов, ни глюков. Лучше вежливо попросите его о помощи и этот парень продемонстрирует вам своё мастерство в таком духе, что после увиденного вам ничего не останется как сказать, что этот парень просто волшебник. El Sanchez виртуозно владеет компьютерными языками. Это тот человек, который не копирует код, а пишет его с нуля. Методов написания любого кода существует масса, но не каждый умеет так оптимизированно писать код, как господин El Sanchez. »

Цитата:

Цитата Vanadiy777
lmiol, извините, коллега, возможно сейчас влезаю не в свое дело...
Вы простите, но возникает вопрос - Вам "шашечки", или ехать?
Маэстро El Sanchez дал Вам готовое решение по ваш компилятор..., причем, заметьте, абсолютно бесплатно... »

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

У меня в посте указан плагин IDP, конкретный дизайн, конкретная проблема: я просил дополнить наш скрипт исправив проблему по двум кейсам.
Я понимаю, что возможно Маэстро хотел как лучше и переписал на нативку, но факт остаётся фактом: это не то что мы просили.

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

Конкретно претензий к Маэстро за то, что нативка лагает - нет. Ведь это проблема Inno Setup и это уже пройденный нами этап (повторюсь еще раз)

Мы можем попытаться раздуть эту тему. Но я бы очень хотел сконцентрироваться на решении проблемы. Т.е. на финальном результате.

От оплаты доработок нашего скрипта по двум кейсам в 1к я не отказываюсь
Для защиты своей работы можете не выкладывать код, а локально собрать и во время звонка (гугл мит например) продемонстрировать работу установщика. Или записать видео показав работу двух кейсов.

Мне кажется El Sanchez просто было лень вникать в то, что я написал и он просто решил сделать по-быстрому, так как уже где-то реализовывал. Буду рад если я не прав.
Всё сводится к тому что своими силами мы разберёмся быстрее. Возможно, в этом и был ваш хитроумный план, поугнетать человека до тех пор, пока он не догадается до нужного решения.
Если так, то в аду для вас отдельный котёл, помощнички =)

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

lmiol 18-02-2022 08:28 2980322

Код:

procedure CurPageChanged(CurPageID: Integer);
begin
  WizardForm.Bevel1.Visible := false;
  WizardForm.MainPanel.Visible := false;
  WizardForm.InnerNotebook.Top := 50;
  WizardForm.OuterNotebook.height := 400;

  if CurPageID = wpInstalling then begin
    Downloaded := idpFilesDownloaded();
    if not(Downloaded) then begin
      ExitProcess(553);
    end;
  end;

end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if Cancel = True then begin
    ExitProcess(554);
  end;
end;

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

El Sanchez 18-02-2022 21:38 2980401

Цитата:

Цитата lmiol
1 Идёт окно Downloading вызываемое IDP, нажимаем на крестик закрытия окна и в появившемся модальном окне подтверждаем на Yes
Вместо того чтобы прервать Загрузку он пытается дальше выполнить установку и создает ярлыки »

lmiol, неправда. Если успели нажать Yes до того, как загрузка закончилась, то работает idpCancelButtonClick из idp.iss. А если разглядывать модальное окно и долго решать остановить загрузку или нет, то сама загрузка идёт дальше, и вот всё скачалось, ошибок нет и идёт дальше по сценарию, распаковка, ярлыки и прочее. Паузу автор не предусмотрел. Лучше в idp.iss участок кода с idpCancelButtonClick перепишите на:
Скрытый текст

Код:

var
  DownloadFailed: Boolean;

function idpBackButtonClick(Page: TWizardPage): Boolean;
begin
  if not IDPOptions.NoRetryButton then // Retry button clicked
  begin
    DownloadFailed := False;
    idpStartDownload;
    Result := False;
  end
  else
    Result := True;
end;

function idpNextButtonClick(Page: TWizardPage): Boolean;
begin
  Result := True;
end;

procedure idpCancelButtonClick(Page: TWizardPage; var Cancel, Confirm: Boolean);
begin
  Cancel := not DownloadFailed or ExitSetupMsgBox;
  if Cancel then
  begin
    IDPForm.Status.Caption := ExpandConstant('{cm:IDP_CancellingDownload}');
    WizardForm.Repaint;
    idpStopDownload;
    Confirm := False;
  end;
end;

procedure idpReportErrorHelper(Sender: TObject);
begin
  DownloadFailed := True;
  idpReportError; //calling idpReportError in main thread for compatibility with VCL Styles for IS
end;


Будет выход без подтверждения с прекращением загрузки, если пользователь Отмена нажмёт или окно попытается закрыть.
Цитата:

Цитата lmiol
2 Идёт окно Downloading вызываемое IDP, отключаем wifi, в появившемся модальном окне где говорят "интернет пропал" и спрашивают "Повторить или Отмена?" нажимаем Отмена
Вместо того чтобы прервать загрузку он пытается дальше выполнить установку и создает ярлыки »

lmiol, неправда, при Отмена вызывается тот же код idpCancelButtonClick из idp.iss, но теперь тут модальное окно создаётся из библиотеки и закачка не продолжается.
Цитата:

Цитата lmiol
Мне кажется El Sanchez просто было лень вникать в то, что я написал и он просто решил сделать по-быстрому, так как уже где-то реализовывал. »

lmiol, я не использую новые версии Inno и их фишки, пример писал впервые, да и не любитель я сторонние библиотеки использовать.

lmiol 19-02-2022 11:05 2980428

Цитата:

Цитата El Sanchez
lmiol, неправда. Если успели нажать Yes до того, как загрузка закончилась, то работает idpCancelButtonClick из idp.iss. А если разглядывать модальное окно и долго решать остановить загрузку или нет, то сама загрузка идёт дальше, и вот всё скачалось, ошибок нет и идёт дальше по сценарию, распаковка, ярлыки и прочее. Паузу автор не предусмотрел. Лучше в idp.iss участок кода с idpCancelButtonClick перепишите на: »

Спасибо конечно, но это просто без подтверждения закрытие. А это не совсем юзерфрендли.
Но я полностью согласен что во время модального окна с подтверждением должна быть пауза.
У нативного загрузчика эта пауза есть.
Но тут мы посчитали эту проблему низкоприоритетной. Если не успеет нажать значит сам виноват =)
Ну т.е. кейс когда он жмёт закрыть и намеренно уходит очень низок. (но конечно будет). Ведь если кто-то не хочет чтобы ему что-то устанавливалось - он не будет ждать с моря погоды. Но повторюсь что такой кейс возможен (отвлекли например).
Есть еще кейс если долго ждать загрузку и в конце нажать на Крестик (или эта отмена сделана в конце уже почти загуженного файла) то да, второй кейс когда всё упущено.

UPDATE
Кстати я потестировал еще раз
у нас пауза делается сама на Download от IDP
а на installation который у нас идёт секунды 2 уже крестика нет и прервать установку уже нельзя
так что всё просто magnifique

pollipen 09-03-2022 15:20 2981334

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

Vanadiy777 10-03-2022 18:25 2981425

Цитата:

Цитата pollipen
Парни подскажите как сделать, что бы не было видно ошибок при переустановки программы. »

pollipen, не совсем понятно, какие ошибки имеются ввиду?

Oklen 23-03-2022 22:29 2982190

Всем привет!
Как можно реализовать поиск необходимой директории установки, при условии, что имя конечной папки и ее расположение может быть разным (все возможные варианты имен известны).
Например, я знаю, что папка может иметь имя Толя, Коля или Вася, а вот директории неизвестны.
Как найти одну, несколько или все эти папки и установить (дублировать) в них приложение?

Nordek 28-03-2022 03:35 2982346

Цитата:

Цитата Oklen
Как можно реализовать поиск необходимой директории установки, при условии, что имя конечной папки и ее расположение может быть разным (все возможные варианты имен известны). »

Если при первой установке инсталлятор прописывает в реестр - то для последующей установки логично использовать путь из реестра.
Смотрите в справке константы:
Код:

{reg:HKxx\SubkeyName,ValueName|DefaultValue}

Примеры:
Код:

[Setup]
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|{pf}\My Program}


Код:

[Setup]
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1,InstallLocation|{pf}\My Program}


ivan_rolos 05-04-2022 20:21 2982795

Подскажите пожалуйста.
Как можно прочитать свойства файла? (ПКМ->Свойства->Подробно)

Мне нужно прочитать свойства уже готового файла инсталлятора (при его запуске), сам файл получают так: {srcexe}

habib2302 06-04-2022 12:16 2982820

ivan_rolos, смотря что вам надо прочитать и для чего?

ivan_rolos 06-04-2022 15:05 2982824

habib2302, "Описание файла", у инсталлятора оно будет меняться после сборки.
и нужно чтобы он потом при запуске установки подхватил значение и передал на обработчик как параметр. (отстук, что поставилась копия, такого-то описания)

Vanadiy777 06-04-2022 23:05 2982834

Цитата:

Цитата ivan_rolos
"Описание файла", у инсталлятора оно будет меняться после сборки. »

ivan_rolos, почему нельзя задать описание файла при сборке инсталлятора?
Задать сразу значение в секции:
Код:

[Setup]
VersionInfoDescription=Ваше описание файла

Затем, через константу {#SetupSetting('VersionInfoDescription')} передать туда, куда Вам нужно.

ivan_rolos 07-04-2022 12:17 2982845

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

Vanadiy777 07-04-2022 14:17 2982849

Цитата:

Цитата ivan_rolos
он не подписанный и прокручивать все копии чтобы не ругался smartScreen сложно. »

ivan_rolos, если Вы замените описание файла вручную после сборки инсталлятора, то он не станет от этого подписанным... А SmartScreen ругается потому, что воспринимает этот файл как потенциально опасное приложение.

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

ivan_rolos 08-04-2022 18:51 2982918

Vanadiy777,
Цитата:

Как можно прочитать свойства файла? (ПКМ->Свойства->Подробно)

Vanadiy777 08-04-2022 19:23 2982923

Цитата:

Цитата ivan_rolos
Цитата:
Как можно прочитать свойства файла? (ПКМ->Свойства->Подробно) »

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

ivan_rolos 08-04-2022 19:57 2982925

Та я вроде не играю в Павлика Морозова.
четко сказал что нужно в инсталляторе прочитать свойство файла (Описание файла).

Vanadiy777 08-04-2022 20:55 2982927

Цитата:

Цитата ivan_rolos
четко сказал что нужно в инсталляторе прочитать свойство файла (Описание файла). »

ivan_rolos, сценарий инсталлятора дайте, может вместе что и придумаем...
Ну, или сами дальше тогда...

Flix 08-04-2022 21:33 2982930

Цитата:

Цитата ivan_rolos
Как можно прочитать свойства файла? »

Вот так.

Vanadiy777 30-05-2022 15:19 2985950

Коллеги, всем доброго времени суток!

Подскажите пожалуйста, есть ли решение, как заменить иконку в MsgBox вместо mbError, mbInformation, и т.д. на свою, другую иконку, которая будет браться из системных файлов Windows?

Заранее, спасибо.

iglezz 31-05-2022 15:30 2986007

Vanadiy777,
В WinAPI есть функция MessageBoxIndirect, которая позволяет использовать произвольный значок.
Здесь на форуме есть её реализация (ссылка), но неполная -- требуется небольшой допилинг для загрузки своего значка.

Vanadiy777 31-05-2022 18:06 2986015

iglezz, спасибо, буду изучать...
Правда не уверен, что получится, для меня сложновато...

iglezz 31-05-2022 20:19 2986026

Vanadiy777,
Поковырял тот образец, удалось в MessageBoxIndirect отобразить значок из 32/64-бит PE-файла (dll/exe/icl).
ico использовать нельзя.

Пример смогу выложить позже, т.к. код ещё причесать надо.

Vanadiy777 31-05-2022 20:57 2986028

Цитата:

Цитата iglezz
Пример смогу выложить позже, т.к. код ещё причесать надо. »

iglezz, буду Вам очень признателен, если поможете, т.к. сам, видимо, не разберусь...

Мне надо взять два разных значка из одной системной dll, и в зависимости от события вывести этот значок в MsgBox.

iglezz 01-06-2022 14:40 2986061

В итоге получилать такая матрёшка...

Функция MsgBoxEx (на базе MessageBoxIndirect) может служить полной заменой стандартному MsgBox.

MsgBoxEx('Сообщение', 'Заголовок', 0, ЗНАЧОК, ФЛАГИ) - стандартный значок
MsgBoxEx('Сообщение', 'Заголовок', '', ЗНАЧОК, ФЛАГИ) - значок из установщика
MsgBoxEx('Сообщение', 'Заголовок', 'ФАЙЛ', ЗНАЧОК, ФЛАГИ) - значок из 32/64-бит PE-файла (exe/dll/icl/...)

В константах IDI_SHIELD и IDI_APPLICATION два новых значка.

ЗНАЧОК задаётся константой MB_ICON*, IDI_* либо числом, либо 'строкой' ('MAINICON').

Если файл со значком открыть не удаётся, то устанавливается значок IDI_APPLICATION

Коды возврата, флаги, стандартные значки MB_ICON* соответствуют стандартному месседжбоксу.
пример.iss
Код:

#define APPNAME "MessageBoxIndirect test"

[Setup]
AppName={#APPNAME}
AppVersion=0.1
DisableWelcomePage=yes
DefaultDirName={tmp}\{#APPNAME}
OutputDir=.
OutputBaseFilename={#APPNAME}
PrivilegesRequired=lowest


[code]
#include 'WinAPI_MessageBoxIndirect.pas'

procedure initializeWizard();
var
    dllname: String;
    ret: Integer;
begin
    // Standard icons:
    MsgBox('std mbInformation', mbInformation, MB_OK);
    MsgBoxEx('ex IDI_INFORMATION', '{#APPNAME}', 0, IDI_INFORMATION, MB_OK);
    MsgBox('std mbConfirmation', mbConfirmation, MB_OK);
    MsgBoxEx('ex IDI_QUESTION', '{#APPNAME}', 0, IDI_QUESTION, MB_OK);
    MsgBox('std mbError', mbError, MB_OK);
    MsgBoxEx('ex IDI_EXCLAMATION', '{#APPNAME}', 0, IDI_EXCLAMATION, MB_OK);
    MsgBox('std mbCriticalError', mbCriticalError, MB_OK);
    MsgBoxEx('ex IDI_ERROR', '{#APPNAME}', 0, IDI_ERROR, MB_OK);
    MsgBoxEx('ex IDI_SHIELD', '{#APPNAME}', 0, IDI_SHIELD, MB_OK);
    MsgBoxEx('ex IDI_APPLICATION', '{#APPNAME}', 0, IDI_APPLICATION, MB_OK);

    // Icon from installer
    MsgBoxEx('Installer icon', '{#APPNAME}', '', 'MAINICON', MB_OK)

    // Icon from exe/dll file
    dllname := 'C:\Program Files\Totalcmd\TOTALCMD.EXE'
    MsgBoxEx('app icon (text)'#10'from'#10+dllname, '{#APPNAME}', dllname, 'MAINICON', MB_OK)
    MsgBoxEx('app icon (num)'#10'from'#10+dllname, '{#APPNAME}', dllname, 6, MB_OK)

    // Icon from exe/dll file. failed to load.
    MsgBoxEx('LoadLibrary error', '{#APPNAME}', 'x:\notexist', 'MAINICON', MB_OK)

    // Return code test loop
    dllname := 'C:\Windows\SysWOW64\shell32.dll'
    while true do
    begin
        ret := MsgBoxEx('icon from'#10+dllname, '{#APPNAME}', dllname, 337, MB_YESNOCANCEL or MB_DEFBUTTON2);

        case ret of
            IDYES:
                ret := MsgBoxEx('YES'#10#10'Continue?', '{#APPNAME}', dllname, 16802, MB_YESNO);
            IDNO:
                ret := MsgBoxEx('NO'#10#10'Continue?', '{#APPNAME}', dllname, 240, MB_YESNO);
            IDCANCEL:
                ret := MsgBoxEx('CANCEL'#10#10'Continue?', '{#APPNAME}', dllname, 142, MB_YESNO);
        end;
        if ret = IDNO then break;
    end;


    Abort;
end;


подключаемый WinAPI_MessageBoxIndirect.pas
Код:

#ifndef WinAPI_MessageBoxIndirect__pas
#define WinAPI_MessageBoxIndirect__pas


#include 'WinAPI.pas'
#include 'WinAPILoader.pas'

const
    // https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messagebox
    MB_CANCELTRYCONTINUE = $00000006;

    MB_ICONERROR = $00000010;
    MB_ICONSTOP = MB_ICONERROR;
    MB_ICONHAND = MB_ICONERROR;
    MB_ICONQUESTION = $00000020;
    MB_ICONWARNING = $00000030;
    MB_ICONEXCLAMATION = MB_ICONWARNING;
    MB_ICONINFORMATION = $00000040;
    MB_ICONASTERISK = MB_ICONINFORMATION;
    MB_USERICON = $00000080;

    // https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-loadiconw
    IDI_APPLICATION = 32512;
    IDI_INFORMATION = 32516;
    IDI_ASTERISK = IDI_INFORMATION;
    IDI_ERROR = 32513;
    IDI_HAND = IDI_ERROR;
    IDI_WARNING = 32515;
    IDI_EXCLAMATION = IDI_WARNING;
    IDI_QUESTION = 32514;
    IDI_SHIELD = 32518;

    IDTRYAGAIN = 10;
    IDCONTINUE = 11;

type
   
    // MSGBOXPARAMSW structure
    // https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-msgboxparamsw
    // lpszIcon - string type
    _WinAPI_tagMSGBOXPARAMS_S = record
        cbSize: UINT;
        hwndOwner: HWND;
        hInstance: HINST;
        lpszText: String;
        lpszCaption: String;
        dwStyle: DWORD;
        lpszIcon: String;
        dwContextHelpId: DWORD_PTR;
        lpfnMsgBoxCallback: Pointer;
        dwLanguageId: DWORD;
    end;
    // lpszIcon - numeric type
    _WinAPI_tagMSGBOXPARAMS_N = record
        cbSize: UINT;
        hwndOwner: HWND;
        hInstance: HINST;
        lpszText: String;
        lpszCaption: String;
        dwStyle: DWORD;
        lpszIcon: DWORD;
        dwContextHelpId: DWORD_PTR;
        lpfnMsgBoxCallback: Pointer;
        dwLanguageId: DWORD;
    end;


//  https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messageboxindirectw
function _WinAPI_MessageBoxIndirect_S(const MsgBoxParams: _WinAPI_tagMSGBOXPARAMS_S): Integer; external 'MessageBoxIndirectW@user32.dll stdcall';

function _WinAPI_MessageBoxIndirect_N(const MsgBoxParams: _WinAPI_tagMSGBOXPARAMS_N): Integer; external 'MessageBoxIndirectW@user32.dll stdcall';




function MsgBoxExNI(
                    const Text: String;
                    const Caption: String;
                    const hInstance: HINST;
                    const IconNumber: DWORD;
                    const Flags: DWORD
                    ): Integer;
var
    mp: _WinAPI_tagMSGBOXPARAMS_N;
begin
    mp.cbSize := SizeOf(mp);
    mp.hInstance := hInstance;
    mp.lpszText := Text;
    mp.lpszCaption := Caption;

    if (IconNumber < IDI_APPLICATION) and (hInstance = 0) then
        mp.dwStyle := Flags or IconNumber
    else
    begin
        mp.dwStyle := Flags or MB_USERICON;
        mp.lpszIcon := IconNumber;
    end;

    Result := _WinAPI_MessageBoxIndirect_N(mp);
end;


function MsgBoxExSI(
                    const Text: String;
                    const Caption: String;
                    const hInstance: HINST;
                    const IconName: String;
                    const Flags: DWORD
                    ): Integer;
var
    mp: _WinAPI_tagMSGBOXPARAMS_S;
begin
    mp.cbSize := SizeOf(mp);
    mp.hInstance := hInstance;
    mp.lpszText := Text;
    mp.lpszCaption := Caption;
    mp.dwStyle := Flags or MB_USERICON;
    mp.lpszIcon := IconName;

    Result := _WinAPI_MessageBoxIndirect_S(mp);
end;

(* function MsgBoxEx


    Text: `Messagebox text`

    Caption: `Messagebox caption`

    IconSource: 0      -- standard icons: MB_ICON*, IDI_*
              : ''    -- load icon from INSTALLER_EXE
              : 'FILE' -- load icon from FILE

    IconID: MB_ICON*, IDI_* -- if IconSource = 0
          : <icon name/number> if IconSource = '*'

    Flags:  MB_OK, MB_OKCANCEL, MB_ABORTRETRYIGNORE, MB_YESNOCANCEL, MB_YESNO,
            MB_RETRYCANCEL, MB_CANCELTRYCONTINUE,
            MB_DEFBUTTON1, MB_DEFBUTTON2, MB_DEFBUTTON3, MB_SETFOREGROUND


    Return: IDOK, IDCANCEL, IDABORT, IDRETRY, IDIGNORE, IDYES, IDNO, IDTRYAGAIN, IDCONTINUE
*)
function MsgBoxEx(
                  const Text: String;
                  const Caption: String;
                  const IconSource: Variant;
                  const IconID: Variant;
                  const Flags: DWORD
                ): Integer;
var
    hInstance: HINST;
    UsedIconID: Variant;
begin
    hInstance := 0;
    UsedIconID := IconID;

    if VarType(IconSource) <> varInteger then
    begin
        if IconSource = '' then
            hInstance := _WinAPI_GetModuleHandle('')
        else
            hInstance := _WinAPI_LoadLibraryEx(IconSource, 0, LOAD_LIBRARY_AS_IMAGE_RESOURCE);

        if hInstance = 0 then
            UsedIconID := IDI_APPLICATION // fallback to 'defaulticon'
    end;

    if VarType(UsedIconID) = varInteger then
        Result := MsgBoxExNI(Text, Caption, hInstance, UsedIconID, Flags)
    else
        Result := MsgBoxExSI(Text, Caption, hInstance, UsedIconID, Flags);

    if (hInstance > 0) and (IconSource <> '') then _WinAPI_FreeLibrary(hInstance);
end;


#endif


подключаемый WinAPILoader.pas
Код:

#ifndef WinAPILoader__pas
#define WinAPILoader__pas


#include 'WinAPI.pas'

const
    LOAD_LIBRARY_AS_IMAGE_RESOURCE = $20;
    LOAD_LIBRARY_AS_DATAFILE = $2;

// https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibraryexw
function _WinAPI_LoadLibraryEx(const lpLibFileName: String; const Zero: Integer; const dwFlags: DWORD): HINST; external 'LoadLibraryExW@Kernel32.dll stdcall';

// https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-freelibrary
function _WinAPI_FreeLibrary(const hLibModule: HINST): Boolean; external 'FreeLibrary@Kernel32.dll stdcall';

// https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getmodulehandlew
function _WinAPI_GetModuleHandle(const ModuleName: String): HINST; external 'GetModuleHandleW@Kernel32.dll stdcall';


#endif


подключаемый WinAPI.pas
Код:

#ifndef WinAPI__pas
#define WinAPI__pas


type
    Pointer = Longint;

    HINST = THandle;


#endif



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

Vanadiy777 08-06-2022 00:26 2986370

iglezz,
Пример собрал, прикрутил все подключаемые модули. Все отрабатывает как надо.
Попробовал прикрутить к своему скрипту - отрабатывает окно MsgBoxEx, т.е. выскакивает второе окошко, но, ни заголовок окна, ни значок в окне не отображаются.
При этом все флаги отрабатывают. Т.е., функционал весь и работоспособность сохраняются.

Возможно, возникает конфликт с моим, имеющемся кодом...
Буду разбираться...

iglezz, Вам, от всей души, огромное спасибо за предоставленный материал и примеры!

Vanadiy777 10-06-2022 15:28 2986470

iglezz,
Разобрался в чем у меня была ошибка.
Все получилось и замечательно работает!
Цитата:

Цитата iglezz
ico/icl использовать нельзя. »

Свою icl можно тоже использовать, заменив расширение на dll, у меня в таком варианте тоже заработало.

Еще раз - сердечное спасибо Вам! :Beer:

iglezz 10-06-2022 16:06 2986473

Vanadiy777,
По .icl я ошибся, давно с ними дела не имел.
В общем, icl - это просто исполняемый файл с ресурсами Icon внутри.
32/64-бит PE-файлы можно использовать, старинные 16-бит NE-файлы -- нельзя.
Переименовывать необязательно.

ЗЫ Свои посты выше обновил с учётом этой информации

ZVSRus 11-06-2022 14:26 2986488

iglezz
Есть ли в вашем примере возможность менять размер иконки, например с 32х32 на 48х48 или 64х64

iglezz 11-06-2022 14:29 2986489

ZVSRus,
Нет, такое не предусмотрено.

ZVSRus 11-06-2022 14:40 2986492

iglezz
ОК. Всё понял. А жаль.

Vanadiy777 11-06-2022 14:53 2986494

iglezz,
проверил с .icl не изменяя расширение, тоже все нормально отработало.
icl собирал в ArtIcons.

Спасибо Вам, добрый человек!

serg5 05-07-2022 18:48 2987890

Скрипт для двух .exe в одном инсталляторе.
Чтобы можно было выбирать какую программу устанавливать.
Может кто подскажет ?

Vanadiy777 05-07-2022 22:50 2987901

serg5,
Вот простейший пример:
Код:

[Setup]
AppName=My Prog
AppVerName=My Prog
AppVersion=1.5
DefaultDirName={tmp}
OutputBaseFilename=My Setup
Uninstallable=no
DisableProgramGroupPage=True
DisableDirPage=True
DisableReadyPage=True
DisableReadyMemo=True
DisableFinishedPage=True
ShowLanguageDialog=Auto

[Languages]
Name: EN; MessagesFile: compiler:Default.isl
Name: RU; MessagesFile: compiler:Languages\Russian.isl

[Tasks]
Name: "MyProg1"; Description: "Моя программа 1"; Flags: unchecked;
Name: "MyProg2"; Description: "Моя программа 2"; Flags: unchecked;

[Files]
Source: MyProg1.exe; DestDir: {app}; Flags: ignoreversion; Tasks: MyProg1;
Source: MyProg2.exe; DestDir: {app}; Flags: ignoreversion; Tasks: MyProg2;


[Run]
Filename: "{app}\MyProg1.exe.exe"; Parameters: "Сюда добавляете ключи для установки программы"; Flags: waituntilterminated; Tasks: MyProg1;
Filename: "{app}\MyProg2.exe.exe"; Parameters: "Сюда добавляете ключи для установки программы"; Flags: waituntilterminated; Tasks: MyProg2;


serg5 06-07-2022 11:49 2987935

Цитата:

Цитата Vanadiy777
Вот простейший пример: »

Если нужны разные пути для установки ?
В "setup" прописывается только один путь..

Vanadiy777 06-07-2022 12:16 2987938

Цитата:

Цитата serg5
В "setup" прописывается только один путь.. »

serg5,
ну так правильно, прописана временная папка. Оттуда уже запускается установщик той программы, которую Вы выбрали для установки.
Или не это было нужно?
Цитата:

Цитата serg5
Скрипт для двух .exe в одном инсталляторе.
Чтобы можно было выбирать какую программу устанавливать. »


serg5 06-07-2022 12:36 2987942

Цитата:

Цитата Vanadiy777
ну так правильно, прописана временная папка. Оттуда уже запускается установщик той программы, которую Вы выбрали для установки.
Или не это было нужно? »

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

ZVSRus 06-07-2022 14:53 2987958

Цитата:

Цитата serg5
Скрипт для двух .exe в одном инсталляторе.
Чтобы можно было выбирать какую программу устанавливать.
Может кто подскажет ?

Что подразумевается под словом Скрипт для двух .exe в одном инсталляторе., установка сразу двух программ одновременно, или же с выбором, установка или первой или второй по отдельности.

serg5 06-07-2022 15:05 2987963

Цитата:

Цитата ZVSRus
Что подразумевается под словом Скрипт для двух .exe в одном инсталляторе., установка сразу двух программ одновременно, или же с выбором, установка или первой или второй по отдельности. »

В этом случае по отдельности.

ZVSRus 06-07-2022 15:15 2987965

Цитата:

Цитата serg5
В этом случае по отдельности.

Пример

Код:

#define MyAppName_1 "Программа 1"
 #define MyAppName_2 "Программа 2"

[Setup]
 AppName=My Program
 AppVerName=My Program v 1.7
 DefaultDirName={pf}\Программа 1
 OutputDir=.

[Files]
 Source: compiler:Examples\MyProg1.exe; DestDir: {app}; Check: IsChecked_1; Flags: ignoreversion;
 Source: compiler:Examples\MyProg2.exe; DestDir: {app}; Check: IsChecked_2; Flags: ignoreversion;

[Code__]
var
  Check: array [0..1] of TCheckBox;

procedure Check0(Sender: TObject);
begin
if Check[0].Checked then
begin
  Check[1].Checked := False;
end;

if (Check[0].Checked = False) and (Check[1].Checked = False) then Check[0].Checked := True;
if Check[0].Checked then WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{pf}')) + '{#MyAppName_1}';
end;

procedure Check1(Sender: TObject);
begin
if Check[1].Checked then
begin
  Check[0].Checked := False;
end;

if (Check[0].Checked = False) and (Check[1].Checked = False) then Check[1].Checked := True;
if Check[1].Checked then WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{sd}')) + '{#MyAppName_2}';
end;

//--------------------------------------------------\\
function IsChecked_1: boolean;
begin
        Result:= Check[0].Checked;
end;
//--------------------------------------------------\\
function IsChecked_2: boolean;
begin
        Result:= Check[1].Checked;
end;
//--------------------------------------------------\\

procedure InitializeWizard();
begin
Check[0] := TCheckBox.Create(WizardForm);
  with Check[0] do
  begin
    Parent := WizardForm.SelectDirPage;
    Checked := True;
    Top := ScaleY(120);
    OnClick := @Check0;
    Caption := 'Программа 1';
  end;

Check[1] := TCheckBox.Create(WizardForm);
  with Check[1] do
  begin
    Parent := WizardForm.SelectDirPage;
    Top := ScaleY(150);
    OnClick := @Check1;
    Caption := 'Программа 2';
  end;
end;


serg5 06-07-2022 16:04 2987970

Вложений: 1
Цитата:

Цитата ZVSRus
Пример »

Ошибка.. Файл 166872
Удалил секцию "Files" чтобы посмотреть окна визуально.
Открывается только одно окно инсталлировать не указано что.
Без указания пути.

ZVSRus 06-07-2022 16:18 2987974

serg5,

[Code__] убери черту

serg5 06-07-2022 16:25 2987975

Вложений: 1
Цитата:

Цитата ZVSRus
[Code__] убери черту »

Ошибка пропала,но в остальном тоже самое"Открывается только одно окно инсталлировать не указано что.
Без указания пути." Файл 166873

ZVSRus 06-07-2022 16:35 2987977

serg5,
По картинке вижу что версия компилятора 6.
Покажите секцию [Setup]

serg5 06-07-2022 16:56 2987979

Цитата:

Цитата ZVSRus
По картинке вижу что версия компилятора 6.
Покажите секцию [Setup] »

[Setup]
AppName=My Program
AppVerName=My Program v 1.7
DefaultDirName={pf}\Программа 1
OutputDir=.

Всё с вашего кода.

ZVSRus 06-07-2022 17:27 2987982

Вложений: 1
http://forum.oszone.net/attachment.p...1&d=1657113738

Настрой свой компилятор, в 6 версиях какие-то страницы отключены по умолчанию.

serg5 06-07-2022 17:39 2987984

Цитата:

Цитата ZVSRus
Настрой свой компилятор, в 6 версиях какие-то страницы отключены по умолчанию. »

У вас какая версия ?
Попробовал несколько 5-х версий,тоже самое..
В 4-й просто ошибка.

ZVSRus 06-07-2022 17:49 2987985

Расширенная Inno Setup 5.5.1.ee2 Ultra Unicode от китайцев

Добавь в секцию [Setup] это
DisableDirPage=no
DisableWelcomePage=no

Flix 06-07-2022 18:00 2987986

serg5, скопируйте приведенный текст сценария полностью! Вы используете только часть кода. Это видно по ошибке на вашем скрине.

serg5 06-07-2022 18:20 2987987

Цитата:

Цитата ZVSRus
Расширенная Inno Setup 5.5.1.ee2 Ultra Unicode от китайцев »

В этой версии от китайцев сработало.

Цитата:

Цитата ZVSRus
Добавь в секцию [Setup] это
DisableDirPage=no
DisableWelcomePage=no »

С этим доп-ем сработало и в 6.х

serg5 07-07-2022 10:45 2988006

Вложений: 1
Чем можно заменить "{cm:CreateStartMenuIcon} " при создании задания в [Tasks]?
Ошибка вылазит Файл 166878

Код:

Name: "startmenuicon"; Description: "{cm:CreateStartMenuIcon}"; GroupDescription: "{cm: AdditionalIcons}"; Check: IsChecked_1

Vanadiy777 07-07-2022 11:14 2988007

Цитата:

Цитата serg5
Чем можно заменить "{cm:CreateStartMenuIcon} " »

serg5,
Можете стазу свой текст прописать.
А у Вас в секции [CustomMessages] вообще что то прописано?

serg5 07-07-2022 11:18 2988008

Цитата:

Цитата Vanadiy777
Можете стазу свой текст прописать.
А у Вас в секции [CustomMessages] вообще что то прописано? »

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

Vanadiy777 07-07-2022 11:29 2988009

Цитата:

Цитата serg5
Необходимо чтобы в одной программе создавался ярлык в меню пуск, в другой нет. »

serg5,
Это ради бога...

Я Вас не об этом спросил...
Вы вставляете константу {cm:CreateStartMenuIcon}, которая ссылается на секцию сценария [CustomMessages],
а там у Вас ничего не прописано, отсюда и ошибка компилятора.
Тоже самое произойдет и с GroupDescription: "{cm: AdditionalIcons}".

Поэтому надо или сразу свой текст прописать вместо константы, или добавить записи в секцию [CustomMessages]

serg5 07-07-2022 11:37 2988010

Цитата:

Цитата Vanadiy777
Вы вставляете константу {cm:CreateStartMenuIcon}, которая ссылается на секцию сценария [CustomMessages],
а там у Вас ничего не прописано, отсюда и ошибка компилятора.
Тоже самое произойдет и с GroupDescription: "{cm: AdditionalIcons}".
Поэтому надо или сразу свой текст прописать, или добавить записи в секцию [CustomMessages] »

С [CustomMessages] нормально, т.е. с появление выбора, создавать ярлык в меню пуск или нет.
А без выбора ,чтобы по-умолчанию?
Так как если оставить для обеих программ создание ярлыков в меню пуск,тогда не спрашивает.

Vanadiy777 07-07-2022 11:55 2988013

serg5,
добавьте в скрипт и попробуйте:
Код:

[CustomMessages]
AdditionalIcons=Дополнительные значки:
CreateStartMenuIcon=Создать значок в меню &Пуск

тогда константы можно оставить

И секции [Icons] и [Tasks] покажите полностью.

ZVSRus 07-07-2022 11:59 2988015

serg5,
[CustomMessages]
CreateStartMenuIcon=Создать ярлык(и) в меню «Пуск»

[Tasks]
Name: "startmenuicon"; Description: "{cm:CreateStartMenuIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

Вы поясните какие программы хотите запихнуть в свой установщик?
Подозреваю что хотите запихнуть стационарную и портативную.
А вообще то для ярлыков есть секция [Icons]

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

serg5 07-07-2022 12:02 2988016

Цитата:

Цитата Vanadiy777
И секцию [Icons] покажите. »

[Icons]
Name: "{autodesktop}\{#MyAppName_1}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{autoprograms}\{#MyAppName_1}"; Filename: "{app}\{#MyAppExeName}"; Tasks: startmenuicon

с {group} и {commondesktop} вместо {autodesktop}; {autoprograms} ошибки

Цитата:

Цитата ZVSRus
Вы поясните какие программы хотите запихнуть в свой установщик?
Подозреваю что хотите запихнуть стационарную и портативную. »

Да.

ZVSRus 07-07-2022 12:23 2988019

serg5,
Я так сразу и подозревал, только для этих целей думаю надо отказаться от секции [Tasks], а создать костомную страницу и уже на ней размещать все ваши хотелки, так как кроме стандартных ярлыков захотите что то ещё разместить.
Выбор установки стандартной версии или распаковки портативной версии на какой то стандартной странице будет смотреться не очень. Переупаковщики программ делают на отдельной кастомной странице. RePack (& Portable) by версий программ в сети валом, присмотритесь и определитесь для себя.

serg5 07-07-2022 12:44 2988021

Цитата:

Цитата ZVSRus
Я так сразу и подозревал, только для этих целей думаю надо отказаться от секции [Tasks], а создать костомную страницу и уже на ней размещать все ваши хотелки, так как кроме стандартных ярлыков захотите что то ещё разместить.
Выбор установки стандартной версии или распаковки портативной версии на какой то стандартной странице будет смотреться не очень. Переупаковщики программ делают на отдельной кастомной странице. RePack (& Portable) by версий программ в сети валом, присмотритесь и определитесь для себя. »

Т.е. на стандартной странице без выбора создания ярлыка в меню Пуск,(чтобы по умолчанию),секции [CustomMessages]не получится? Как и применение без этого "Check: IsChecked".

serg5 07-07-2022 14:00 2988031

Ещё вопрос "Требуемое место на диске" как прописать для двух программ по отдельности соответственно, без разделения на компоненты, и типы установки т.е. полная,минимальная и т.д.?

Vanadiy777 07-07-2022 14:20 2988033

Цитата:

Цитата serg5
Ещё вопрос "Требуемое место на диске" как прописать для двух программ по отдельности соответственно, без разделения на компоненты, и типы установки т.е. полная,минимальная и т.д.? »

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

А как хорошо все начиналось:
Цитата:

Цитата serg5
Скрипт для двух .exe в одном инсталляторе.
Чтобы можно было выбирать какую программу устанавливать.
Может кто подскажет ? »

Или аппетит приходит во время еды?

Извините, ничего личного.

ZVSRus 07-07-2022 14:37 2988038

Цитата:

Цитата serg5
Т.е. на стандартной странице без выбора создания ярлыка в меню Пуск,(чтобы по умолчанию),секции [CustomMessages]не получится? Как и применение без этого "Check: IsChecked".

Ну почему же не получится, получиться, просто я написал потому что в дальнейшем вам захочется ещё какой то чекбокс разместить, а места уже не будет хватать на странице.
Check: IsChecked это проверочная функция, IsChecked - это внутреннее название функции, оно может быть любое (по английски).
Можно и без неё, но ярлыки будут устанавливаться и при распаковке портативной программы, а это не к чему.

serg5 07-07-2022 14:49 2988043

Цитата:

Цитата ZVSRus
Ну почему же не получится, получиться, просто я написал потому что в дальнейшем вам захочется ещё какой то чекбокс разместить, а места уже не будет хватать на странице.
Check: IsChecked это проверочная функция, IsChecked - это внутреннее название функции, оно может быть любое (по английски).
Можно и без неё, но ярлыки будут устанавливаться и при распаковке портативной программы, а это не к чему. »

А как в вашем коде прописать данные для "Требуемое место на диске" для двух программ по отдельности соответственно ?
И если вернуться к вопросу "Как сделать ярлык в меню пуск,без выбора создания ярлыка в меню Пуск,(чтобы по умолчанию) создавался,только для одной программы?
Цитата:

Цитата Vanadiy777
Вы, или полностью свой скрипт дайте, чтобы было понятно, или мат. часть учите... »

Код:

#define MyAppName_1 "Программа 1"
 #define MyAppName_2 "Программа 2"

[Setup]
 AppName=My Program
 AppVerName=My Program v 1.7
 DefaultDirName={pf}\Программа 1
 OutputDir=.

[Files]
 Source: compiler:Examples\MyProg1.exe; DestDir: {app}; Check: IsChecked_1; Flags: ignoreversion;
 Source: compiler:Examples\MyProg2.exe; DestDir: {app}; Check: IsChecked_2; Flags: ignoreversion;

[Code__]
var
  Check: array [0..1] of TCheckBox;

procedure Check0(Sender: TObject);
begin
if Check[0].Checked then
begin
  Check[1].Checked := False;
end;

if (Check[0].Checked = False) and (Check[1].Checked = False) then Check[0].Checked := True;
if Check[0].Checked then WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{pf}')) + '{#MyAppName_1}';
end;

procedure Check1(Sender: TObject);
begin
if Check[1].Checked then
begin
  Check[0].Checked := False;
end;

if (Check[0].Checked = False) and (Check[1].Checked = False) then Check[1].Checked := True;
if Check[1].Checked then WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{sd}')) + '{#MyAppName_2}';
end;

//--------------------------------------------------\\
function IsChecked_1: boolean;
begin
        Result:= Check[0].Checked;
end;
//--------------------------------------------------\\
function IsChecked_2: boolean;
begin
        Result:= Check[1].Checked;
end;
//--------------------------------------------------\\

procedure InitializeWizard();
begin
Check[0] := TCheckBox.Create(WizardForm);
  with Check[0] do
  begin
    Parent := WizardForm.SelectDirPage;
    Checked := True;
    Top := ScaleY(120);
    OnClick := @Check0;
    Caption := 'Программа 1';
  end;

Check[1] := TCheckBox.Create(WizardForm);
  with Check[1] do
  begin
    Parent := WizardForm.SelectDirPage;
    Top := ScaleY(150);
    OnClick := @Check1;
    Caption := 'Программа 2';
  end;
end;

Цитата:

Цитата Vanadiy777
Или аппетит приходит во время еды? »

Просто люди реально знают, а не банальные флудеры.
Да и другим будет познавательно.

ZVSRus 07-07-2022 15:07 2988046

Пример

Цитата:

Цитата serg5
А как в вашем коде прописать данные для "Требуемое место на диске" для двух программ по отдельности соответственно ?

Я никогда этого не делал, потому что для переупаковки программ не считаю нужным, не такие уж ёмкие программы. Для переупаковки игрушек, там да(несколько гигов). Ну всё на любителя, как говориться о вкусах не спорят. Примеров на форумах много.

Vanadiy777 07-07-2022 15:09 2988048

serg5,
Зачем Вы даете скрипт, который предоставил коллега ZVSRus? Я его уже видел...

Свой скрипт весь давайте, с [Tasks], [Icons] и т.д.

serg5 07-07-2022 17:10 2988060

Всем спс.

Vanadiy777 10-07-2022 20:57 2988240

Коллеги, подскажите пожалуйста...
Не могу понять, как надо прописать...
Паскаль не знаю от слова - абсолютно...

Надо запустить regedit с параметрами:
Код:

Exec(ExpandConstant('{win}\regedit.exe'), ' /S ''{app}\MyRegOff.reg''', '', SW_HIDE, ewWaitUntilTerminated, LResultCode);
Так не работает...

Как правильно параметры прописать?

Пните, пожалуйста, в нужном направлении

iglezz 10-07-2022 22:00 2988244

Vanadiy777,
Путь в одинарных кавычках не прокатит, нужны двойные:
Код:

"{app}\MyRegOff.reg"

Vanadiy777 10-07-2022 22:13 2988248

Цитата:

Цитата iglezz
Путь в одинарных кавычках не прокатит, нужны двойные: »

iglezz,
Так тоже пробовал - не работает...
Может тоже "ExpandConstant" в путях нужна до рег-файла?
Но как прописать не могу понять - пишет "ошибка синтаксиса"...

iglezz 10-07-2022 22:41 2988249

Vanadiy777,
Ну да, ExpandConstant нужен, раз константы присутствуют.
Код:

Exec(ExpandConstant('{win}\regedit.exe'), '/S '+ExpandConstant('"{app}\MyRegOff.reg"'), '', SW_HIDE, ewWaitUntilTerminated, LResultCode);

serg5 19-07-2022 16:39 2988809

Может у кого-то было ,при прописке создания иконки в меню пуск, предлагает (Default),вместо имени при инсталляции.
Код:

Name: "{group}\{#MyAppDisplayName}";      Filename: "{app}\{#MyAppExeName}"; MinVersion: 0.0,5.0; Check: PuskIconCheck and InstallerCheck;
 Name: "{group}\Удалить {#MyAppDisplayName}";  Filename: "{uninstallexe}"; MinVersion: 0.0,5.0; Check: PuskIconCheck and InstallerCheck;
 Name: "{commondesktop}\{#MyAppDisplayName}"; Filename: "{app}\{#MyAppExeName}"; MinVersion: 0.0,5.0; Check: DesktopIconCheck and InstallerCheck;

В частности при попытке упаковать два .exe (стационарную и portable версии) в один инсталлятор.При инсталяции обычной версии пишет (Default) вместо имени.При распаковке портабл тоже предлагает сделать иконку в меню пуск с этим же именем (Default),хотя здесь он вообще не должен этого предлагать.Check работает нормально на установку файлов, а с иконками что-то не так...
Весь код:

Код:

#define MyAppName "Моя стационарная программа"
 #define MyAppNamePortable "Моя программа Portable"

 #define MyAppExeName "MyProg1.exe"
 #define MyAppDisplayName "MyProg1"

 #define MyAppDirName "Моя стационарная программа"
 #define MyAppConstantName "{pf}"

[Setup]
 AppName={#MyAppName}
 AppVerName=1.7
 DefaultDirName={code:GetInstallDir|{#MyAppConstantName}\{#MyAppDirName}}

 OutputDir=.

 Uninstallable=not PortableCheck

 DisableDirPage=no
 DisableWelcomePage=no

 UsePreviousAppDir=no

[Icons]
 Name: "{group}\{#MyAppDisplayName}";      Filename: "{app}\{#MyAppExeName}"; MinVersion: 0.0,5.0; Check: PuskIconCheck and InstallerCheck;
 Name: "{group}\Удалить {#MyAppDisplayName}";  Filename: "{uninstallexe}"; MinVersion: 0.0,5.0; Check: PuskIconCheck and InstallerCheck;
 Name: "{commondesktop}\{#MyAppDisplayName}"; Filename: "{app}\{#MyAppExeName}"; MinVersion: 0.0,5.0; Check: DesktopIconCheck and InstallerCheck;


[Files]
 Source: compiler:Examples\MyProg1.exe; DestDir: {app}; Check: InstallerCheck; Flags: ignoreversion;
 Source: compiler:Examples\MyProg2.exe; DestDir: {app}; Check: PortableCheck; Flags: ignoreversion;

[Code ]
var
  ComponentPage: TWizardPage;
  InstallerGroupBox: TNewGroupBox;
  Installer: TNewRadioButton;
  Portable: TNewRadioButton;
  IconGroupBox: TNewGroupBox;
  PuskIcon: TNewCheckBox;
  DesktopIcon: TNewCheckBox;
  PanelZadash: TNewCheckBox;


function CheckParam(s: string): boolean;                 
 var                                                     
  i: integer;                                           
 begin                                                   
 for i := 0 to ParamCount do begin                       
  Result := ParamStr(i) = s;                           
 if Result then Break;                                   
  end;                                                   
 end;                                                   
//--------------------------------------------------------//
function GetInstallDir(S: String): String;               
 begin                                                   
  if CheckParam('/P') then                               
    Result:= ExpandConstant('{src}\{#MyAppNamePortable}')
  else                                                   
    Result:= ExpandConstant(S);                         
 end;                                                   


function InstallerCheck: Boolean;                       
 begin                                                   
  Result := Installer.Checked or CheckParam('/I');     
 end;                                                   
//--------------------------------------------------------//
function PortableCheck: Boolean;                         
 begin                                                   
  Result := Portable.Checked or CheckParam('/P');       
 end;                                                   


function DesktopIconCheck: Boolean;                     
 begin                                                   
  Result:= DesktopIcon.Checked;                         
 end;                                                   
//--------------------------------------------------------//
function PuskIconCheck: Boolean;                         
 begin                                                   
  Result:= PuskIcon.Checked;                           
 end;                                                   
//--------------------------------------------------------//
function PanelZadashCheck: Boolean;                     
 begin                                                 
  Result:= PanelZadash.Checked;                         
 end;                                                   


procedure CompClick(Sender: TObject);                   
begin                                                   
 case TNewRadioButton(Sender) of                         
  Portable:                                             
 begin
//--------------------------------------------------------//
  DesktopIcon.Checked    := False;                     
  DesktopIcon.Enabled    := DesktopIcon.Checked;       
  PuskIcon.Checked        := False;                     
  PuskIcon.Enabled        := PuskIcon.Checked;           
  PanelZadash.Checked    := False;                     
  PanelZadash.Enabled    := PanelZadash.Checked;       
//--------------------------------------------------------//
  WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{src}')) + '{#MyAppNamePortable}';
  WizardForm.Caption      := FmtMessage(ExpandConstant('Распаковка — %1'), [ExpandConstant('Моя программа Portable')]);
 end;                                                   

  Installer:                                             
 begin                                                   
//--------------------------------------------------------//
  DesktopIcon.Checked    := True;                       
  DesktopIcon.Enabled    := DesktopIcon.Checked;       
  PuskIcon.Checked        := True;                       
  PuskIcon.Enabled        := PuskIcon.Checked;           
  PanelZadash.Checked    := False;                     
  PanelZadash.Enabled    := True;                       
//--------------------------------------------------------//
  WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{#MyAppConstantName}')) + '{#MyAppDirName}';
  WizardForm.Caption      := FmtMessage(SetupMessage(msgSetupWindowTitle), [ExpandConstant('{#SetupSetting("AppName")}')]);
  end;                                                   
 end;                                                   
end;                                                   


procedure InitializeWizard();
begin
  ComponentPage := CreateCustomPage(wpUserInfo, 'Выбор типа установки', '. . .');
  WizardForm.DirEdit.Text:= ExpandConstant('{code:GetInstallDir|{#MyAppConstantName}\{#MyAppDirName}}');

  InstallerGroupBox := TNewGroupBox.Create(WizardForm);
  with InstallerGroupBox do
  begin
    Parent := ComponentPage.Surface;
    Left := ScaleX(0);
    Top := ScaleY(10);
    Width := ScaleX(210);
    Height := ScaleY(60);
    Caption := 'Тип установки:';
  end;

  Portable := TNewRadioButton.Create(WizardForm);
  with Portable do
  begin
    Parent := InstallerGroupBox;
    Left := ScaleX(10);
    Top := ScaleY(35);
    Width := ScaleX(210);
    Height := ScaleY(17);
    Caption := 'Распаковка портативной версии';
    Checked    := CheckParam('/P');
    OnClick := @CompClick;
  end;

  IconGroupBox := TNewGroupBox.Create(WizardForm);
  with IconGroupBox do
  begin
    Parent := ComponentPage.Surface;
    Left := ScaleX(0);
    Top := ScaleY(80);
    Width := ScaleX(210);
    Height := ScaleY(80);
    Caption := 'Ярлыки программы:';
  end;

  PuskIcon := TNewCheckBox.Create(WizardForm);
  with PuskIcon do
  begin
    Parent := IconGroupBox;
    Left := ScaleX(10);
    Top := ScaleY(15);
    Width := ScaleX(210);
    Height := ScaleY(17);
    Caption := 'Ярлык(и) в меню «Пуск»';
    Checked := True;
    State := cbChecked;
  end;

  DesktopIcon := TNewCheckBox.Create(WizardForm);
  with DesktopIcon do
  begin
    Parent := IconGroupBox;
    Left := ScaleX(10);
    Top := ScaleY(35);
    Width := ScaleX(210);
    Height := ScaleY(17);
    Caption := 'Ярлык(и) на «Рабочем столе»';
    Checked := True;
    State := cbChecked;
  end;

  PanelZadash := TNewCheckBox.Create(WizardForm);
  with PanelZadash do
  begin
    Parent := IconGroupBox;
    Left := ScaleX(10);
    Top := ScaleY(55);
    Width := ScaleX(210);
    Height := ScaleY(17);
    Caption := 'Закрепить ярлык в «Панели задач»';
  end;

  Installer := TNewRadioButton.Create(WizardForm);
  with Installer do
  begin
    Parent := InstallerGroupBox;
    Left := ScaleX(10);
    Top := ScaleY(15);
    Width := ScaleX(210);
    Height := ScaleY(17);
    Caption := 'Установка стационарной версии';
    Checked := not CheckParam('/P');
    OnClick := @CompClick;
  end;
end;

Пробовал другой подобный код..тоже самое. С одним .exe нормально.
В чём может быть причина..

ZVSRus 19-07-2022 17:15 2988813

[Setup]
DefaultGroupName={#MyAppName}

serg5 19-07-2022 17:20 2988815

Цитата:

Цитата ZVSRus
[Setup]
DefaultGroupName={#MyAppName} »

хорошо.
только при выборе распаковки портабл версии всё также предлагает иконку в меню пуск...
как её оттуда убрать..
Может надо как-то Check по другому указывать?
Или в таком случае аргумента какого-то не хватает?

ZVSRus 19-07-2022 19:04 2988822

serg5,
У вас в секции [Setup] включена страница DefaultGroupName={#MyAppName} (страница программной группы), если для вас показ этой страницы не принципиально то можно эту страницу пропустить.

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID = 8) then
Result:= True;
end;

Тогда страница программной группы показываться не будет, ни при выборе портативной версии, ни при стационарной версии.
Если же хотите при выборе стационарной версии хотите показывать эту страницу, тогда надо химичить, все компоненты программной группы перенести на страницу SelectDirPage, пример в справке есть.
На странице SelectDirPage создаёте панельку и все компоненты с странице SelectProgramGroupPage переносите на эту панельку SelectDirPage, а в процедуре procedure CurPageChanged(CurPageID: Integer); при включеном Portable: скрываете, а при Installer: показываете.

serg5 19-07-2022 19:17 2988823

Цитата:

Цитата ZVSRus
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID = 8) then
Result:= True;
end; »

Не показывается,да.
Только в portable её не должно быть вообще.
Так как там не нужны ярлыки.
А она пытается и в portable ярлык повесить...
Здесь что-то..?.
Потому я писал выше может быть с Check что-не так?
Или ещё какой-то задачи не хватает?

ZVSRus 19-07-2022 19:50 2988824

Цитата:

Цитата serg5
Только в portable её не должно быть вообще.
Так как там не нужны ярлыки.
А она пытается и в portable ярлык повесить...

Так там их и не будет, потому что у вас в секции [Icons] все ярлыки в меню пуск будут установлены через проверочную функцию InstallerCheck, а это просто показывается страница. Эта страница или показывается или нет.
InnoSetup разработан под одну программу, а не под несколько. Запихать в InnoSetup несколько программ (стационарную и портативную) это уже умельцы придумали (переупаковщики программ)

PS: Вам как нужно, в обязательном порядке, при выборе стационарной версии показывать компоненты программной группы, или же не принципиально.

serg5 19-07-2022 22:52 2988849

Цитата:

Цитата ZVSRus
PS: Вам как нужно, в обязательном порядке, при выборе стационарной версии показывать компоненты программной группы, или же не принципиально. »

Не принципиально.

ZVSRus 20-07-2022 07:17 2988856

serg5,

Если страницу выбора папки в меню пуск совсем не хотите показывать, тогда в секции [Setup] пропишите DisableProgramGroupPage=yes

Если при выборе стационарной версии страницу выбора папки в меню пуск показывать, а при выборе портативной версии нет,
тогда в секции [Setup] уберите или закомментируйте DisableProgramGroupPage=yes, а в скрипте вставь

Код:

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    wpSelectProgramGroup: Result := Portable.Checked <> False;
  end;
end;


serg5 20-07-2022 12:04 2988873

Цитата:

Цитата ZVSRus
Если страницу выбора папки в меню пуск совсем не хотите показывать, тогда в секции [Setup] пропишите DisableProgramGroupPage=yes
Если при выборе стационарной версии страницу выбора папки в меню пуск показывать, а при выборе портативной версии нет,
тогда в секции [Setup] уберите или закомментируйте DisableProgramGroupPage=yes, а в скрипте вставь
Код:
function ShouldSkipPage(PageID: Integer): Boolean;
begin
case PageID of
wpSelectProgramGroup: Result := Portable.Checked <> False;
end;
end; »

Всё Ok.спс.:bow:

tigerheart001 20-09-2022 14:38 2992686

Добрейшего дня, уважаемые форумчане !
Прошу помощи со скриптом.
Ситуация такая.
1. Есть некоторая программа, которая устанавливается без проблем, как положено.
2. Есть дополнения (плагины) к этой программе, которые должны устанавливаться точно в ту же, папку, что и основная программа.
Но проблема в том, что не все пользователи понимают, какую папку нужно выбрать при установке дополнений, и потом жалуются, что, мол, «программа - херня, ничего не работает».
Решение:
Было бы хорошо, если бы установщик основной программы прописывал путь установки в системном реестре, а установщики дополнений потом его оттуда считывали бы.
С первой половиной задачи я справился без труда, добавив в скрипт установки :
Код:

[Registry]
Root: HKLM; Subkey: "SOFTWARE\{#MyAppName}"; ValueType: string; ValueName: "Path"; ValueData: "{app}"

Но вот вторую половину решить никак не получается.
Вот так ничего не работает :
Код:

[Setup]
...
DefaultDirName={reg:HKLM\SOFTWARE\{#MyAppName},Path|{sd}\{#MyAppName}}

( Переменной #MyAppName значение присвоено. )

El Sanchez 20-09-2022 19:12 2992700

Цитата:

Цитата tigerheart001
Вот так ничего не работает : »

tigerheart001, написано правильно, должно работать. Разве что программа пишет путь в 64-разрядный раздел реестра, а установщик дополнений читает из 32-разрядного.

tigerheart001 21-09-2022 10:58 2992774

Цитата:

Цитата El Sanchez
tigerheart001, написано правильно, должно работать. »

Значит вариант «кривые руки» исключаем.
Ок, пошёл тогда копать дальше.
Спасибо за наводку...

EdMSL 08-10-2022 19:40 2993796

Vanadiy777, В продолжение темы http://forum.oszone.net/post-2993783-643.html
Можно ли добавить проверку, что если выбран определенный компонент из [Components], то тогда закрывать Ситм, иначе нет?
P.S. Вопрос снят, решение найдено.

Vanadiy777 08-10-2022 20:27 2993798

EdMSL,
Скрытый текст
Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
i: integer;

begin
 if CurStep = ssInstall then
  begin
// Компоненты пишем свои, если их несколько, то перечисляем, в зависимости от условий - "or" или "and"
// Здесь задается условие: если выбран компонент "Steam" и найден запущенный процесс "Steam" - то процесс будет "прибит"
  if IsComponentSelected('Steam') and IsProcessRunning('Steam.exe') then
    Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM Steam.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
  end;
end;



P.S. Опоздал маненько, пока писал ... :)

EdMSL 08-10-2022 20:57 2993800

Цитата:

Цитата Vanadiy777
P.S. Опоздал маненько, пока писал »

Может кому еще пригодится, мало ли. В любом случае спасибо за ответы.

EdMSL 09-10-2022 18:11 2993833

Теперь встал вопрос, как закрывать Стим перед удалением, если ставилась версия именно для Стим. В деинсталяторе не работает IsComponentSelected. Как еще проверить можно? Желательно без записей в реестр, если возможно.
Единственное, что приходит мне на ум, это проверять на наличие файла, специфичного только для Стим версии.

Vanadiy777 09-10-2022 23:33 2993845

Цитата:

Цитата EdMSL
Теперь встал вопрос, как закрывать Стим перед удалением, если ставилась версия именно для Стим. »

EdMSL,
не совсем задача понятна...
Так не пойдет?
Скрытый текст
Код:

[_code]

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
i: integer;

begin
  if CurUninstallStep = usUninstall then
  begin
    if IsProcessRunning('Steam.exe') then
    Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM Steam.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
  end;
end;


EdMSL 10-10-2022 11:02 2993861

Vanadiy777, Поясню. Этот код будет всегда закрывать Стим, когда моя сборка удаляется. Но сборка имеет две версии, стим и нестим. А определяется это на этапе установки сборки путем выбора компонента [Components]. В итоге хотелось бы, чтобы закрывался стим только тогда, когда пользователь установил именно стим версию сборки. Но, как я написал, IsComponentSelected недоступен при удалении, его я использую для определения, закрывать ли стим при установке. В общем, нужно что-то вроде
Код:

if IsComponentSelected('type\steam') and IsProcessRunning('Steam.exe') then
...

но для деинсталятора.

Vanadiy777 10-10-2022 23:13 2993901

Цитата:

Цитата EdMSL
А определяется это на этапе установки сборки путем выбора компонента [Components]. »

EdMSL,
Возможно, предложу сейчас полную херь... :)
При установке программы с выбором компонентов в разделе Uninstall Вашей программы прописывается строковый параметр
Inno Setup: Selected Components, и там должны быть указаны установленные компоненты.
Можно попробовать через RegQueryStringValue считать значение и добавить его в условия при удалении.

Но, полный синтаксис не подскажу, не пользовался...
Буду тоже очень признателен, если коллеги подскажут.

EdMSL 11-10-2022 16:42 2993989

Vanadiy777, да, можно попробовать этот способ. Правда, если пользователь установит сборку повторно, не удалив предыдущую (а это не запрещено, так как сборка автономная), то предыдущая информация затрется новой. Не так критично, но есть такой нюанс.

В общем, написал такое условие:
Код:

if
  (CurUninstallStep = usUninstall)
  and RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{ADF6076C-BDF7-4515-8D60-17F9DBAD5B41}_is1', 'Inno Setup: Selected Components', Value)
  and (Pos('type\steam', Value) > 0)
  and IsProcessRunning('Steam.exe') then
    closeSteam()

Вроде работает.

Vanadiy777 11-10-2022 17:06 2993991

Цитата:

Цитата EdMSL
если пользователь установит сборку повторно, не удалив предыдущую (а это не запрещено, так как сборка автономная), »

EdMSL,
а если запретить повторную установку, пока не удалена старая версия? Не пойдет так?
Что нибудь типа такого:
Скрытый текст
Код:

[_Code]
function InitializeSetup(): Boolean;
begin
  Result:= True;
  if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyProg_is1') then begin
    MsgBox('Для продолжения необходимо удалить старую версию программы', mbError, MB_OK);
  Result:= False;
  end;
end;


EdMSL 11-10-2022 17:57 2993993

Vanadiy777, В принципе, можно и запретить. Возможно это даже полезно будет. Подумаю. За код спасибо, пригодится.

Vanadiy777 11-10-2022 20:19 2994006

Коллеги, всем доброго времени суток!
Помогите решить проблему...
При запуске и отработке программы на редакции Windows 7 Home Basic выскакивает стандартное окно перезагрузки,
т.е. FinishedPage, хотя это все отключено...

Это происходит только на редакции Windows 7 Home Basic, на остальных редакциях Windows 7-11, все отрабатывает нормально.

Возможно ли как-то принудительно "удавить" это окно на Windows 7 Home Basic?
Версия Inno Setup 6.0.5, но пробовал и на 5.6.1
Результат один и тот же...

Подскажите, пожалуйста, кто знает...
За ранее, спасибо.

UPD: Решение найдено, всем спасибо.

serg5 14-10-2022 17:48 2994186

Как правильно прописать выбор нужной разрядности при инсталляции.
Может кто знает ?

Vanadiy777 14-10-2022 18:20 2994191

Цитата:

Цитата serg5
Как правильно прописать выбор нужной разрядности при инсталляции. »

serg5,
разрядности чего?

Если файлов, то как то так:
Код:

[Files]
Source: "{app}\File,1.exe"; DestDir: "{app}"; DestName: "File.exe"; Check: "IsWin64"; Flags: ignoreversion
Source: "{app}\File,2.exe"; DestDir: "{app}"; DestName: "File.exe"; Check: "not IsWin64"; Flags: ignoreversion


serg5 14-10-2022 19:24 2994198

спс.

Цитата:

Цитата Vanadiy777
Если файлов, то как то так:
Код:
[Files]
Source: "{app}\File,1.exe"; DestDir: "{app}"; DestName: "File.exe"; Check: "IsWin64"; Flags: ignoreversion
Source: "{app}\File,2.exe"; DestDir: "{app}"; DestName: "File.exe"; Check: "not IsWin64"; Flags: i »

+

В секции setup:
Код:

[Setup]
ArchitecturesInstallIn64BitMode=x64

как я понял.

Vanadiy777 15-10-2022 00:00 2994213

Цитата:

Цитата serg5
В секции setup:
как я понял.»

Да, все верно.

Если этот параметр у Вас указан:
Код:

[Setup]
DefaultDirName={pf}\MyProgram
ArchitecturesInstallIn64BitMode=x64

то программа будет установлена в C:\Program Files\MyProgram
и ключ деинсталляции будет прописан в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram_is1

Если параметр не указан:
Код:

[Setup]
DefaultDirName={pf}\MyProgram

то программа будет установлена в C:\Program Files (x86)\MyProgram
и тогда ключ деинсталляции будет прописан, соответственно, в HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram_is1

EdMSL 21-10-2022 17:16 2994625

Хочу генерировать путь установки динамически, считывая путь игры из реестра. Если запись в реестре отсутствует, то выдавать предупреждение. Написал так:
Код:

procedure CurPageChanged(CurPageID: Integer);
var sd: string;
begin 
 if CurPageId = wpSelectDir then
  sd := ExpandConstant('{reg:HKLM\SOFTWARE\WOW6432Node\Bethesda Softworks\Oblivion,Installed Path|{#NOT_FOUND}}');

  if sd = '{#NOT_FOUND}' then
    sd := ExpandConstant('{reg:HKLM\SOFTWARE\Bethesda Softworks\Oblivion,Installed Path|{#NOT_FOUND}}')

  if sd = '{#NOT_FOUND}' then begin
    sd := NoSD('') + '{#MyAppName}';
    MsgBox('Текст предупреждения', mbInformation, MB_OK);
  end

  WizardForm.DirEdit.Text := sd;
end;

Текст при этом в поле пути подставляется, все хорошо.
Скрытый текст

Но потом он куда-то теряется, и на последнем экране запись о пути пустая.
Скрытый текст

Более того, путь сбрасывается при переходе на следующую страницу, причем переменная {app} имеет корректный путь.
Скрытый текст


Если я пропишу путь напрямую
Код:

WizardForm.DirEdit.Text := 'D:\Games\Oblivion';
и попробую его изменить в инсталяторе.
Скрытый текст

То на выходе путь не меняется.
Скрытый текст


Что я делаю не так?

Gnom_aka_Lexander 21-10-2022 22:31 2994649

EdMSL, Если путь присваивается правильно, то вероятно поможет вызвать функцию
UpdateReadyMemo
Код:

function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
Из справки:
Если инсталлятор обнаружит функцию UpdateReadyMemo в Pascal-скрипте, она вызоается автоматически, когда активизируется страница мастера Все готово к установке.
Для отображения на странице Все готово к установке в виде строк, разделенных параметром NewLine.
Параметр Space содержит строку с пробелами. Инсталлятор использует эту строку для задания установок.
Другие параметры содержат (возможно пустые) строки, которые инсталлятор может использовать в качестве секций установок.
Например, параметр MemoDirInfo содержит строку для определения секции Выбор папки.
Тоесть, после присвоение новой папки установки, нужно вызвать
Код:

UpdateReadyMemoo(' ', 'разделитель строк', 'информация пользователя', 'папка установки', 'тип установки', 'список компонентов', 'группа в меню пуск', 'выбранные задачи');
То, что не нужно указывать, заменить пустыми кавычками : ''.

EdMSL 22-10-2022 07:13 2994668

Цитата:

Цитата Gnom_aka_Lexander
Если путь присваивается правильно, то вероятно поможет вызвать функцию »

Не помогло. Значение MemoDirInfo пустое.

nik1967 23-10-2022 08:51 2994718

EdMSL, предоставь значения #NOT_FOUND и #MyAppName. А так же процедуру NoSD - искать не охота. А лучше весь скрипт выложи.

EdMSL 23-10-2022 08:53 2994720

Код скрипта:
Скрытый текст

Код:

#define MyAppName "My Game"
#define MyAppVersion "1.0"
#define NOT_FOUND "notFound";

[Setup]
AppId={{ADF6076C-BDF7-4515-8D60-17F9DBAD5B41}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={code:NoSD}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputBaseFilename=MyGameSetup
Compression=none
SolidCompression=yes
DiskSpanning=yes
SlicesPerDisk=1
DiskSliceSize=2100000000
DiskClusterSize=4096
DisableProgramGroupPage=yes
SetupLogging=yes
DirExistsWarning=no

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked


[Files]
Source: "D:\MyGame\*"; DestDir: "{app}"; Flags: ignoreversion

[Dirs]
Name: "{app}\saves"

[Code;]
function GetLogicalDrives: DWORD; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: PAnsiChar): Cardinal; external 'GetDriveTypeA@kernel32.dll stdcall';

const
  DRIVE_FIXED = 3;
  TH32CS_SNAPPROCESS = $2;
  INVALID_HANDLE_VALUE = -1;

var ChooseVersionPage: TInputOptionWizardPage;

function NoSD(s: string): string;
var
  x, bit, i: Integer;
  tp: Cardinal;
  sd: string;
begin
  sd:= ExpandConstant('{sd}');
  Result:= sd;
  x:= GetLogicalDrives;
  if x <> 0 then
  for i:= 1 to 64 do
    begin
      bit:= x and 1;
      if bit = 1 then
        begin
          tp:= GetDriveType(PAnsiChar(Chr(64 + i) + ':'));
          if tp = DRIVE_FIXED then
          if Chr(64 + i) <> Copy(sd, 1, 1) then
            begin
              Result:= Chr(64 + i) + ':';
              Break;
            end;
        end;
      x:= x shr 1;
    end;
end;

function doubleSlash(Param: string): string;
var
    sd: string;
    i: byte;
begin
  sd := Param;
  i := 1;

  while i < length(sd) + 1 do begin
    if sd[i] = '\' then begin
      insert('\', sd, i);
      i := i + 2;
    end
    else begin
    i := i + 1;
    end;
  end;

  Result := sd;
end;

function IsStringCyrillic(Str: String): Boolean;
var
    objRegExp: Variant;
begin
    try
        objRegExp := CreateOleObject('VBScript.RegExp');
    except
        ShowExceptionMessage;
    end;

    if objRegExp.Test(Str) then
    begin
        objRegExp.Pattern := '[\u0400-\u04FF,\u0500-\u052F,\u2DE0-\u2DFF,\uA640-\uA69F]';
        Result := objRegExp.Execute(Str).Count = 1;
    end;
end;

function IsProcessRunning(FileName: String): Boolean;
var
  objSWbemLocator, objSWbemServices: Variant;
begin
  try
    objSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  except
    ShowExceptionMessage;
    Exit;
  end;
  objSWbemServices := objSWbemLocator.ConnectServer();
  objSWbemServices.Security_.ImpersonationLevel := 3;
  Result := (objSWbemServices.ExecQuery('SELECT * FROM Win32_Process WHERE Name="' + FileName + '"').Count > 0);
end;

procedure closeSteam(isUninstall: boolean);
var
i: integer;
str: string;
begin
  if isUninstall then
    str := 'удаления'
  else
    str := 'установки';

  MsgBox('Steam.exe запущен. Перед началом ' + str + ' процесс должен быть завершен.' #13#13 'Закройте его самостоятельно, либо процесс будет завершен принудительно.', mbInformation, MB_OK)
  Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM Steam.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
end;

function GetSystemMetrics (nIndex: Integer): Integer; external 'GetSystemMetrics@User32.dll stdcall setuponly';

Const
  SM_CXSCREEN = 0;
  SM_CYSCREEN = 1;

function getScreenSize(Param: string): string;
begin
  if Param = 'w' then
    begin
      try
        Result := IntToStr(GetSystemMetrics(SM_CXSCREEN));
      except
        Result := '640';
      end
    end
  else
    begin
      try
        Result := IntToStr(GetSystemMetrics(SM_CYSCREEN));
      except
        Result := '480';
      end
    end
end;

function IsIncludeToInstall(GameType: integer): Boolean;
begin
  Result := (GameType = ChooseVersionPage.SelectedValueIndex)
end;

function GetGamePathFromRegistry(): String;
begin
  Result := ExpandConstant('{reg:HKLM\SOFTWARE\WOW6432Node\Bethesda Softworks\Oblivion,Installed Path|{#NOT_FOUND}}');

  if Result = '{#NOT_FOUND}' then
    Result := ExpandConstant('{reg:HKLM\SOFTWARE\Bethesda Softworks\Oblivion,Installed Path|{#NOT_FOUND}}')
end;

procedure InitializeWizard;
begin
  ChooseVersionPage := CreateInputOptionPage(wpWelcome,
    'Выбор версии игры', 'Какая версия игры берется за основу?', '',
    True, False);
  ChooseVersionPage.Add('1С');
  ChooseVersionPage.Add('Steam');
  ChooseVersionPage.Add('GOG');

  ChooseVersionPage.SelectedValueIndex := 0;
end;

procedure RegisterPreviousData(PreviousDataKey: Integer);
var
  GameType: String;
begin
  case ChooseVersionPage.SelectedValueIndex of
    0: GameType := '1C';
    1: GameType := 'Steam';
    2: GameType := 'GOG';
  end;
  SetPreviousData(PreviousDataKey, 'GameType', GameType);
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var installPath: string;
begin
  Result := True;

  if CurPageID = ChooseVersionPage.ID then begin
    if (ChooseVersionPage.SelectedValueIndex = 1)
    and (ExpandConstant('{reg:HKLM\SOFTWARE\WOW6432Node\Valve\Steam,InstallPath|{#NOT_FOUND}}') = '{#NOT_FOUND}')
    and (ExpandConstant('{reg:HKLM\SOFTWARE\Valve\Steam,InstallPath|{#NOT_FOUND}}') = '{#NOT_FOUND}') then
      Result := MsgBox('Steam.exe не найден' #13#13 'Все равно продолжить?', mbError, MB_YESNO) = idYes
  end

  if CurPageID = wpSelectDir then
    if (IsStringCyrillic(WizardForm.DirEdit.Text)) then
    begin
      MsgBox('В пути установки присуствуют русские символы'+#13#10+'Пожалуйста, повторите ввод.', mbError, mb_Ok);
      Result := False;
    end
    else begin
      installPath := GetGamePathFromRegistry();
      log(installPath)  ;
      if (installPath <> '{#NOT_FOUND}') and (installPath <> WizardDirValue) then
        MsgBox('Указанный путь установки отличается от пути, приписанного для игры в реестре.' #13#13 'Корректная работа ' + '{#MyAppName}' + ' не гарантируется.', mbConfirmation, mb_Ok);
    end

  if CurPageID = wpSelectComponents then
    MsgBox('WizardDirValue: ' + WizardDirValue +#13#10+'App: ' + ExpandConstant('{app}'), mbError, mb_Ok);
end;

procedure CurPageChanged(CurPageID: Integer);
var sd: string;
    //isPathFound: boolean;
begin 
 if CurPageId = wpSelectDir then
  sd := GetGamePathFromRegistry();

  if sd = '{#NOT_FOUND}' then begin
    sd := NoSD('') + '\{#MyAppName}';
    MsgBox('Запись об установленной игре отсутствует в реестре Windows.' #13#13 'Возможно, игра была установлена, но ее запуск не был произведен, либо игра установлена некорректно.' #13#13 'Корректная работа ' + '{#MyAppName}' + ' не гарантируется.', mbInformation, MB_OK);
  end

  WizardForm.DirEdit.Text := sd;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if (CurStep = ssInstall) and (ChooseVersionPage.SelectedValueIndex = 1) and IsProcessRunning('Steam.exe') then
    closeSteam(false)
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  Value: String;
begin
log(GetPreviousData('GameType', ''));
  if (CurUninstallStep = usUninstall)
  and (GetPreviousData('GameType', '') = 'Steam')
  and IsProcessRunning('Steam.exe') then
    closeSteam(true)
end;


Директивы Files, Components и т.д. удалил, чтобы не захлмлять. К проблеме отношения все равно не имеют.

nik1967 23-10-2022 09:24 2994722

EdMSL,
Скрытый текст

Код:

#define MyAppName "My Game"
#define MyAppVersion "1.0"
#define NOT_FOUND "notFound";

[Setup]
AppId={{ADF6076C-BDF7-4515-8D60-17F9DBAD5B41}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={code:NoSD}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputBaseFilename=MyGameSetup
Compression=none
SolidCompression=yes
DiskSpanning=yes
SlicesPerDisk=1
DiskSliceSize=2100000000
DiskClusterSize=4096
DisableProgramGroupPage=yes
SetupLogging=yes
DirExistsWarning=no

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked


[Files]
Source: "D:\MyGame\*"; DestDir: "{app}"; Flags: ignoreversion

[Dirs]
Name: "{app}\saves"

[_Code]
function GetLogicalDrives: DWORD; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: PAnsiChar): Cardinal; external 'GetDriveTypeA@kernel32.dll stdcall';

const
  DRIVE_FIXED = 3;
  TH32CS_SNAPPROCESS = $2;
  INVALID_HANDLE_VALUE = -1;

var ChooseVersionPage: TInputOptionWizardPage;

function NoSD(s: string): string;
var
  x, bit, i: Integer;
  tp: Cardinal;
  sd: string;
begin
  sd:= ExpandConstant('{sd}');
  Result:= sd;
  x:= GetLogicalDrives;
  if x <> 0 then
  for i:= 1 to 64 do
    begin
      bit:= x and 1;
      if bit = 1 then
        begin
          tp:= GetDriveType(PAnsiChar(Chr(64 + i) + ':'));
          if tp = DRIVE_FIXED then
          if Chr(64 + i) <> Copy(sd, 1, 1) then
            begin
              Result:= Chr(64 + i) + ':';
              Break;
            end;
        end;
      x:= x shr 1;
    end;
end;

function doubleSlash(Param: string): string;
var
    sd: string;
    i: byte;
begin
  sd := Param;
  i := 1;

  while i < length(sd) + 1 do begin
    if sd[i] = '\' then begin
      insert('\', sd, i);
      i := i + 2;
    end
    else begin
    i := i + 1;
    end;
  end;

  Result := sd;
end;

function IsStringCyrillic(Str: String): Boolean;
var
    objRegExp: Variant;
begin
    try
        objRegExp := CreateOleObject('VBScript.RegExp');
    except
        ShowExceptionMessage;
    end;

    if objRegExp.Test(Str) then
    begin
        objRegExp.Pattern := '[\u0400-\u04FF,\u0500-\u052F,\u2DE0-\u2DFF,\uA640-\uA69F]';
        Result := objRegExp.Execute(Str).Count = 1;
    end;
end;

function IsProcessRunning(FileName: String): Boolean;
var
  objSWbemLocator, objSWbemServices: Variant;
begin
  try
    objSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  except
    ShowExceptionMessage;
    Exit;
  end;
  objSWbemServices := objSWbemLocator.ConnectServer();
  objSWbemServices.Security_.ImpersonationLevel := 3;
  Result := (objSWbemServices.ExecQuery('SELECT * FROM Win32_Process WHERE Name="' + FileName + '"').Count > 0);
end;

procedure closeSteam(isUninstall: boolean);
var
i: integer;
str: string;
begin
  if isUninstall then
    str := 'удаления'
  else
    str := 'установки';

  MsgBox('Steam.exe запущен. Перед началом ' + str + ' процесс должен быть завершен.' #13#13 'Закройте его самостоятельно, либо процесс будет завершен принудительно.', mbInformation, MB_OK)
  Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM Steam.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
end;

function GetSystemMetrics (nIndex: Integer): Integer; external 'GetSystemMetrics@User32.dll stdcall setuponly';

Const
  SM_CXSCREEN = 0;
  SM_CYSCREEN = 1;

function getScreenSize(Param: string): string;
begin
  if Param = 'w' then
    begin
      try
        Result := IntToStr(GetSystemMetrics(SM_CXSCREEN));
      except
        Result := '640';
      end
    end
  else
    begin
      try
        Result := IntToStr(GetSystemMetrics(SM_CYSCREEN));
      except
        Result := '480';
      end
    end
end;

function IsIncludeToInstall(GameType: integer): Boolean;
begin
  Result := (GameType = ChooseVersionPage.SelectedValueIndex)
end;

function GetGamePathFromRegistry(): String;
begin
  Result := ExpandConstant('{reg:HKLM\SOFTWARE\WOW6432Node\Bethesda Softworks\Oblivion,Installed Path|{#NOT_FOUND}}');

  if Result = '{#NOT_FOUND}' then
    Result := ExpandConstant('{reg:HKLM\SOFTWARE\Bethesda Softworks\Oblivion,Installed Path|{#NOT_FOUND}}')
end;

procedure InitializeWizard;
begin
  ChooseVersionPage := CreateInputOptionPage(wpWelcome,
    'Выбор версии игры', 'Какая версия игры берется за основу?', '',
    True, False);
  ChooseVersionPage.Add('1С');
  ChooseVersionPage.Add('Steam');
  ChooseVersionPage.Add('GOG');

  ChooseVersionPage.SelectedValueIndex := 0;
end;

procedure RegisterPreviousData(PreviousDataKey: Integer);
var
  GameType: String;
begin
  case ChooseVersionPage.SelectedValueIndex of
    0: GameType := '1C';
    1: GameType := 'Steam';
    2: GameType := 'GOG';
  end;
  SetPreviousData(PreviousDataKey, 'GameType', GameType);
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var installPath: string;
begin
  Result := True;

  if CurPageID = ChooseVersionPage.ID then begin
    if (ChooseVersionPage.SelectedValueIndex = 1)
    and (ExpandConstant('{reg:HKLM\SOFTWARE\WOW6432Node\Valve\Steam,InstallPath|{#NOT_FOUND}}') = '{#NOT_FOUND}')
    and (ExpandConstant('{reg:HKLM\SOFTWARE\Valve\Steam,InstallPath|{#NOT_FOUND}}') = '{#NOT_FOUND}') then
      Result := MsgBox('Steam.exe не найден' #13#13 'Все равно продолжить?', mbError, MB_YESNO) = idYes
  end;

  if CurPageID = wpSelectDir then
    if (IsStringCyrillic(WizardForm.DirEdit.Text)) then
    begin
      MsgBox('В пути установки присуствуют русские символы'+#13#10+'Пожалуйста, повторите ввод.', mbError, mb_Ok);
      Result := False;
    end
    else begin
      installPath := GetGamePathFromRegistry();
      log(installPath)  ;
      if (installPath <> '{#NOT_FOUND}') and (installPath <> WizardDirValue) then
        MsgBox('Указанный путь установки отличается от пути, приписанного для игры в реестре.' #13#13 'Корректная работа ' + '{#MyAppName}' + ' не гарантируется.', mbConfirmation, mb_Ok);
    end;

  if CurPageID = wpSelectComponents then
    MsgBox('WizardDirValue: ' + WizardDirValue +#13#10+'App: ' + ExpandConstant('{app}'), mbError, mb_Ok);
end;

procedure CurPageChanged(CurPageID: Integer);
var sd: string;
    //isPathFound: boolean;
begin 
 if CurPageId = wpSelectDir then begin
  sd := GetGamePathFromRegistry();

  if sd = '{#NOT_FOUND}' then begin
    sd := NoSD('') + '\{#MyAppName}';
    MsgBox('Запись об установленной игре отсутствует в реестре Windows.' #13#13 'Возможно, игра была установлена, но ее запуск не был произведен, либо игра установлена некорректно.' #13#13 'Корректная работа ' + '{#MyAppName}' + ' не гарантируется.', mbInformation, MB_OK);
  end;

  WizardForm.DirEdit.Text := sd;
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if (CurStep = ssInstall) and (ChooseVersionPage.SelectedValueIndex = 1) and IsProcessRunning('Steam.exe') then
    closeSteam(false)
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  Value: String;
begin
log(GetPreviousData('GameType', ''));
  if (CurUninstallStep = usUninstall)
  and (GetPreviousData('GameType', '') = 'Steam')
  and IsProcessRunning('Steam.exe') then
    closeSteam(true)
end;


EdMSL 23-10-2022 09:34 2994723

nik1967, Спасибо. Тяжело без линтера жить.

Vanadiy777 27-10-2022 00:58 2995019

Коллеги, всех приветствую от души!
Подскажите, пожалуйста, как правильно прописать синтаксис...
Надо добавить задачу в Планировщик заданий, вот так работает:
Код:

Exec(ExpandConstant('{sys}\schtasks.exe'), '/create /f /tn "Добавление задачи" /xml '+ExpandConstant('"{app}\AddTasks.xml"'), '', SW_HIDE, ewWaitUntilTerminated, i);
Но надо чтобы текстовое значение "Добавление задачи" бралось из CustomMessages...

За ранее благодарен за помощь.

El Sanchez 27-10-2022 12:54 2995044

Цитата:

Цитата Vanadiy777
Но надо чтобы текстовое значение "Добавление задачи" бралось из CustomMessages... »

Vanadiy777,
Код:

Exec(ExpandConstant('{sys}\schtasks.exe'), Format('/create /f /tn "%s" /xml "%s"', [CustomMessage('foo'), ExpandConstant('{app}\AddTasks.xml')]), '', SW_HIDE, ewWaitUntilTerminated, i);


Vanadiy777 27-10-2022 14:56 2995048

nik1967, El Sanchez,
Огромное сердечное вам спасибо!

Оба варианта работают.

Vanadiy777 29-10-2022 21:02 2995208

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

Подскажите пожалуйста на примере Opera или Mozilla Firefox, в ней вообще посложнее будет...
Opera
Код:

[_Code]
function GetInstallDir(Path: String ): String;
begin
RegQueryStringValue(HKCU, Software\Microsoft\Windows\CurrentVersion\Uninstall\Opera 91.0.4516.77', 'InstallLocation', Path);
Result := Path;
end;


Mozilla Firefox 1
Код:

[_Code]
function GetInstallDir(Path: String ): String;
begin
RegQueryStringValue(HKLM, Software\Microsoft\Windows\CurrentVersion\Uninstall\Mozilla Firefox 99.0.1 (x64 ru)', 'InstallLocation', Path);
Result := Path;
end;


Mozilla Firefox 2
Код:

[_Code]
function GetInstallDir(Path: String ): String;
begin
RegQueryStringValue(HKLM, Software\Microsoft\Windows\CurrentVersion\Uninstall\Mozilla Firefox 106.0.2 (x86 ru)', 'InstallLocation', Path);
Result := Path;
end;



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

Как правильно прописать функцию, чтобы считывалось только название программы, а остальные данные (которые красным) игнорировались?
Или, возможно, есть другой способ как-то получить директорию установки программы?
Помогите, пожалуйста (ткните носом), если это вообще реализуемо средствами Inno...

Заранее благодарен за помощь.

EdMSL 30-10-2022 14:07 2995222

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

EdMSL 30-10-2022 15:15 2995224

Решил проблему так:
Код:

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  Result := True;

  if CurPageId = wpWelcome then begin
    if IsWin64() then begin
      MsgBox('Ваш ПК не соответствует минимальным требованиям. Установка невозможна.', mbInformation, MB_OK);
      IsCanInstall := false;
    end 
  end
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  if not IsCanInstall then begin
    case (PageID) of
      ChooseVersionPage.ID: Result := True
      wpSelectDir: Result := True
      wpSelectComponents: Result := True
      wpSelectTasks: Result := True
      wpReady: Result := True
    end
  end
  else
    Result := False;
end;

function PrepareToInstall(var NeedsRestart: Boolean): String;
begin
  if not IsCanInstall then
    Result := 'Ваша ПК не соответствует минимальным требованиям.'
  else
    Result := '';
end;

Т.е. не проходим по условию, то пропускаем все страницы, а на шаге готовности к установке выдаем Result с текстом ошибки.
Не уверен, что способ правильный, но в моем случае рабочий.

Vanadiy777 30-10-2022 15:40 2995225

Цитата:

Цитата EdMSL
Не уверен, что способ правильный, но в моем случае рабочий. »

EdMSL,
главное - результат! :wink:

Vanadiy777 30-10-2022 19:28 2995234

nik1967,
Спасибо Вам огромное!
Если установлена Mozilla Firefox x64, то все отрабатывает отлично.
Если Mozilla Firefox x86 - то путь не видит.

Буду экспериментировать... По результатам отпишусь...

EdMSL 30-10-2022 19:58 2995237

Нужно получить данные о системе. В шапке есть скрипт, но выглядит он громоздко. Может есть какой-то более современный способ?
Я пробовал этим способом https://stackoverflow.com/questions/...-in-inno-setup
Но видеопамять определяется неверно, хотя если делать это все через wmic напрямую, то данные выдает верные.
Пишу так:
Код:

Query := 'SELECT AdapterRAM FROM Win32_VideoController';
  VideoSystem := WbemQuery(WbemServices, Query);
  if not VarIsNull(VideoSystem) then
  begin
    log(VideoSystem.AdapterRam);
    vram := VideoSystem.AdapterRAM;
  end;

на выходе получаю -1048576

Vanadiy777 30-10-2022 20:51 2995239

Цитата:

Цитата nik1967
измени куст реестра с HKLM64 на HKLM, и возможно »


nik1967, да, эти варианты тоже уже пробовал - тогда х64 не работает, а х86 работает.

Vanadiy777 31-10-2022 01:07 2995254

nik1967,
в общем, попробовал все возможные варианты...
Поиск идет конкретно по тем параметрам, которые указаны в #define.
Если указано HKLM64 и SOFTWARE\Microsoft\, то ищет путь для х64,
если HKLM и SOFTWARE\WOW6432Node\Microsoft\, то, соответственно, для х86.

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

Т.е. надо как то организовать поиск одновременно по ключам "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
и "SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall", а затем уже как то это вывести в Result:= Path;

Но для меня это вообще темный лес, и я, безусловно, сам с этим никогда не справлюсь.
Если есть возможность, то помогите пожалуйста.

С уважением, и заранее благодарю за помощь.

El Sanchez 31-10-2022 20:48 2995294

Цитата:

Цитата nik1967
Тоже через костыли, но вроде работает. »

nik1967, на 32-разрядной системе не будет, не проверяете разрядность при обращении к HKLM64, привет исключению. Та даже если проверку сделаете, на 32-разрядной всё равно ничего не найдёте, обращаетесь к несуществующему разделу реестра.
nik1967, Vanadiy777, вы оба используете раздел WOW6432Node явно, это нельзя делать. Это сейчас вы его читаете, а потом писать туда начнёте и вот уже на 32-разрядных системах появляется раздел WOW6432Node, где быть его не должно. Браузеры ищите сначала в HKCU, потом в HKLM64 (с IsWin64), потом в HKLM32. Подраздел для всех базовых разделов одинаков - SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, не надо тут никакой отсебятины с WOW6432Node.

nik1967 31-10-2022 22:26 2995299

El Sanchez, мне то что, мне это не надо. Попросил человек, я помог, чем мог. Давно не занимался скриптами, старый стал. А тут немного размялся. Взял бы да и сам написал скрипт. По всем правилам. Всё, хватит. Отписал своё. Больше не буду вводить пользователей в заблуждение.

Vanadiy777 31-10-2022 23:15 2995301

nik1967, зря Вы так... Ни кого Вы в заблуждение не вводили...
Только благодаря Вам я решил свою проблему, над которой ломал голову не одну неделю.
И, хотя маэстро El Sanchez говорит, что написано не правильно, тем не менее, теперь все чётко отрабатывает
и на 32-разрядной и на 64-разрядной системе, а также на 64-разрядной, если установлена Mozilla x86.

За что Вам еще раз огромное сердечное спасибо!!! :Beer:

Garasahedov 10-11-2022 20:44 2996150

Приветствую, не одну неделю ищу такой скрипт: http://www.forum.oszone.ru/post-1242285-250.html
Но инсталятор почему-то мигает. Дайте пожалуйста если имеется такой скрипт с botva и/или InnoCallback!

DA-Bro 11-11-2022 17:37 2996232

Здравствуйте! Подскажите пожалуйста!
Тут вопрос упирается в WizardSmallImage.bmp.
В справках копался, на глаза так и не попалось решения, может плохо искал.

Есть какая то возможность чтобы эта картинка отображалась не из WizardSmallImage.bmp,
а из экзешника программы Program.exe, допустим отображала иконку 48x48.

И есть ли возможность, чтобы там отображалась картинка в PNG.

Может скрипт такой есть.

Vanadiy777 12-11-2022 10:31 2996283

Цитата:

Цитата DA-Bro
Есть какая то возможность чтобы эта картинка отображалась не из WizardSmallImage.bmp,
а из экзешника программы Program.exe, допустим отображала иконку 48x48. »

DA-Bro,
можно из экзешника программы выдернуть иконку и сделать из нее свой WizardSmallImage.bmp нужного размера.
На счет PNG не знаю, но вроде просто так не поддерживается... Попробуйте на форуме примеры поискать.

DA-Bro 12-11-2022 15:33 2996293

Vanadiy777, да я пробовал в некоторых программках и онлайн сервисах. Непрозрачные получаются. У меня фон тёмный. Приходится на этот по размеру фон накладывать значок в PNG. Потом в BMP. Так вроде нормально смотрится. Других подходящих решений пока не нашел.

ZVSRus 12-11-2022 16:48 2996299

Картинка в .png лежит на панельке

#include "botva2.iss"

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

[Files]
Source: "b2p.dll"; DestDir: "{tmp}"; Flags: dontcopy
Source: "botva2.dll"; DestDir: "{tmp}"; Flags: dontcopy
Source: "Icon.png"; DestDir: "{tmp}"; Flags: dontcopy

[code]
var
Panel1: TPanel;

function InitializeSetup(): Boolean;
begin
if not FileExists(ExpandConstant('{tmp}\b2p.dll')) then ExtractTemporaryFile('b2p.dll');
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
if not FileExists(ExpandConstant('{tmp}\Icon.png')) then ExtractTemporaryFile('Icon.png');
Result := True;
end;

procedure InitializeWizard();
begin
with WizardForm.WizardSmallBitmapImage do
begin
SetBounds(ScaleX(370), ScaleY(0), ScaleX(58), ScaleY(58));
end;

with WizardForm.PageDescriptionLabel do
begin
Width := ScaleX(289);
end;

with WizardForm.PageNameLabel do
begin
Width := ScaleX(305);
end;

Panel1 := TPanel.Create(WizardForm);
with Panel1 do
begin
Parent := WizardForm.MainPanel;
SetBounds(ScaleX(436), ScaleY(0), ScaleX(58), ScaleY(58));
BevelOuter := bvNone;
end;
ImgLoad(Panel1.Handle, ExpandConstant('{tmp}\Icon.png'), ScaleX(0), ScaleY(0), ScaleX(58), ScaleY(58), True, False); // Картинка PNG
ImgApplyChanges(Panel1.Handle);
end;

procedure DeinitializeSetup();
begin
gdipShutdown;
end;

Картинка в .png лежит на MainPanel

#include "botva2.iss"

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

[Files]
Source: "b2p.dll"; DestDir: "{tmp}"; Flags: dontcopy
Source: "botva2.dll"; DestDir: "{tmp}"; Flags: dontcopy
Source: "Icon.png"; DestDir: "{tmp}"; Flags: dontcopy

[code]
function InitializeSetup(): Boolean;
begin
if not FileExists(ExpandConstant('{tmp}\b2p.dll')) then ExtractTemporaryFile('b2p.dll');
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
if not FileExists(ExpandConstant('{tmp}\Icon.png')) then ExtractTemporaryFile('Icon.png');
Result := True;
end;

procedure InitializeWizard();
begin
with WizardForm do
begin
WizardForm.WizardSmallBitmapImage.SetBounds(ScaleX(370), ScaleY(0), ScaleX(58), ScaleY(58));
WizardForm.PageDescriptionLabel.Width := ScaleX(289);
WizardForm.PageNameLabel.Width := ScaleX(305);
end;

ImgLoad(WizardForm.MainPanel.Handle, ExpandConstant('{tmp}\Icon.png'), ScaleX(436), ScaleY(0), ScaleX(58), ScaleY(58), True, False); // Картинка PNG
ImgApplyChanges(WizardForm.MainPanel.Handle);
end;

procedure DeinitializeSetup();
begin
gdipShutdown;
end;

DA-Bro 13-11-2022 01:32 2996344

ZVSRus, Спасибо!

DA-Bro 13-11-2022 05:59 2996351

Может ещё кто поможет как кнопки прикручивать.

Я вот видел как у кого-то из репакоделов на фоне картинки WizardImage.bmp есть дополнительные две кнопки.
Расположены одна ниже другой.
Одна - веб ссылка на сайт программы или форума.
Вторая - открывает файл Info.RTF в культурном окошке для просмотра.

Я тут нашел кусок кода с кнопкой для ссылки, но она на всех окнах инсталлятора видна.
Не то.
Code

Код:

{ Переменные }
var
  PupMnu: TPopupMenu;
  btn: TButton;

{ Процедура обработки нажатия на кнопку }
procedure BtnOnClick(Sender: TObject);
var ErrorCode: Integer;
  p: TPoint;
begin
  p.x := btn.Left;
  p.y := btn.Top + btn.Height;
  p := Wizardform.ClientToScreen(p);
  PupMnu.Popup(p.x, p.y);
  ShellExec('open', 'http://forum.oszone.net/forum-62.html', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode)
 
{ Функция инициализации GUI программы установки }
procedure InitializeWizard();
var
  Mnu: TMenuItem;
begin
  PupMnu := TPopupMenu.Create(WizardForm);
  // Кнопка
  btn := TButton.Create(WizardForm);
  btn.Caption := 'OSZone';
  btn.Anchors := [akLeft, akTop, akBottom];
  btn.Left := ScaleX(165);
  btn.Top := ScaleX(336);
  btn.Width := ScaleX(62);
  btn.Height := ScaleX(22);
  btn.Parent := WizardForm;
  btn.OnClick := @BtnOnClick;
  btn.PopupMenu := PupMnu;
end;


Попробовал её рядом с кнопкой "Назад" расположить. Вроде нормально, но всё равно не то. Во всех окнах она.
На десятке вроде ровно. А на семёрке на пару пикселей вниз съезжает.
Нормально это или нет, сравнить не с чем. Не знаю.

А хотелось бы как выше описано, две кнопки с вышеописанными функциями на фоне картинки WizardImage.

ZVSRus 13-11-2022 08:19 2996353

Может ещё кто поможет как кнопки прикручивать.

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

[code]
var
RePackButton: TNewButton;
WebButton: TNewButton;
r: integer;

procedure RePackButtonOnClick(Sender: TObject);
begin
MsgBox('Это сообщение о программе!', mbInformation, mb_Ok);
end;

procedure WebButtonOnClick(Sender: TObject);
begin
ShellExec('', 'http://forum.oszone.net/post-2996351-870.html', '','', SW_SHOW, ewNoWait, r);
end;

procedure InitializeWizard();
begin
WebButton := TNewButton.Create(WizardForm);
with WebButton do
begin
Parent := WizardForm.WelcomePage;
Left := ScaleX(42);
Top := ScaleY(260);
Width := ScaleX(80);
Height := ScaleY(23);
Caption := 'Сайт';
WebButton.OnClick := @WebButtonOnClick;
end;

RePackButton := TNewButton.Create(WizardForm);
with RePackButton do
begin
Parent := WizardForm.WelcomePage;
Left := ScaleX(42);
Top := ScaleY(220);
Width := ScaleX(80);
Height := ScaleY(23);
Caption := 'О RePack''s';
RePackButton.OnClick := @RePackButtonOnClick;
end;
end;

DA-Bro 13-11-2022 17:11 2996374

ZVSRus, Спасибо большое!

Я в кодах не силён. А на примерах и подсказках проще.

Кнопка со ссылкой на сайт подошла.

А вот кнопка "О программе" не совсем то что нужно.

Нужно чтобы открывался текстовый файл readme.RTF вот в таком окне:

Кнопка "О программе" с открытием файла readme.RTF


Подскажите пожалуйста такой вариант кнопки.

ZVSRus 13-11-2022 20:07 2996380

Кнопка "О программе" с открытием файла readme.RTF

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

[Files]
Source: "ReadMeRu.rtf"; DestDir: "{tmp}"; Flags: ignoreversion

[code]
var
Flag : Boolean;
AboutButton : TNewButton;
RichEditViewer : TRichEditViewer;
ReadmeRu : AnsiString;

procedure SettingHideShowOnClick(Sender: TObject);
begin
Wizardform.NextButton.Enabled := True;
if Flag = False then begin
RichEditViewer.Hide;
Flag:= True;
AboutButton.Caption := 'Подробнее';
end else begin
RichEditViewer.Show;
Flag:= False;
AboutButton.Caption := 'Закрыть';
Wizardform.NextButton.Enabled := True;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpWelcome:
begin
Wizardform.NextButton.Enabled := False;
RichEditViewer.Hide;
AboutButton.Caption := 'Подробнее';
Flag:= True;
AboutButton.Caption := 'Подробнее';
end;
end;
end;

procedure InitializeWizard();
begin
ExtractTemporaryFile('ReadMeRu.rtf');
LoadStringFromFile(ExpandConstant('{tmp}')+'\ReadMeRu.rtf', ReadmeRu);

AboutButton := TNewButton.Create(WizardForm);
with AboutButton do
begin
AboutButton.Left := ScaleX(42);
AboutButton.Top := ScaleY(280);
AboutButton.Caption := 'Подробнее';
AboutButton.ShowHint := True
AboutButton.Hint := 'О программе'
AboutButton.OnClick := @SettingHideShowOnClick;
AboutButton.Parent := WizardForm.WelcomePage;
AboutButton.Cursor := crHand;
Flag := True;
end;

RichEditViewer := TRichEditViewer.Create(WizardForm);
with RichEditViewer do
begin
Parent := WizardForm.WelcomePage;
SetBounds(ScaleX(164),ScaleY(0),ScaleX(333),ScaleY(314));
ScrollBars := ssVertical;
RTFText := ReadmeRu;
end;
end;

DA-Bro 13-11-2022 20:54 2996385

ZVSRus, Спасибо!

Цитата:

Кнопка "О программе" с открытием файла readme.RTF
Тут что-то с кнопкой "Далее" происходит." Зависает и неактивной становится. Глюк какой-то.
Наверно "Далее" всегда активной должна быть.

Я в коде Wizardform.NextButton.Enabled := False; на True поменял, вроде нормально сейчас.
Не знаю может ещё там что подправить надо.

Подскажите пожалуйста, а как сделать чтобы в этой кнопке при установке с Русским языком
отображалось из ReadmeRu.rtf, а при установке с Английским или по дефолту - из ReadmeEn.rtf.

И также в названиях кнопок Русский и Английский.

ZVSRus 14-11-2022 15:43 2996460

DA-Bro,
Цитата:

Цитата DA-Bro
Вы прям кладезь знаний.

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

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.

[Languages]
Name: "ENG"; MessagesFile: "compiler:Languages\English.isl"
Name: "RUS"; MessagesFile: "compiler:Languages\Russian.isl"

[Files]
Source: ReadMeRu.rtf; Flags: dontcopy
Source: ReadMeEn.rtf; Flags: dontcopy

[CustomMessages]
ENG.text=More detailed
RUS.text=Подробнее

ENG.text1=Close
RUS.text1=Закрыть

ENG.text2=About the program
RUS.text2=О программе

ENG.text3=Website
RUS.text3=Сайт

[code]
var
Flag : Boolean;
WebButton : TNewButton;
AboutButton : TNewButton;
RichEditViewer : TRichEditViewer;
ReadmeRu, ReadmeEn : AnsiString;
r: integer;

procedure WebButtonOnClick(Sender: TObject);
begin
ShellExec('open', 'http://forum.oszone.net/post-2996351-870.html', '','', SW_SHOW, ewNoWait, r);
end;

procedure SettingHideShowOnClick(Sender: TObject);
begin
Wizardform.NextButton.Enabled := True;
if Flag = False then begin
RichEditViewer.Hide;
Flag:= True;
AboutButton.Caption := CustomMessage('text');
end else begin
RichEditViewer.Show;
Flag:= False;
AboutButton.Caption := CustomMessage('text1');
Wizardform.NextButton.Enabled := True;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpWelcome:
begin
Wizardform.NextButton.Enabled := False;
RichEditViewer.Hide;
AboutButton.Caption := CustomMessage('text');
Flag:= True;
end;
end;
end;

procedure InitializeWizard();
begin
ExtractTemporaryFile('ReadMeRu.rtf');
LoadStringFromFile(ExpandConstant('{tmp}')+'\ReadMeRu.rtf', ReadmeRu);
ExtractTemporaryFile('ReadMeEn.rtf');
LoadStringFromFile(ExpandConstant('{tmp}')+'\ReadMeEn.rtf', ReadmeEn);

WebButton := TNewButton.Create(WizardForm);
with WebButton do
begin
Parent := WizardForm.WelcomePage;
SetBounds(ScaleX(42),ScaleY(250),ScaleX(80),ScaleY(23));
Caption := CustomMessage('text3');
WebButton.OnClick := @WebButtonOnClick;
end;

AboutButton := TNewButton.Create(WizardForm);
with AboutButton do
begin
AboutButton.SetBounds(ScaleX(42),ScaleY(280),ScaleX(80),ScaleY(23));
AboutButton.Caption := CustomMessage('text');
AboutButton.ShowHint := True
AboutButton.Hint := CustomMessage('text2');
AboutButton.OnClick := @SettingHideShowOnClick;
AboutButton.Parent := WizardForm.WelcomePage;
AboutButton.Cursor := crHand;
Flag := True;
end;

RichEditViewer := TRichEditViewer.Create(WizardForm);
with RichEditViewer do
begin
Parent := WizardForm.WelcomePage;
SetBounds(ScaleX(164),ScaleY(0),ScaleX(333),ScaleY(314));
ScrollBars := ssVertical;
ReadOnly:= True;

if ActiveLanguage='RUS' then RTFText:= ReadmeRu
else
if ActiveLanguage='ENG' then RTFText:= ReadmeEn;
end;
end;

Извиняюсь за перевод. Перевод машинный.

В кнопке ''Далее'' глюка нет, сделано так специально, активируется после нажатия на кнопку ''Подробнее''. Если это вам не нужно, за комментируй
две строки в procedure SettingHideShowOnClick(Sender: TObject); Wizardform.NextButton.Enabled := True; и Wizardform.NextButton.Enabled := False; в
procedure CurPageChanged(CurPageID: Integer);

DA-Bro 14-11-2022 17:37 2996469

ZVSRus, Спасибо большое!

Подскажите пожалуйста как грамотней удалить папку с содержимым из "C:\ProgramData\Папка программы".
Я посмотрел в справке и не увидел такой константы {C:\ProgramData}.

Что-то вроде этого:

[UninstallDelete]
Type: filesandordirs; Name: "{C:\ProgramData}\Папка программы";

Как правильней удалить из этой папки.

ZVSRus 14-11-2022 18:18 2996472

[UninstallDelete]
Type: filesandordirs; Name: "{commonappdata}\Папка программы";

Ну так в справке же есть.

DA-Bro 14-11-2022 19:32 2996474

ZVSRus, понятно. Спасибо!

Просто в справке написано:

{userappdata} & {commonappdata}
Путь к папке с данными приложения (Application Data).

Я вижу что не похоже на "ProgramData" и прошел мимо.

ZVSRus 14-11-2022 19:41 2996475

Inno Setup - константа для каталога 'ProgramData'?
Задать вопрос
Задано 6 лет, 1 месяц назад
Изменено 2 года, 5 месяцев назад
Просмотрено 9 тысяч раз
11

Я хочу, чтобы моя программа установки скопировала некоторые файлы в ProgramDataкаталог Windows, я вижу, что большинство каталогов Windows имеют предопределенные константы, уже определенные в документации по установке Inno, однако я не вижу ни однойProgramData.

Поэтому я планирую использовать что-то вроде:

{sd}\ProgramData\MyCompany\MyApp

Является ли это правильным / наилучшим способом развертывания в этом каталоге с помощью Inno Setup? Мне просто кажется странным, что для каталога нет константы ProgramData.

Это {commonappdata} константа.

Он назван так, потому что исторически (Windows XP) путь был C:\Documents and Settings\All Users\Application Data (теперь это символическая ссылка на C:\ProgramData).

И по той же причине использование the {sd}\ProgramDataне является правильным способом.

DA-Bro 15-11-2022 21:19 2996558

Подскажите пожалуйста!

А как сделать чтобы при русском или анлийском (или по дефолту) выборе установки программы
копировались только те файлы которые нужны для того или иного языка.

Например ReadmeRu.rtf копируется когда русский выбираешь, а ReadmeEn.rtf когда английский

Или Russian.lng при выборе русского копируется, а остальные языки нет. И наоборот.

Например вот эти файлы:
[Files]
Source: "Image\ReadmeRu.rtf"; DestDir: "{tmp}"; Flags: dontcopy
Source: "Image\ReadmeEn.rtf"; DestDir: "{tmp}"; Flags: dontcopy

Source: "{app}\Language\English.lng"; DestDir: "{app}\Language"; Flags: ignoreversion
Source: "{app}\Language\Russian.lng"; DestDir: "{app}\Language"; Flags: ignoreversion

[Languages]
Name: "RU"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "EN"; MessagesFile: "compiler:Languages\English.isl"


Вроде какая-то зависимость или исключение одного от другого должно быть.
Где-то видел раньше, никак не вспомню где рыть. Давно уже было.
И пример похожий в справке никак не найду.

ZVSRus 16-11-2022 09:59 2996598

Пример

Код:

[Setup]
AppName=My Application
 AppVersion=1.5
 DefaultDirName={pf}\My Application
 OutputDir=.

[Languages]
Name: "english"; MessagesFile: "compiler:Languages\English.isl"
 Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Files]
Source: "Image\ReadmeRu.rtf"; DestDir: "{tmp}"; Flags: dontcopy
 
Source: "Image\ReadmeEn.rtf"; DestDir: "{tmp}"; Flags: dontcopy

 
Source: "Image\ReadmeRu.rtf"; DestDir: "{app}"; Check: LangRusCheck; Flags: ignoreversion
 
Source: "Image\ReadmeEn.rtf"; DestDir: "{app}"; Check: LangEngCheck; Flags: ignoreversion

 
Source: "{app}\Language\English.lng"; DestDir: "{app}\Language"; Check: LangEngCheck; Flags: ignoreversion
 
Source: "{app}\Language\Russian.lng"; DestDir: "{app}\Language"; Check: LangRusCheck; Flags: ignoreversion

[Code*]
var
 
LangRus : TNewRadioButton;
  LangEng : TNewRadioButton;

function LangRusCheck: Boolean;                         
 begin                                                   
 
Result:= LangRus.Checked;                             
 end;                                                   

function LangEngCheck: Boolean;                         
 begin                                                 
 
Result:= LangEng.Checked;                           
 end;                                                   

procedure InitializeWizard();
begin
 
LangRus := TNewRadioButton.Create(WizardForm);
  with LangRus do                                                           
  begin                                                                     
   
Parent  := WizardForm.SelectDirPage;
    SetBounds(ScaleX(0),ScaleY(120),ScaleX(60),ScaleY(17));
    Caption := 'Русский';                                                   
    Checked := True;
  end;                                                                       

  LangEng := TNewRadioButton.Create(WizardForm);                             
  with LangEng do                                                           
  begin                                                                     
   
Parent  := WizardForm.SelectDirPage;
    SetBounds(ScaleX(0),ScaleY(140),ScaleX(80),ScaleY(17));
    Caption := 'Английский';                                               
  end;
end;


DA-Bro 16-11-2022 11:47 2996605

ZVSRus, Спасибо! Код выше работает. Но не совсем то что нужно.

Надо чтобы по тихому молчком копировались файлы.
Запустил допустим я инталлятор и выбрал RU или EN фейс для дальнейшей установки.
И в зависимости от выбора языка установки по тихому копируются нужные файлы в соответствии выбранного языка.

Вот тут например копируется файл в зависимости от разрядности Check: "Такой то";

Source: "{app}\AlarmClock,1.exe"; DestDir: "{app}"; DestName: "AlarmClock.exe"; Check: "Is64BitInstallMode"; Flags: ignoreversion
Source: "{app}\AlarmClock,2.exe"; DestDir: "{app}"; DestName: "AlarmClock.exe"; Check: "not Is64BitInstallMode"; Flags: ignoreversion

И если я не ошибаюсь то должно вроде быть например Check: "Russian"; или Check: "English"; да хоть или Check: "Китайский"; если в выборе инсталлятора такой язык есть.

Как-то вот так:

Source: "{app}\AlarmClockEN.exe"; DestDir: "{app}"; DestName: "AlarmClock.exe"; Check: "English"; Flags: ignoreversion
Source: "{app}\AlarmClockRU.exe"; DestDir: "{app}"; DestName: "AlarmClock.exe"; Check: "Russian"; Flags: ignoreversion

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

ZVSRus 16-11-2022 12:27 2996608

DA-Bro

Надо чтобы по тихому молчком копировались файлы.
Запустил допустим я инталлятор и выбрал RU или EN фейс для дальнейшей установки.
И в зависимости от выбора языка установки по тихому копируются нужные файлы в соответствии выбранного языка.

Вопрос не совсем понятен. Запустил допустим я инталлятор и выбрал RU или EN фейс для дальнейшей установки.
И в зависимости от выбора языка установки по тихому копируются нужные файлы в соответствии выбранного языка.
Это вы сейчас о чём. Если о секции [Languages], то эта секция служит для того чтобы видеть какой текст на всех страницах читать (русский человек будет читать на русском, англичанин на английском).

Source: "{app}\AlarmClock,1.exe"; DestDir: "{app}"; DestName: "AlarmClock.exe"; Check: "Is64BitInstallMode"; Flags: ignoreversion
Source: "{app}\AlarmClock,2.exe"; DestDir: "{app}"; DestName: "AlarmClock.exe"; Check: "not Is64BitInstallMode"; Flags: ignoreversion


Этот пример понятен, вы хотите чтобы у ReadmeRu или ReadmeEn в конечной папке не было приставки Ru или En? или как.

nik1967 16-11-2022 12:27 2996609

DA-Bro,
Пример
Код:

[Setup]
AppName=Test
AppVersion=1.5
DefaultDirName={pf}\Test
DisableWelcomePage=False
OutputDir=.

[Languages]
Name: "RU"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "EN"; MessagesFile: "compiler:Default.isl"

[Files]
Source: "Image\ReadmeRu.rtf"; DestDir: "{tmp}"; Flags: dontcopy
Source: "Image\ReadmeEn.rtf"; DestDir: "{tmp}"; Flags: dontcopy
Source: "Image\ReadmeRu.rtf"; DestDir: "{app}"; Languages: RU; Flags: ignoreversion
Source: "Image\ReadmeEn.rtf"; DestDir: "{app}"; Languages: EN; Flags: ignoreversion
Source: "Language\Russian.lng"; DestDir: "{app}\Language"; Languages: RU; Flags: ignoreversion
Source: "Language\English.lng"; DestDir: "{app}\Language"; Languages: EN; Flags: ignoreversion

Из справки
Есть три дополнительные параметры, которые могут использоваться во всех секциях, содержащих параметры. Это:

Languages
Список поддерживаемых языков, разделенных пробелами, которые указывают инсталлятору, к какому языку относится запись. Если пользователь выберет язык, указанный в этом списке, запись будет обработан (например, установится файл).

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

Кроме списка, можно использовать логические выражения. Для справки обратитесь к параметрам секций [Components] и [Tasks].

Например:
Languages: en nl

ZVSRus 16-11-2022 12:33 2996612

nik1967
Хотя пардон, Languages: RU данная формулировка совсем из головы вылетела, или не внимательно понял вопрос.

DA-Bro 16-11-2022 19:58 2996640

nik1967, Спасибо! Вот это у меня сработало как я и хотел. Вроде как раз то что искал.

Код:

Source: "{app}\*.*"; DestDir: "{app}"; Flags: ignoreversion

Source: "{app}\Language\Russian.lng"; DestDir: "{app}\Language"; Languages: ru; Flags: ignoreversion
Source: "{app}\Language\English.lng"; DestDir: "{app}\Language"; Languages: en; Flags: ignoreversion

А вот эти строчки не срабатывают.
А вот эти строчки не срабатывают.
То есть почему оба файла появляются в системной папке "Temp".

Код:

Source: "{tmp}\ReadmeRu.rtf"; DestDir: "{tmp}"; Languages: ru; Flags: dontcopy
Source: "{tmp}\ReadmeEn.rtf"; DestDir: "{tmp}"; Languages: en; Flags: dontcopy

В инсталляторе то все нормально, показывает "Описание программы" на каком языке и нужно.
Эти файлы ReadmeRu.rtf и ReadmeEn.rtf для справки описания программы в инсталляторе.
В папку с программой их не нужно копировать.

Нужны для этого кода:
http://forum.oszone.net/post-2996460-875.html

И когда я запускаю инсталлятор, выбираю Русский, появляется окно "Мастер установки".
Захожу в папку "C:\Users\Я\AppData\Local\Temp" и вижу это:



Файла ReadmeEn.rtf по идее не должно там быть.
Может код их все сразу туда копирует. И параметры в "Source:" уже не сработают.

Как Вы говорили: если только другой параметр этого не запретит.

Не пойму где засада.

nik1967 16-11-2022 20:53 2996646

DA-Bro, а тебе так важно, чтобы во временную папку копировался либо RU, либо EN? Всё равно ведь после установки эта папка удаляется. На твоём месте я бы забил на это.
Ну, или если это так важно, то

Код:

procedure InitializeWizard();
begin
  if ActiveLanguage='RU' then begin
    ExtractTemporaryFile('ReadMeRu.rtf');
    LoadStringFromFile(ExpandConstant('{tmp}')+'\ReadMeRu.rtf', ReadmeRu);
  end else
  if ActiveLanguage='EN' then begin
    ExtractTemporaryFile('ReadMeEn.rtf');
    LoadStringFromFile(ExpandConstant('{tmp}')+'\ReadMeEn.rtf', ReadmeEn);
  end;

И ещё одна странность: почему ты из папки назначения (Source: "{app}\Language\Russian.lng"; ) копируешь в папку назначения же (DestDir: "{app}\Language"; )?

Vanadiy777 16-11-2022 21:05 2996648

Цитата:

Цитата DA-Bro
Не пойму где засада. »

DA-Bro,
В процедуре прописано извлечение сразу обоих файлов:
Код:

procedure InitializeWizard();
begin
ExtractTemporaryFile('ReadMeRu.rtf');
LoadStringFromFile(ExpandConstant('{tmp}')+'\ReadMeRu.rtf', ReadmeRu);
ExtractTemporaryFile('ReadMeEn.rtf');
LoadStringFromFile(ExpandConstant('{tmp}')+'\ReadMeEn.rtf', ReadmeEn);


DA-Bro 16-11-2022 21:53 2996650

Vanadiy777, да чет попробовал, не выходит.

nik1967, да в принципе не критично конечно.
Просто глянул у некоторых репакеров так происходит. У них файл появляется один в соответствии RU / EN.
Подумал что также типа Languages: ru; обойдётся.

nik1967 16-11-2022 22:02 2996651

DA-Bro,
Немного "причесал" скрипт примера

Код:

[Setup]
AppName=Test
AppVersion=1.5
DefaultDirName={pf}\Test
DisableWelcomePage=False
OutputDir=.

[Languages]
Name: "RU"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "EN"; MessagesFile: "compiler:Default.isl"

[Files]
Source: "Image\ReadmeRu.rtf"; DestDir: "{tmp}"; Flags: dontcopy
Source: "Image\ReadmeEn.rtf"; DestDir: "{tmp}"; Flags: dontcopy
//Source: "Language\Russian.lng"; DestDir: "{app}\Language"; Languages: RU; Flags: ignoreversion
//Source: "Language\English.lng"; DestDir: "{app}\Language"; Languages: EN; Flags: ignoreversion

[CustomMessages]
EN.text=More detailed
RU.text=Подробнее
EN.text1=Close
RU.text1=Закрыть
EN.text2=About the program
RU.text2=О программе
EN.text3=Website
RU.text3=Сайт

[code]
var
  Flag: Boolean;
  WebButton,AboutButton: TNewButton;
  RichEditViewer: TRichEditViewer;
  Readme: AnsiString;
  r: integer;

procedure WebButtonOnClick(Sender: TObject);
begin
  ShellExec('open', 'http://forum.oszone.net/post-2996351-870.html', '','', SW_SHOW, ewNoWait, r);
end;

procedure SettingHideShowOnClick(Sender: TObject);
begin
  Wizardform.NextButton.Enabled := True;
    if Flag = False then begin
      RichEditViewer.Hide;
      Flag:= True;
      AboutButton.Caption := CustomMessage('text');
    end else begin
      RichEditViewer.Show;
      Flag:= False;
      AboutButton.Caption:= CustomMessage('text1');
      Wizardform.NextButton.Enabled:= True;
    end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    wpWelcome: begin
      Wizardform.NextButton.Enabled:= False;
      RichEditViewer.Hide;
      AboutButton.Caption:= CustomMessage('text');
      Flag:= True;
    end;
  end;
end;

procedure InitializeWizard();
begin
  case ActiveLanguage of
    'RU': begin
      ExtractTemporaryFile('ReadMeRu.rtf');
      LoadStringFromFile(ExpandConstant('{tmp}')+'\ReadMeRu.rtf', Readme);
    end;
    'EN': begin
      ExtractTemporaryFile('ReadMeEn.rtf');
      LoadStringFromFile(ExpandConstant('{tmp}')+'\ReadMeEn.rtf', Readme);
    end;
  end;

  WebButton:= TNewButton.Create(WizardForm);
  with WebButton do begin
    Parent := WizardForm.WelcomePage;
    SetBounds(ScaleX(42),ScaleY(250),ScaleX(80),ScaleY(23));
    Caption := CustomMessage('text3');
    WebButton.OnClick := @WebButtonOnClick;
  end;

  AboutButton:= TNewButton.Create(WizardForm);
  with AboutButton do begin
    AboutButton.SetBounds(ScaleX(42),ScaleY(280),ScaleX(80),ScaleY(23));
    AboutButton.Caption:= CustomMessage('text');
    AboutButton.ShowHint:= True;
    AboutButton.Hint:= CustomMessage('text2');
    AboutButton.OnClick:= @SettingHideShowOnClick;
    AboutButton.Parent:= WizardForm.WelcomePage;
    AboutButton.Cursor:= crHand;
    Flag:= True;
  end;

  RichEditViewer:= TRichEditViewer.Create(WizardForm);
  with RichEditViewer do begin
    Parent:= WizardForm.WelcomePage;
    SetBounds(ScaleX(164),ScaleY(0),ScaleX(333),ScaleY(314));
    ScrollBars:= ssVertical;
    ReadOnly:= True;
    RTFText:= Readme;
  end;
end;


DA-Bro 16-11-2022 22:09 2996653

Цитата:

Цитата nik1967
Немного "причесал" скрипт примера »

Чет у меня файлы Readme.rtf пропали. Ни в "Temp" нет ни одного.
И на кнопку "О программе" жму, там пусто.

nik1967 17-11-2022 04:57 2996665

DA-Bro, а предыдущий скрипт работает? Сейчас скопировал скрипт из сообщения, работает. Не знаю, что у тебя не так.

DA-Bro 17-11-2022 05:58 2996666

nik1967, понял где у меня косяк.

У меня было прописано:

[Languages]
Name: "ru"; MessagesFile: compiler:Languages\Russian.isl
Name: "en"; MessagesFile: compiler:Default.isl

Изменил на заглавные RU EN и всё нормально стало. Не знал что из-за верхнего-нижнего регистра такое может случиться.

В общем получилось как я и хотел. Лишнего файла Readme.rtf теперь нет. Спасибо!

А может подскажите с иконкой.
Я вот в справке увидел два варианта кода.

Иконка вверху слева
Код:

procedure NewIcon;
begin
var
Icon: TNewIcon;
begin
Icon := TNewIcon.Create; ///Support True Color
Icon.LoadFromFile(ExpandConstant('{tmp}\Icon.ico'));
Icon.Width := 16; ///Selected Icon Size (16x16 ; 32x32; 48x48 ......)
Icon.Height := 16; ///Default Size: 32x32
WizardForm.Icon.Handle := Icon.Handle;
end;



Иконка вверху слева 2
[code][Setup]
AppName=CheckFile
AppVerName=CheckFile
DefaultDirName={pf}\CheckFile
OutputDir=.
DirExistsWarning=no

[Files]
Source: icon.ico; DestDir: {tmp}; Flags: dontcopy

Код:

function LoadImage(hInst: THandle; ImageName: PChar; ImageType: UINT; X, Y: Integer; Flags: UINT): THandle; external 'LoadImageA@user32.dll stdcall delayload';

procedure InitializeWizard;
Begin
  ExtractTemporaryFile('icon.ico');
  SendMessage(WizardForm.Handle, $80, 0, LoadImage(0,ExpandConstant('{tmp}')+'\icon.ico',1,16,16,$1010));
  end;;



Попробовал, не срабатывает у меня. Может там что-то поправить нужно.

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

ZVSRus 17-11-2022 08:59 2996670

Цитата:

Цитата DA-Bro
А может подскажите с иконкой

[Setup]
SetupIconFile=Icon.ico

Из справки

[Setup]: SetupIconFile

Описание:
Определяет новую иконку для программы-инсталлятора. Этот файл должен быть расположен в исходной папке скрипта, если только для него не указан полный путь или нет приставки "compiler:" - в этом случае компилятор будет искать указанный файл в своем каталоге.

Эта директива не поддерживается в Windows 95/98/Me.

Например:
SetupIconFile=MyProgSetup.ico

DA-Bro 17-11-2022 10:00 2996672

ZVSRus,
Я и иконки везде распихал и переименовывал их. Ничего не срабатывает. Ошибки Ошибки Ошибки.

Чет не то с этими скриптами "Иконка вверху слева". Чего-то не хватает.

ZVSRus 17-11-2022 11:07 2996676

Цитата:

Цитата DA-Bro
Чет не то с этими скриптами "Иконка вверху слева". Чего-то не хватает.

А я вам про скрипты ничего и не говорил.
Вам надо то одну строку SetupIconFile=Icon.ico прописать в секции [Setup]

[Setup]
SetupIconFile=Icon.ico

Если конечно речь идёт об иконке на верхнем бордюре, слева.

Vanadiy777 17-11-2022 12:23 2996679

Цитата:

Цитата DA-Bro
Или может есть вариант какой, чтобы иконка бралась как-то из ресурса экзешника самой программы и там отображалась.. »

DA-Bro,
Можно извлечь иконку из экзешника самой программы и положить ее рядом со скриптом.
Затем, как советует коллега ZVSRus,
Код:

[Setup]
SetupIconFile=Icon.ico


Цитата:

Цитата DA-Bro
Чет не то с этими скриптами "Иконка вверху слева". Чего-то не хватает. »

А скрипты эти не работают... Может, устарели, или предназначены для расширенной версии...

DA-Bro 17-11-2022 17:19 2996711

ZVSRus, да я так и прописывал. Не получается.

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

Vanadiy777 17-11-2022 17:35 2996713

Цитата:

Цитата DA-Bro
где взять расширенную версию попробовать. »

DA-Bro,
Не знаю, никогда ей не пользовался, вроде как она уже давно не поддерживается...
Цитата:

Цитата DA-Bro
Вы сами чем компилируете? »

Сам пользуюсь версиями 5.6.1, 6.0.5, 6.2.1, в зависимости от ситуации...

ZVSRus 17-11-2022 17:37 2996714

Цитата:

Цитата DA-Bro
ZVSRus, да я так и прописывал. Не получается.

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

Я сижу на Inno Setup 5.5.1.ee2 Ultra Unicode

Я же вам написал
[Setup]
SetupIconFile=Icon.ico

И ни каких кодов не надо. Удали их. Для иконки что на верхнем бордюре слева есть стандартная директива SetupIconFile=Icon.ico
Покажи секцию [Setup] полностью.

DA-Bro 17-11-2022 17:52 2996717

ZVSRus,
Setup
[Setup]
MinVersion = 0.0,5.01

ShowLanguageDialog = yes

#define AppExe "{app}\Program.exe"
#define AppName "Program"
#define AppVerName = "Program 1.0"
#define AppVer "1.0"

AppName = {#AppName}
AppVerName = {#AppVerName}
AppVersion = {#AppVer}
AppPublisher = {#AppPub}
AppPublisherURL = {#AppURL}
AppId = {#AppName}
UninstallDisplayIcon = {#AppExe}
VersionInfoVersion = {#AppVer}
AppComments = "Program"

DefaultDirName = "{pf}\Program\Program"
DefaultGroupName = "Program\Program"

DisableWelcomePage = no
AlwaysUsePersonalGroup = yes
AllowNoIcons = yes

SetupIconFile = Image\Setup.ico
WizardImageFile = Image\WizardImage.bmp
WizardSmallImageFile = Image\WizardSmallImage.bmp

Alex S 17-11-2022 18:14 2996718

Цитата:

Цитата DA-Bro
где взять расширенную версию попробовать. »

Отправил ссылку в личку... Пробуй.

ZVSRus 17-11-2022 18:26 2996720

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

Код:

#define AppExe "{app}\SSDToolBox.exe"
#define AppName "ADATA SSD ToolBox"
#define AppVerName = "ADATA SSD ToolBox 5.0.16"
#define AppVer "5.0.16"
#define AppPub "ADATA Technology Co., Ltd."
#define AppCopyright "Copyright © 2020-2022, ADATA Technology Co., Ltd."
#define AppDescription AppVerName

#define AppURL "https://www.adata.com/"

[Setup]
MinVersion = 0.0,5.01
ShowLanguageDialog = yes

AppName = {#AppName}
AppVerName = {#AppVerName}
AppVersion = {#AppVer}
AppPublisher = {#AppPub}
AppPublisherURL = {#AppURL}
AppSupportURL = {#AppURL}
AppUpdatesURL = {#AppURL}
AppCopyright = {#AppCopyright}
AppId = {#AppName}
UninstallDisplayIcon = {#AppExe}
VersionInfoDescription = {#AppDescription}
VersionInfoVersion = {#AppVer}
AppComments = "ADATA SSD ToolBox"

DefaultDirName = "{pf}\ADATA\SSD ToolBox"
DefaultGroupName = "ADATA\SSD ToolBox"

OutputBaseFilename = ADATA.SSD.ToolBox

DisableWelcomePage = no
AlwaysUsePersonalGroup = yes
AllowNoIcons = yes

SetupIconFile = Setup.ico
WizardImageFile = WizardImage.bmp
//WizardSmallImageFile = Image\WizardSmallImage.bmp


Alex S 17-11-2022 18:27 2996722

SetupIconFile = Image\Setup.ico
Если рядом со скриптом есть папка, в которой лежит твой файл значка Setup.ico, то все должно работать без проблем...

DA-Bro 17-11-2022 19:01 2996732

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

Вот вставляю я это:

Код:

procedure NewIcon;
begin
var
Icon: TNewIcon;
begin
Icon := TNewIcon.Create; ///Support True Color
Icon.LoadFromFile(ExpandConstant('Image\Icon.ico'));
Icon.Width := 16; ///Selected Icon Size (16x16 ; 32x32; 48x48 ......)
Icon.Height := 16; ///Default Size: 32x32
WizardForm.Icon.Handle := Icon.Handle;
end;

И тормозит у меня на строчке var

ZVSRus 17-11-2022 19:16 2996733

DA-Bro
Выше var begin убери.

Иконка и без этого куска кода работает.

DA-Bro 17-11-2022 19:50 2996740

ZVSRus,
Цитата:

Иконка и без этого куска кода работает.
Это понятно, только какая?

А мы об одном и том же говорим?
Иконка должна заменить картинку в правом верхнем углу.

Вот мне и попались в справке два варианта этих словами не скажешь злополучных кодов)

ZVSRus 17-11-2022 20:06 2996742

DA-Bro
Это сообщение что Неизвестный тип TNewIcon.
Без скрипта тяжело что либо понять.
Показывай весь скрипт.

DA-Bro 17-11-2022 20:18 2996743

ZVSRus,
...
[code]#define WildcardExists(str FileName) \
((Local[0] = FindFirst(FileName, faAnyFile)) ? \
(FindClose(Local[0]), True): False)

#define FolderExists(str FolderName) \
((Local[0] = FindFirst(FolderName, faDirectory)) ? \
(FindClose(Local[0]), True): False)

#ifdef UNICODE
#define AW "W"
#define W "W"
#else
#define AW "A"
#define W ""
#endif

Код:

{
        Функции, константы и типы WinAPI
}

const
        INVALID_HANDLE_VALUE                = -1;

        LOAD_LIBRARY_AS_DATAFILE        = $2;
        LOAD_LIBRARY_AS_IMAGE_RESOURCE        = $20;

        ERROR_SUCCESS                        = $0;
        TH32CS_SNAPPROCESS                = $2;
        PROCESS_TERMINATE                = $1;

        SPI_SETSCREENSAVEACTIVE        = $11;
        SPI_SETCURSORS                = $57;
        SPIF_SENDCHANGE                = $2;

{
        GENERIC_READ                = $80000000;
        GENERIC_WRITE                = $40000000;
        GENERIC_EXECUTE                = $20000000;
        GENERIC_ALL                = $10000000;
        FILE_SHARE_READ                = $1;
        FILE_SHARE_WRITE        = $2;
        FILE_SHARE_DELETE        = $4;
        CREATE_NEW                = $1;
        CREATE_ALWAYS                = $2;
        OPEN_EXISTING                = $3;
        OPEN_ALWAYS                = $4;
        TRUNCATE_EXISTING        = $5;
        FILE_READ_ATTRIBUTES        = $80;
        FILE_WRITE_ATTRIBUTES        = $100;
}

type
        TProcessEntry32 = record
                dwSize                        : dword;
                cntUsage                : dword;
                th32ProcessID                : dword;
                th32DefaultHeapID        : longint;
                th32ModuleID                : dword;
                cntThreads                : dword;
                th32ParentProcessID        : dword;
                pcPriClassBase                : longint;
                dwFlags                        : dword;
                szExeFile                : Array[0..259] of Char;
        end;

function CloseHandle                        (hObject: THandle): bool; external 'CloseHandle@kernel32.dll stdcall delayload';

function LoadLibraryEx                        (lpFileName: string; hFile: THandle; dwFlags: dword): THandle; external 'LoadLibraryEx{#AW}@kernel32.dll stdcall delayload';
function LoadString                        (hInstance: THandle; uID: longint; lpBuffer: String; nBufferMax: integer): integer; external 'LoadString{#AW}@user32.dll stdcall delayload';
function FreeLibrary                        (hModule: THandle): bool; external 'FreeLibrary@kernel32.dll stdcall delayload';

function CreateToolhelp32Snapshot        (dwFlags, th32ProcessID: dword): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall delayload';
function Process32First                        (hSnapshot: THandle; var lppe: TProcessEntry32): bool; external 'Process32First{#W}@kernel32.dll stdcall delayload';
function Process32Next                        (hSnapshot: THandle; var lppe: TProcessEntry32): bool; external 'Process32Next{#W}@kernel32.dll stdcall delayload';
function OpenProcess                        (dwDesiredAccess: dword; bInheritHandle: bool; dwProcessId: dword): THandle; external 'OpenProcess@kernel32.dll stdcall delayload';
function TerminateProcess                (hProcess: THandle; uExitCode: longint): bool; external 'TerminateProcess@kernel32.dll stdcall delayload';

function SystemParametersInfo                (uiAction: dword; uiParam: variant; var pvParam: variant; fWinIni: dword): bool; external 'SystemParametersInfo{#AW}@user32.dll stdcall delayload';

{
        function CreateFile                (lpFileName: String; dwDesiredAccess: Cardinal; dwShareMode: Cardinal; lpSecurityAttributes: Cardinal; dwCreationDisposition: Cardinal; dwFlagsAndAttributes: Cardinal; hTemplateFile: Integer): Integer; external 'CreateFile{#AW}@kernel32.dll stdcall delayload';
        function ReadFile                (hFile: THandle; lpBuffer: String; nNumberOfBytesToRead: LongInt; var lpNumberOfBytesRead: LongInt; lpOverlapped: LongInt): Boolean; external 'ReadFile@kernel32.dll stdcall delayload';
        function WriteFile                (hFile: THandle; lpBuffer: String; nNumberOfBytesToWrite: LongInt; var lpNumberOfBytesWritten: LongInt; lpOverlapped: LongInt): Boolean; external 'WriteFile@kernel32.dll stdcall delayload';
}


{
        Получение пути к папке Программы для константы code.
        Использование:
                GetProgsDir ('');
}

function GetProgramsDir (Default: String): String;
begin
        if IsAdminLoggedOn() then
                result:= ExpandConstant ('{commonprograms}')
        else
                result:= ExpandConstant ('{userprograms}');
end;


{
        Адаптация ф-ции WizardGroupValue для константы code.
        Использование:
                GetProgsCatName ('');
}

function GetGroupDir (Default: String): String;
begin
        result:= WizardGroupValue ();
end;


{
        Получение текущей даты для константы code.
        Использование:
                GetDateTime ('yyyymmdd');
}

function GetDateTime (Default: String): String;
begin
        result:= GetDateTimeString (Default, #0, #0)
end;


{
        Разделение строки в массив.
        Использование:
                StringSplit ('Строка', 'Разделитель');
}

function StringSplit (Const Str, Splitter: String): Array of String;
var
        cPos        : Integer;
        cStr        : String;

begin
        while Length (Str) > 0 do
        begin

                cPos:= Pos (Splitter, Str);

                if not (cPos = 0) then
                  begin
                        cStr:= Copy (Str, 1, cPos - 1);
                        Delete (Str, 1, cPos);
                  end
                else
                  begin
                        cStr:= Copy (Str, 1, Length (Str));
                        Str:= '';
                  end;

                if Length (cStr) > 0 then
                  begin
                        SetArrayLength (result, GetArrayLength (result) + 1);
                        result[GetArrayLength (result) - 1]:= cStr;
                  end;
        end;
end;


{
        Получение значения бита в числе.
        Использование:
                GetBit (Число, бит);
}

function GetBit (Const Value, Bit: Integer): Boolean;
begin
        result:= (Value and (1 shl Bit)) <> 0;
end;


{
        Установка значения 1 бита в числе.
        Использование:
                SetBit (Переменная, бит);
}

procedure SetBit (Var Value: Integer; const Bit: Integer);
begin
        Value:= Value or (1 shl Bit);
end;


{
        Эмулятор типа встроенной Inc
        Использование:
                Inc (Переменная Integer);
}

procedure Inc (Var a: Integer);
begin
        a:= a + 1;
end;


{
        Удаление файла из-под текущего юзера (нужна для W7)
        Использование:
                FileDelete_AsUser ('путь к файлу')
}

procedure FileDelete_AsUser (Const sFileName: String);
begin
        DeleteFile (ExpandConstant ('{localappdata}\VirtualStore\') + ExtractRelativePath (ExpandConstant ('{sd}'), ExpandConstant (sFileName)));
end;


{
        Добавление в панель задач (Taskband на W7)
        Использование:
                PinToTaskband ('путь к файлу')
}

procedure PinToTaskband (sFileName: String);
var
        i                                : Integer;
        hLib                                : THandle;
        sRealFile, sVerb, sVBSFile        : String;
        oShell, oFile, oVerbs                : Variant;

begin
        sFileName        := ExpandConstant (sFileName);
        sRealFile        := sFileName;

        if (GetWindowsVersion shr 16 < $0601) or Not FileExists (sFileName) then
                Exit;

        try
                hLib:= LoadLibraryEx ('shell32.dll', 0, LOAD_LIBRARY_AS_DATAFILE or LOAD_LIBRARY_AS_IMAGE_RESOURCE);
                SetLength (sVerb, 256);
                SetLength (sVerb, LoadString (hLib, 5386, sVerb, 255 {#(defined (UNICODE)) ? ("*2") : ("")}));

                if Not (Length (sVerb) > 0) then
                        RaiseException ('Error getting "Pin to taskband" verbosity name');

                oShell        := CreateOleObject ('Shell.Application');
                oFile        := oShell.NameSpace(ExtractFileDir (sFileName)).ParseName(ExtractFileName (sFileName));
                oVerbs        := oFile.Verbs

                if oFile.IsLink then
                        sRealFile:= oFile.GetLink.Path;

                for i:= 0 to oVerbs.Count - 1 do
                if CompareText (sVerb, oVerbs.Item(i).Name) = 0 then
                  begin
                        if oFile.IsLink then
                                DeleteFile (ExpandConstant ('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName (sFileName));

                        if IsWin64 and (Pos (ExpandConstant ('{pf64}\'), sRealFile) = 1) then
                          begin
                                sVBSFile:= GenerateUniqueName (GetTempDir, '.vbs');

                                SaveStringToFile        (sVBSFile, \
                                        'Set oShell=CreateObject("Shell.Application")'                                                                                        + #13 + \
                                        'Set oVerbs=oShell.NameSpace("' + ExtractFileDir (sFileName) + '").ParseName("' + ExtractFileName (sFileName) + '").Verbs'        + #13 + \
                                        'For Each oVerb In oVerbs'                                                                                                        + #13 + \
                                        '  If (oVerb="' + sVerb + '") Then'                                                                                                + #13 + \
                                        '    oVerb.DoIt'                                                                                                                + #13 + \
                                        '    Exit For'                                                                                                                        + #13 + \
                                        '  End If'                                                                                                                        + #13 + \
                                        'Next'                                                                                                                                , False);

                                Exec                (ExpandConstant ('{win}\Sysnative\cscript.exe'), '"' + sVBSFile + '" /B', '', SW_HIDE, ewWaitUntilTerminated, i);
                                DeleteFile        (sVBSFile);
                          end
                        else
                                oVerbs.Item(i).DoIt;

                        Break;
                  end;
        except end;

        if Not (hLib = 0) then
                FreeLibrary (hLib);
end;


{
        Убивание процессов
        Использование:
                ProcessKill        (PID);                (функция)
                pProcessKill        (PID);                (процедура)
                ProcessKillAll        ('имя_процесса');(функция)
                pProcessKillAll        ('имя_процесса');(процедура)
}

function ProcessKill (Pid: longint): bool;
var
        hTargetProc        : THandle;
begin
        hTargetProc:= OpenProcess (PROCESS_TERMINATE, False, Pid);
        if not (hTargetProc = INVALID_HANDLE_VALUE) then
          begin
                result:= TerminateProcess (hTargetProc, -1);
                CloseHandle (hTargetProc);
          end;
end;

procedure pProcessKill (Pid: longint);
begin
        ProcessKill (Pid);
end;

function ProcessKillAll (TaskName: String): bool;
var
        i                : longint;
        bContinue        : bool;
        sCurrentProc        : String;
        hSnapshot        : THandle;
        rCurrentProc        : TProcessEntry32;
begin
        if Length (TaskName) = 0 then
                Exit;

        hSnapshot:= CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
        if hSnapshot = INVALID_HANDLE_VALUE then
                exit;

        rCurrentProc.dwSize        := SizeOf (rCurrentProc);
        bContinue                := Process32First (hSnapshot, rCurrentProc);

        while bContinue do
        begin
                sCurrentProc:= '';
                for i:= 0 to 259 do
                begin
                        if rCurrentProc.szExeFile[i] = #0 then
                                break;

                        sCurrentProc:= sCurrentProc + rCurrentProc.szExeFile[i];
                end;

                if CompareText (sCurrentProc, TaskName) = 0 then
                        Result:= ProcessKill (rCurrentProc.th32ProcessID);

                rCurrentProc.dwSize        := SizeOf (rCurrentProc);
                bContinue                := Process32Next (hSnapshot, rCurrentProc);
        end;

        CloseHandle (hSnapshot);
end;

procedure pProcessKillAll (TaskName: String);
begin
        ProcessKillAll (TaskName);
end;


ZVSRus 17-11-2022 20:55 2996745

DA-Bro

Это понятно, только какая?

А мы об одном и том же говорим?
Иконка должна заменить картинку в правом верхнем углу.

Вот мне и попались в справке два варианта этих словами не скажешь злополучных кодов)

Блин, две страницы форума исписали, наконец то дошло картинку прикрепить.
Там должна быть не иконка, а простая картинка в .bmp или .png формате.
Эта картинка называется WizardSmallImageFile = WizardSmallImage.bmp (директива в секции Setup)
Ранее я вам давал пример как запихнуть свою картинку на MainPanel

Ваш скрипт

DA-Bro 17-11-2022 21:03 2996746

ZVSRus, да с картинкой PNG вы мне помогли. Работает как надо. Как бы вопрос закрыт. Спасибо!

Но тут речь, как ICO вместо BMP заменить, чтобы избавиться от головной боли с этой прозрачностью-непрозрачностью картинок BMP.
Вот и наткнулся на эти два варианта из справки.

DA-Bro 17-11-2022 21:25 2996748

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

DA-Bro 18-11-2022 04:29 2996758

Подскажите пожалуйста! А как вот это сделать.



В обычном мастере показывает только сколько требуется на диске.

Vanadiy777 18-11-2022 15:48 2996782

Цитата:

Цитата DA-Bro
А как вот это сделать. »

DA-Bro,

вот так не подойдет?
Пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DisableFinishedPage=yes
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Languages]
Name: ENG; MessagesFile: "compiler:Default.isl"
Name: RUS; MessagesFile: "compiler:Languages\Russian.isl"

[Files]
Source: {win}\help\mui\0419\*.chm; DestDir: {app}\Files; Flags: external

[CustomMessages]
RUS.FreeSpace=Доступно места на диске:
RUS.NeedSpace=Требуется места на диске:
ENG.FreeSpace=Free space on disk:
ENG.NeedSpace=Need space on disk:

[_Code]
var
NeedSpaceLabel,FreeSpaceLabel: TLabel;
FreeMB, TotalMB: Cardinal;
SizeStr: String;
SizeInt: Integer;
SymbolNumber: Integer;

function NumToStr(Float: Extended): String;
begin
  Result:= Format('%.2n', [Float]);
  StringChange(Result, ',', '.');
  while ( Pos('.', Result) > 0 ) and ( (Result[Length(Result)] = '0') or (Result[Length(Result)] = '.') ) do
    SetLength(Result, Length(Result) - 1);
end;

function GetSize(): Integer;
begin
SizeStr:= WizardForm.DiskSpaceLabel.Caption;
for SymbolNumber:= 97 to 122 do begin
while (Pos(Chr(SymbolNumber), SizeStr) > 0) do Delete(SizeStr, Pos(Chr(SymbolNumber), SizeStr),1); ///Находим все символы нижнего регистра и удаляем
while (Pos(AnsiUppercase(Chr(SymbolNumber)), SizeStr) > 0) do Delete(SizeStr, Pos(AnsiUppercase(Chr(SymbolNumber)), SizeStr),1); end; ///Находим все символы верхнего регистра и удаляем
for SymbolNumber:= 192 to 255 do begin
while (Pos(Chr(SymbolNumber), SizeStr) > 0) do Delete(SizeStr, Pos(Chr(SymbolNumber), SizeStr),1); ///Находим все символы нижнего регистра и удаляем
while (Pos('.', SizeStr) > 0) do Delete(SizeStr, Pos('.', SizeStr), 1); end; ///Удаляем точки
Delete(SizeStr, Pos(',', SizeStr), 5) ///Удаляем дробную часть
Result:= StrToInt(Trim(SizeStr)); ///Переводим в число
end;

function CompareNum(FirstNum, SecondNum: Integer): Boolean;
begin
 if FirstNum < SecondNum then Result:= False else Result:= True;
end;

function MbOrTb(Byte: Extended): String;
begin
 if Byte < 1024 then Result:= NumToStr(Byte) + ' Мб' else
 if Byte/1024 < 1024 then Result:= NumToStr(Byte/1024) + ' Гб' else
Result:= NumToStr(Byte/(1024*1024)) + ' Тб'
end;

procedure GetFreeSpaceCaption(Sender: TObject);
var Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
FreeSpaceLabel.Caption:= ExpandConstant('{cm:FreeSpace} ') + MbOrTb(FreeMB)
NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSpace} ') + MbOrTb(SizeInt)
if WizardForm.CurPageID = wpSelectDir then begin
WizardForm.NextButton.Enabled:= CompareNum(FreeMB, SizeInt)
end;
end;

procedure InitializeWizard();
begin
WizardForm.DiskSpaceLabel.Hide;
#ifdef NeedSize
SizeInt:= {#NeedSize}
#else
SizeInt:= GetSize;
#endif

NeedSpaceLabel := TLabel.Create(WizardForm);
NeedSpaceLabel.SetBounds(ScaleX(0), ScaleY(198), ScaleX(209), ScaleY(13))
NeedSpaceLabel.Parent := WizardForm.SelectDirPage;
NeedSpaceLabel.Transparent:=true;

FreeSpaceLabel := TLabel.Create(WizardForm);
FreeSpaceLabel.SetBounds(ScaleX(0), ScaleY(216), ScaleX(209), ScaleY(13))
FreeSpaceLabel.Parent := WizardForm.SelectDirPage;
FreeSpaceLabel.Transparent:=true;

WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectDir then begin
GetFreeSpaceCaption(nil)
end;
end;


DA-Bro 18-11-2022 19:53 2996796

Vanadiy777, Выдает вот такое окошко.


Vanadiy777 18-11-2022 20:00 2996797

Цитата:

Цитата DA-Bro
Выдает вот такое окошко. »

DA-Bro,

попробуйте сначала только пример скомпилировать.

Версия Inno Setup какая? Я на 5.6.1 проверял.

DA-Bro 18-11-2022 20:11 2996799

Vanadiy777, да, я так сейчас один его и попробую.

В архиве темы увидел пост про другую ошибку. Там пишут переменные нужно объявить глобально. Только как.

У меня наверно нестыковка с другим кодом. Похоже надо что-то объединить. Сам не знаю.

Vanadiy777 18-11-2022 20:26 2996802

Цитата:

Цитата DA-Bro
У меня наверно нестыковка с другим кодом. Похоже надо что-то объединить. Сам не знаю. »

DA-Bro,

если пример отдельно нормально компилируется и работает, то у Вас, видимо, что-то в коде пересекается...
Отсюда же не видно...

DA-Bro 18-11-2022 20:28 2996803

Vanadiy777, Вы мне дали пример похоже один в один то что я попросил как на картинке.

Он работает. То что нужно. Спасибо большое!

Думаю у меня нестыковка с кодом который давали выше с кнопками.

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

DA-Bro 18-11-2022 21:56 2996809

Vanadiy777 Ваш пример "Место на диске" и скрипт от nik1967 тоже рабочий.

Но вот когда их объединяешь лезут ошибки. Не знаю как эту нестыковку поправить.
Как их вот "подружить" друг с другом.
Вот эта ошибка выскочила:


Vanadiy777 18-11-2022 23:39 2996813

Цитата:

Цитата DA-Bro
Но вот когда их объединяешь лезут ошибки. Не знаю как эту нестыковку поправить.
Как их вот "подружить" друг с другом. »

DA-Bro,

Видимо, объединяете не правильно...

Пробуйте...

Скрытый текст
Код:

[Setup]
AppName=Test
AppVersion=1.5
DefaultDirName={pf}\Test
DisableWelcomePage=False
OutputDir=.

[Languages]
Name: "RU"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "EN"; MessagesFile: "compiler:Default.isl"

[Files]
Source: "Image\ReadmeRu.rtf"; DestDir: "{tmp}"; Flags: dontcopy
Source: "Image\ReadmeEn.rtf"; DestDir: "{tmp}"; Flags: dontcopy
//Source: "Language\Russian.lng"; DestDir: "{app}\Language"; Languages: RU; Flags: ignoreversion
//Source: "Language\English.lng"; DestDir: "{app}\Language"; Languages: EN; Flags: ignoreversion

[CustomMessages]
EN.text=More detailed
RU.text=Подробнее
EN.text1=Close
RU.text1=Закрыть
EN.text2=About the program
RU.text2=О программе
EN.text3=Website
RU.text3=Сайт
EN.FreeSpace=Free space on disk:
RU.FreeSpace=Доступно места на диске:
EN.NeedSpace=Need space on disk:
RU.NeedSpace=Требуется места на диске:

[_code]
var
  Flag: Boolean;
  WebButton,AboutButton: TNewButton;
  RichEditViewer: TRichEditViewer;
  Readme: AnsiString;
  r: integer;
  NeedSpaceLabel,FreeSpaceLabel: TLabel;
  FreeMB, TotalMB: Cardinal;
  SizeStr: String;
  SizeInt: Integer;
  SymbolNumber: Integer;

function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.2n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
end;

function GetSize(): Integer;
begin
SizeStr:= WizardForm.DiskSpaceLabel.Caption;
for SymbolNumber:= 97 to 122 do begin
while (Pos(Chr(SymbolNumber), SizeStr) > 0) do Delete(SizeStr, Pos(Chr(SymbolNumber), SizeStr),1); ///Находим все символы нижнего регистра и удаляем
while (Pos(AnsiUppercase(Chr(SymbolNumber)), SizeStr) > 0) do Delete(SizeStr, Pos(AnsiUppercase(Chr(SymbolNumber)), SizeStr),1); end; ///Находим все символы верхнего регистра и удаляем
for SymbolNumber:= 192 to 255 do begin
while (Pos(Chr(SymbolNumber), SizeStr) > 0) do Delete(SizeStr, Pos(Chr(SymbolNumber), SizeStr),1); end; ///Находим все символы нижнего регистра и удаляем
while (Pos('.', SizeStr) > 0) do Delete(SizeStr, Pos('.', SizeStr), 1); ///Удаляем точки
Delete(SizeStr, Pos(',', SizeStr), 5) ///Удаляем дробную часть
Result:= StrToInt(Trim(SizeStr)); ///Переводим в число
end;

function CompareNum(FirstNum, SecondNum: Integer): Boolean;
begin
 if FirstNum < SecondNum then Result:= False else Result:= True;
end;

function MbOrTb(Byte: Extended): String;
begin
 if Byte < 1024 then Result:= NumToStr(Byte) + ' Мб' else
 if Byte/1024 < 1024 then Result:= NumToStr(Byte/1024) + ' Гб' else
 Result:= NumToStr(Byte/(1024*1024)) + ' Тб'
end;

/// { Сколько требуется места на диске.procedure GetFreeSpaceCaption }
procedure GetFreeSpaceCaption(Sender: TObject);
var Path: String;
begin
 Path := ExtractFileDrive(WizardForm.DirEdit.Text);
 GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
 FreeSpaceLabel.Caption:= ExpandConstant('{cm:FreeSpace}  ') + MbOrTb(FreeMB)
 NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSpace}  ') + MbOrTb(SizeInt)
 if WizardForm.CurPageID = wpSelectDir then
  begin
    WizardForm.NextButton.Enabled:= CompareNum(FreeMB, SizeInt)
  end;
end;

procedure WebButtonOnClick(Sender: TObject);
begin
  ShellExec('open', 'http://forum.oszone.net/post-2996351-870.html', '','', SW_SHOW, ewNoWait, r);
end;

procedure SettingHideShowOnClick(Sender: TObject);
begin
  Wizardform.NextButton.Enabled := True;
    if Flag = False then begin
      RichEditViewer.Hide;
      Flag:= True;
      AboutButton.Caption := CustomMessage('text');
    end else begin
      RichEditViewer.Show;
      Flag:= False;
      AboutButton.Caption:= CustomMessage('text1');
      Wizardform.NextButton.Enabled:= True;
    end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    wpWelcome:
    begin
//      Wizardform.NextButton.Enabled:= False;
      RichEditViewer.Hide;
      AboutButton.Caption:= CustomMessage('text');
      Flag:= True;
    end;

    wpSelectDir:
    begin
      GetFreeSpaceCaption(nil)
    end;
  end;
end;

procedure InitializeWizard();
begin
  case ActiveLanguage of
    'RU': begin
      ExtractTemporaryFile('ReadMeRu.rtf');
      LoadStringFromFile(ExpandConstant('{tmp}')+'\ReadMeRu.rtf', Readme);
    end;
    'EN': begin
      ExtractTemporaryFile('ReadMeEn.rtf');
      LoadStringFromFile(ExpandConstant('{tmp}')+'\ReadMeEn.rtf', Readme);
    end;
  end;

  WebButton:= TNewButton.Create(WizardForm);
  with WebButton do begin
    Parent := WizardForm.WelcomePage;
    SetBounds(ScaleX(42),ScaleY(250),ScaleX(80),ScaleY(23));
    Caption := CustomMessage('text3');
    WebButton.OnClick := @WebButtonOnClick;
  end;

  AboutButton:= TNewButton.Create(WizardForm);
  with AboutButton do begin
    AboutButton.SetBounds(ScaleX(42),ScaleY(280),ScaleX(80),ScaleY(23));
    AboutButton.Caption:= CustomMessage('text');
    AboutButton.ShowHint:= True;
    AboutButton.Hint:= CustomMessage('text2');
    AboutButton.OnClick:= @SettingHideShowOnClick;
    AboutButton.Parent:= WizardForm.WelcomePage;
    AboutButton.Cursor:= crHand;
    Flag:= True;
  end;

  RichEditViewer:= TRichEditViewer.Create(WizardForm);
  with RichEditViewer do begin
    Parent:= WizardForm.WelcomePage;
    SetBounds(ScaleX(164),ScaleY(0),ScaleX(333),ScaleY(314));
    ScrollBars:= ssVertical;
    ReadOnly:= True;
    RTFText:= Readme;
  end;

  begin
  WizardForm.DiskSpaceLabel.Hide;
  #ifdef NeedSize
  SizeInt:= {#NeedSize}
  #else
  SizeInt:= GetSize;
  #endif

  NeedSpaceLabel := TLabel.Create(WizardForm);
  NeedSpaceLabel.SetBounds(ScaleX(0), ScaleY(198), ScaleX(209), ScaleY(13))
  NeedSpaceLabel.Parent := WizardForm.SelectDirPage;
  NeedSpaceLabel.Transparent:=true;

  FreeSpaceLabel := TLabel.Create(WizardForm);
  FreeSpaceLabel.SetBounds(ScaleX(0), ScaleY(216), ScaleX(209), ScaleY(13))
  FreeSpaceLabel.Parent := WizardForm.SelectDirPage;
  FreeSpaceLabel.Transparent:=true;

  WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
  WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;
  end;
end;


DA-Bro 18-11-2022 23:49 2996814

Vanadiy777, дык просто не знаю где подправлять). Уже всю голову сломал. Спасибо! Сейчас посмотрю.

Vanadiy777 19-11-2022 00:01 2996815

Цитата:

Цитата DA-Bro
дык просто не знаю где подправлять). »

DA-Bro,
ну, дык надо ж не просто копипастом делать, а посмотреть, что и где жить должно... :wink:

DA-Bro 19-11-2022 00:03 2996816

Vanadiy777, Скрипт работает. Спасибо большое! Попробую остальное к нему добавить.

Подскажите пожалуйста, где была нестыковка. Что не так было?
Хоть знать на будущее.

Vanadiy777 19-11-2022 00:15 2996817

Цитата:

Цитата DA-Bro
Подскажите пожалуйста, где была нестыковка. Что не так было?
Хоть знать на будущее. »

DA-Bro,
Да я бы с удовольствием подсказал... Но я ж не знаю, что Вы там прописали в сценарии...
Давайте полный скрипт - вместе ошибки разберем... :) Может, и остальное вместе прикрутим...

DA-Bro 19-11-2022 00:26 2996819

Vanadiy777, Спасибо!
Я уже вижу некоторые изменения. До меня бы сейчас конечно не дошло. Мало знаний.
Охота самому попробовать всё на место расставить.
Если что, попрошу уж помочь тогда мне тупоголовому).
Спасибо!

Vanadiy777 19-11-2022 00:37 2996820

Цитата:

Цитата DA-Bro
Охота самому попробовать всё на место расставить. »

DA-Bro,
да, примеры и подсказки - это все замечательно, я сам тоже не профессор в этом, и часто помощи прошу более опытных коллег...
По опыту: пока сам не попробуешь, и шишек не наколотишь - понимание не приходит... :)

DA-Bro 19-11-2022 00:40 2996821

Vanadiy777, Когда интересно, можно и шишек понабивать)

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

Vanadiy777 19-11-2022 01:15 2996822

Цитата:

Цитата DA-Bro
А Вы не подскажите, как эти две строчки закомментировать.
Или, если нельзя, совсем их убрать. »

DA-Bro,
нет, не подскажу, к сожалению...
Это надо править в SetupLdr.e32, но, это не всегда заканчивается положительным результатом...
Как вариант - просто не открывать этот файл в Restorator, и не париться на этот счет... :)

DA-Bro 19-11-2022 01:18 2996823

Vanadiy777, ну так то их не видно. А в рестораторе смотришь: чего-то не хватает, не заполнено. Не порядок)))

Добавил я полностью весь скрипт. Всё отлично. Тьфу-тьфу-тьфу...

Спасибо большое! Выручили!

Vanadiy777 19-11-2022 01:28 2996824

Цитата:

Цитата DA-Bro
А в рестораторе смотришь: чего-то не хватает, не заполнено. Не порядок))) »

DA-Bro,
забейте... У меня, например, когда смотрю в рестораторе, "Оригинальное имя файла" - вообще такого пункта нет...
А "Комментарий" в SetupLdr.e32 поправьте в самом компиляторе...

DA-Bro 19-11-2022 01:34 2996825

Vanadiy777, я вот хотел ещё строчку "О программе" убрать.

Нашел вот такое решение:

Код:

  begin
WizardForm.Position:=poScreenCenter;
end;

А оно со скриптом, который Вы мне поправили не состыкуется.
Там файл Readme.RTF черно-белый становится, цвет и шрифт пропадают.

Может у Вас есть решение получше, как убрать эту строчку.

Vanadiy777 19-11-2022 01:52 2996826

Цитата:

Цитата DA-Bro
Может у Вас есть решение получше, как убрать эту строчку. »

DA-Bro,
надо всего одну строчку добавить без всяких begin и end.
Отметил красным, что надо добавить и, главное куда, остальное трогать не надо...
Код:

procedure InitializeWizard();
begin
  WizardForm.Position:=poScreenCenter;
  case ActiveLanguage of


DA-Bro 19-11-2022 02:35 2996827

Vanadiy777, Нет слов. Спасибо!

Просто и четко. Раз и строчки нету.

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

В школе бы учебники раздавали детям и иди отсюда домой изучай, через 10 лет на ЕГЭ придёшь расскажешь)
Так нет, без разъяснений учителей всё равно не обойтись никак.

Спасибо!

DA-Bro 19-11-2022 03:09 2996829

Vanadiy777, а может подскажите.

Я вот скрипт один нашел: "Проценты в прогрессбаре установки".

...
Код:

var
  ProgressLabel: TLabel;

procedure ExtLog();
begin
  with WizardForm.ProgressGauge do begin
    ProgressLabel.Caption:=IntToStr((Position-Min)/((Max - Min)/100)) + '%'
    if (Position-Min)/((Max - Min)/100) > 50 then ProgressLabel.Font.Color:= clWhite
  end
end;

procedure InitializeWizard;
begin
  ProgressLabel:=TLabel.Create(WizardForm)
    ProgressLabel.Top:= 4
    ProgressLabel.Left:= 200
    ProgressLabel.Caption:= '0%'
    ProgressLabel.AutoSize:= True
    ProgressLabel.Font.Color:= clBlue
    ProgressLabel.Font.Style:= [fsBold]
    ProgressLabel.Transparent:= True
    ProgressLabel.Parent:= WizardForm.ProgressGauge
end;



А у него просто нолик с процентами моргает и всё.
Не понятно почему проценты не крутятся, а только "0 %" и всё.

Может есть у Вас получше или рабочее решение.

DA-Bro 19-11-2022 09:46 2996833

Цитата:

Цитата Vanadiy777
надо всего одну строчку добавить без всяких begin и end. »

Vanadiy777 когда строчку эту вписал, с файлами RTF всё нормально, где кнопки на первой странице.

А сейчас проверил на другой перепаковке. У меня там страница "Информация" есть и там тоже файл InfoBefore.rtf.
Те файлы цветные нормальные, а этот черно-белый.

Может ещё что куда надо вписать, чтобы он на странице "Информация" тоже нормально в цвете отображался.

Подскажите пожалуйста!

Vanadiy777 19-11-2022 10:52 2996837

Цитата:

Цитата DA-Bro
А сейчас проверил на другой перепаковке. У меня там страница "Информация" есть и там тоже файл InfoBefore.rtf.
Те файлы цветные нормальные, а этот черно-белый. »

DA-Bro,

Это у Вас все в одном проекте реализовано, или в разных?

Давайте скрипт полностью, который не работает... Так будет быстрее и проще, а то я с Вами запутался совсем... :)

DA-Bro 19-11-2022 11:27 2996838

Vanadiy777, отправил Вам в личку.

Да скрипт в данный момент на всё.

Просто в некоторые перепаковки добавляю InfoBeforeFile. Появляется страница "Информация", и там этот RTF черно-белый.
А где кнопки на первой странице, там нормально.

Код:

InfoBeforeFile = "{tmp}\InfoBefore.rtf"

Vanadiy777 19-11-2022 12:10 2996840

DA-Bro,
отправил в личку...
Там готовый вариант и пример для тестов.

Про проценты в прогресс-баре пока не разобрался.

nik1967 19-11-2022 12:26 2996841

Цитата:

Цитата DA-Bro
А у него просто нолик с процентами моргает и всё.
Не понятно почему проценты не крутятся, а только "0 %" и всё. »

Потому, что не вижу, где инициируется procedure ExtLog();

DA-Bro 19-11-2022 12:27 2996842

Vanadiy777,

Посмотрел скрипт. Вот что увидел.

Файл InfoBeforeRu.rtf предназначен для страницы "Информация".
А он теперь и там и на кнопке показывает.
А на кнопке должен ReadmeRu.rtf всегда отображаться.
И InfoBeforeRu.rtf только для страницы "Информация".

Vanadiy777 19-11-2022 19:55 2996860

Цитата:

Цитата DA-Bro
А он теперь и там и на кнопке показывает. »

Цитата:

Цитата DA-Bro
Файл InfoBeforeRu.rtf предназначен для страницы "Информация".
А он теперь и там и на кнопке показывает. »

DA-Bro,
Вы скрипт скомпилировали, и там это увидели?
Или просто просмотрели сценарий, и увидели, что при процедуре InitializeWizard(); InfoBeforeRu.rtf подгружается так-же, как и ReadmeRu.rtf ???

Что Вас в этом смутило?
Я же дал пример отдельный специально, скомпилируйте и посмотрите.
В Вашем скрипте прописаны те же самые значения - пробуйте... :)

DA-Bro 19-11-2022 20:06 2996861

Vanadiy777, да, я скомпилировал.

На первой странице когда кнопку "О программе" открываете, показывает InfoBeforeRu.rtf.
И на странице "Информация" InfoBeforeRu.rtf. Но тут то как и должно быть. Нормальный в цвете.
А на кнопке "О программе" должен всегда быть ReadmeRu.rtf, а его нет. Наверно его подменяет InfoBeforeRu.rtf.

ReadmeRu.rtf - там короткое описание. Название, версия...

InfoBeforeRu.rtf - подробное описание программы. Много строк...

Vanadiy777 19-11-2022 20:17 2996862

Цитата:

Цитата DA-Bro
InfoBeforeRu.rtf - подробное описание программы. Много строк... »

DA-Bro,
InfoBefore.rtf тоже будет на двух языках? Просто чтобы понимать, как код прописать?

Да, они забивают друг друга... Извините, сам только заметил...

DA-Bro 19-11-2022 20:30 2996863

Vanadiy777, да, пожалуйста сделайте на двух языках, раз уж мастер установки RU-EN.
А то потом приспичит и опять лишний раз просить поправить.

Vanadiy777 19-11-2022 20:36 2996865

Цитата:

Цитата DA-Bro
пожалуйста сделайте на двух языках, раз уж мастер установки RU-EN. »

DA-Bro,
да, поправил и сделал на двух языках.
Отправил в личку, пожалуйста попробуйте, по идее, сейчас должно все работать... :)

DA-Bro 19-11-2022 20:52 2996867

Vanadiy777, теперь получается наоборот. Везде показывает ReadmeRu.rtf.

Vanadiy777 19-11-2022 21:54 2996872

Цитата:

Цитата DA-Bro
теперь получается наоборот. Везде показывает ReadmeRu.rtf. »

DA-Bro,
Вы точно уверены, что правильные rtf-файлы подсовываете?
Возможно у Вас файлы с одинаковым содержимым, просто с разными названиями, поэтому и разницы не видно.

Проверьте все еще раз. С тем скриптом, что я Вам дал, у меня все нормально отрабатывает...

И в "Temp" два разных файла извлекаются (у них даже размер разный), и подгружаются правильно, в зависимости от выбранной задачи.
И, если язык меняешь, то и файлы, соответственно, меняются.

Как еще проверить - не знаю.

DA-Bro 19-11-2022 22:21 2996874

Vanadiy777, Сильно прошу не пинать меня)

У меня было прописано маленькими буквами, в голове застряло что и так сработает независимо от регистра.
И забыл исправить вот это:

...
'en': begin
'ru': begin

Название ReadmeRu

и

[Languages]
Name: "ru"; MessagesFile: compiler:Languages\Russian.isl
Name: "en"; MessagesFile: compiler:Default.isl


Сейчас Всё Отлично. На RU и на EN всё как надо.
Спасибо Огромное!

Vanadiy777 19-11-2022 22:50 2996876

Цитата:

Цитата DA-Bro
Сильно прошу не пинать меня) »

Вы уже на эти грабли наступали с регистром языковых файлов... :) . Ну, это нормально...
Я то без обид, главное, что все работает...

DA-Bro 19-11-2022 23:20 2996878

Vanadiy777, Да хотел еще реализовать вот такую штуку.

...
Хотелось бы реализовать на первой странице два чекбокса.
Обычная установка и Портативная распаковка.

И если выбрать вариант "Портативная распаковка" то
на странице "Выбор папки установки" появлялся бы чекбокс "Упаковать в архив"

В общем при выборе "Портативная распаковка" + "Упаковать в архив"
должна быть функция упаковки файлов для портативки архиватором 7z
с названием архива NameRrogram.VersionProgram.Portable.7z

Как раз на странице "Выбор папки установки" можно сразу и выбрать в какую папку этот архив скинуть.

Vanadiy777 20-11-2022 00:18 2996879

Цитата:

Цитата DA-Bro
Да хотел еще реализовать вот такую штуку. (Про % в прогрессбаре лучше промолчу)) »

DA-Bro,
Это уже точно не ко мне... На этом мои знания заканчиваются...
В теме где то упоминалось что то похожее, попробуйте поискать...

Вот про проценты, но сам не пробовал, хотите - пилите под себя:
Пример
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[Files]
Source: innocallback.dll; Flags: dontcopy
Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs

[_Code]
type
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);

var
PercentsTimer: LongWord;
PercentsLabel: TLabel;

function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';

function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
end;

procedure PercentsProc(h, msg, idevent, dwTime: Longword);
Begin
with WizardForm.ProgressGauge do
begin
PercentsLabel.Caption:= 'Выполнено ' + NumToStr((Position*100)/Max) + ' %';
end;
end;

procedure DeinitializeSetup();
begin
KillTimer(0, PercentsTimer);
end;

procedure InitializeWizard();
begin
PercentsLabel:= TLabel.Create(WizardForm);
with PercentsLabel do
begin
Left:= WizardForm.ProgressGauge.Left;
Top:= WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10);
Width:= WizardForm.StatusLabel.Width;
Height:= WizardForm.StatusLabel.Height;
AutoSize:= False;
Transparent := True;
Parent:= WizardForm.InstallingPage;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));
end;
end;


Понадобится библиотека innocallback.dll, если поиском не найдете, пришлю в личку...

DA-Bro 20-11-2022 00:36 2996880

Vanadiy777, Спасибо, посмотрю.

А не подскажите.
У меня вот такое убивание процесса при удалении.

Код:

[UninstallRun]
Filename: "{sys}\taskkill.exe"; Parameters: "/f /im SSDToolBox.exe /t";

Где-то читал, что так не рекомендуется с taskkill.exe.

Может есть какое более правильное решение.

Vanadiy777 20-11-2022 01:16 2996882

Цитата:

Цитата DA-Bro
Может есть какое более правильное решение. »

DA-Bro,
сам не пробовал...
Пример:
Код:

[Files]
Source: ISTask.dll; DestDir: {app}; Flags: ignoreversion

[_Code]
///функции используемые при деинсталляции
///RunTask@{app}\ISTask.dll - название функции (в данном случае, если программа работает)
///и путь dll'ки где она расположена...

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

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


DA-Bro 20-11-2022 01:50 2996883

Vanadiy777, Спасибо! Попробую.
Что-то кнопки "Полезное сообщение" пропали. Хотел нажать, а их нет. У меня наверно лимит превышен )

Vanadiy777 20-11-2022 21:51 2996974

Цитата:

Цитата DA-Bro
Что-то кнопки "Полезное сообщение" пропали. Хотел нажать, а их нет. У меня наверно лимит превышен ) »

DA-Bro, да, лимит превышен. Появится через определенное время...

DA-Bro 17-12-2022 23:52 2999129

Подскажите пожалуйста.

Как сделать чтобы в инсталляторе при выборе Русского языка прописывалось везде "Русское название программы",
а при выборе Английского или по дефолту "English Name Programs".
И папка программы в меню Start так же называлась при выборе языка.

Что-то вроде этого.

#define AppName "Русское название программы"
#define AppVerName "Русское название программы 1.0"

#define AppName1 "English Name Programs"
#define AppVerName1 "English Name Programs 1.0"

Vanadiy777 18-12-2022 12:46 2999144

Цитата:

Цитата DA-Bro
Что-то вроде этого. »

DA-Bro,
это не нужно...

Вот так нормально работает:
Код:

[Setup]
AppName={cm:AppName}
AppVerName={cm:AppName} 1.0
DefaultGroupName={cm:AppName}
UninstallDisplayName={cm:AppName}

[Languages]
Name: EN; MessagesFile: compiler:Default.isl
Name: RU; MessagesFile: compiler:Languages\Russian.isl

[CustomMessages]
EN.AppName=English Name Programs
RU.AppName=Русское название программы


DA-Bro 18-12-2022 15:16 2999155

Vanadiy777, Спасибо! Помогло. Даже очень.

Подскажите пожалуйста, ещё вот такая загвоздка.

В языковом файле есть такая строчка:

[Messages]
; *** Application titles
SetupWindowTitle=%1

Название программы отображается.
А как сделать чтобы название и версия программы отображались.

Я и так SetupWindowTitle=%1 %2 и так SetupWindowTitle=[name/ver] пробовал подставлять.
Это не срабатывает.

Vanadiy777 18-12-2022 17:10 2999163

Цитата:

Цитата DA-Bro
А как сделать чтобы название и версия программы отображались. »

DA-Bro,

можно так:
Код:

[Setup]
AppName={cm:AppName}
AppVerName={cm:AppName} 1.0
AppVersion=1.0
DefaultGroupName={cm:AppName}
UninstallDisplayName={cm:AppName}

[Languages]
Name: EN; MessagesFile: compiler:Default.isl
Name: RU; MessagesFile: compiler:Languages\Russian.isl

[Messages]
EN.SetupWindowTitle=Setup — %1 {#SetupSetting('AppVersion')}
RU.SetupWindowTitle=Установка — %1 {#SetupSetting('AppVersion')}
; Если в заголовке не нужно "Установка", тогда можно просто так:
SetupWindowTitle=%1 {#SetupSetting('AppVersion')}

[CustomMessages]
EN.AppName=English Name Programs
RU.AppName=Русское название программы


nik1967 18-12-2022 17:38 2999166

Цитата:

Цитата Vanadiy777
можно так: »

А можно так :)

Код:

#define AppVerName "Русское название программы 1.0"
#define AppVerName1 "English Name Programs 1.0"

[Setup]
AppName=Test
AppVername=Test
DefaultDirName={pf}\Test
DisableWelcomePage=False

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

[Code]
procedure InitializeWizard();
begin
  with WizardForm do  begin
    case ActiveLanguage of
      'rus': Caption:= '{#AppVerName}';
      'eng': Caption:= '{#AppVerName1}';
    end;
  end;
end;


Vanadiy777 18-12-2022 17:58 2999169

nik1967,
так даже прикольней... :)

DA-Bro 18-12-2022 19:42 2999187

Vanadiy777, nik1967, Спасибо!

По первому вопросу вариант от Vanadiy777 подошел. Проще получилось и кучу дублей ru и en из секции [Icons] убрал. Нагородил я там огород)

По второму вопросу вариант от nik1967 подошел.
Но у меня вот так сработало:

Код:

begin
  with WizardForm do  begin
    case ActiveLanguage of
      'ru': Caption:= ExpandConstant('{cm:AppName} ') + '{#AppVer}';
      'en': Caption:= ExpandConstant('{cm:AppName} ') + '{#AppVer}';
    end;
  end;
end;

Не знаю правильно-неправильно, но работает)

Vanadiy777 18-12-2022 19:51 2999189

Цитата:

Цитата DA-Bro
Не знаю правильно-неправильно, но работает) »

DA-Bro,
если разработает, то значит правильно...
У Вас там очень сложный скрипт...
В процедуру InitializeWizard(); и так много всего добавлено...
Я бы, честно говоря, лучше бы через через [Messages] сделал бы...
Но, если работает, тогда все нормально...

DA-Bro 18-12-2022 20:11 2999191

Vanadiy777, да есть ещё нестыковки со скриптом.
И вот это объединить не знаю как.

procedure CurPageChanged(CurPageID: Integer);
begin
CurPageChanged1(CurPageID);
CurPageChanged2(CurPageID);
end;

Vanadiy777 18-12-2022 20:18 2999193

DA-Bro,
Я помню Вашу просьбу, и занимаюсь этим вопросом...
Просто сами понимаете - выходные... :wink:

DA-Bro 18-12-2022 20:56 2999197

Vanadiy777, да я не тороплюсь. Понимаю конечно. Я там уже кучу изменений сделал. Даже теперь и не знаю.
Если может самое новое что есть Вам скинуть. Я там ещё ковыряюсь.
Что-то нахожу интересное, пробую добавлять. Смотрю, работает не работает, надо не надо или на потом оставить)

ZVSRus 19-12-2022 09:04 2999213

DA-Bro
Описали бы все свои загвоздки разом, давно бы уже многое решили.

Vanadiy777 19-12-2022 11:50 2999227

Цитата:

Цитата DA-Bro
Если может самое новое что есть Вам скинуть. Я там ещё ковыряюсь.
Что-то нахожу интересное, пробую добавлять. Смотрю, работает не работает, надо не надо или на потом оставить) »

DA-Bro,
Тогда пока ничего не трогаю... Как закончите эксперименты, скиньте в личку, пожалуйста... :)

DA-Bro 30-12-2022 19:54 2999995

Всех с наступающим!
Подскажите пожалуйста. Такой вопрос:

Как сделать так, чтобы при нахождении Программа.exe
в C:\Program Files (x86)\Программа туда копировались файлы в папку C:\Program Files (x86)\Программа\Папка
а если Программа.exe находится в C:\Program Files\Программа , то файлы копировались в C:\Program Files\Программа\Папка

И второй вопрос:

Как можно прикрутить кнопку пониже выбора пути установки, чтобы можно было переключать путь с "Program Files (x86)" на "Program Files" и наоборот.

ZVSRus 31-12-2022 15:37 3000019

Цитата:

Цитата DA-Bro
Как можно прикрутить кнопку пониже выбора пути установки, чтобы можно было переключать путь с "Program Files (x86)" на "Program Files" и наоборот.


Пример

Код:

[Setup]
AppName=My Application
 AppVersion=1.5
 DefaultDirName={pf}\My Application
 OutputDir=.

[Code**]
var
 
Button: TNewButton;
  Flag: Boolean;

procedure HideShow(Sender: TObject);
begin
  if not
Flag then begin
   
Button.Caption:='x86';
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{pf64}')) + 'My Application';
    Flag:= True;
  end else begin
   
Button.Caption:='x64';
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{pf32}')) + 'My Application';
    Flag:= False;
  end;
end;

procedure InitializeWizard();
begin
 
Button := TNewButton.Create(WizardForm);
  with Button do
  begin
   
Parent := WizardForm.SelectDirPage;
    SetBounds(ScaleX(342),ScaleY(120),ScaleX(75),ScaleY(23));
    Caption := 'x64';
    OnClick := @HideShow
  end;
end;



Но так и не понял логику вопроса.

DA-Bro 31-12-2022 17:00 3000023

Цитата:

Цитата ZVSRus
Но так и не понял логику вопроса. »

Здравствуйте! Вот что нужно:

Папку с шаблонами нужно скопировать в папку с программой.
Если установщик находит программу (если она установлена) в "Program Files (x86)" то копирует файлы туда, а если программа находится в "Program Files" то по этому пути.
Если программа не установлена то по идее нужно чтобы появилось сообщение об этом или просто остался путь по умолчанию.

Тут речь идёт не об установки программы а шаблонов в эту программу. Соответственно и "Program.exe" нет в установщике, не указан.

ZVSRus 31-12-2022 18:55 3000029

Цитата:

Цитата DA-Bro
Тут речь идёт не об установки программы а шаблонов в эту программу.

Тогда всё понятно. Думаю что предыдущий пример вам просто не нужен. Ищем в реестре куда установлена программа (в pf32 или pf64) и установщик автоматом устанавливает дополнения.
Если программы нет, тогда выдаётся сообщение что программа не найдена, кнопка OK и ничего не происходит.
Пример из справки

Код:

[Setup]
AppName=GetDeviceInfo
 AppVerName=GetDeviceInfo
 DefaultDirName={code:GetInstallDir}\My Papka
 OutputDir=.

 Uninstallable=no

[Code**]
function GetInstallDir( AppID: String ): String; var dir: String;
begin
  if not
RegQueryStringValue(HKLM, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\My Application_is1', 'InstallLocation', dir) then
       
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Application_is1', 'InstallLocation', dir);
  Result:= dir;
end;

function InitializeSetup(): Boolean;
begin
     
Result:= True;
  if not RegKeyExists(HKLM, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\My Application_is1') then
    begin
  if not
RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Application_is1') then
    begin
     
MsgBox('Программа не найдена!', mberror, mb_ok);
      Result:=False;
    end;
  end;
end;



Тестируй в паре с предыдущим примером

inyourspace 03-01-2023 17:41 3000150

Всем привет. Подскажите, пожалуйста: требуется, чтобы после установки программы, на рабочем столе в автоматическом режиме создавался ярлык (без права выбора пользователем - создавать его, или нет), и чтобы в этом ярлыке, в поле "Объект", автоматом были прописаны нужные параметры запуска. К примеру: "путь_установки\исполняемый_файл.exe" -параметр запуска 1 -параметр запуска 2
Не могу разобраться, как это сделать.

Vanadiy777 03-01-2023 18:12 3000153

inyourspace,
Пример
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.

[Files]
Source: "MyProg.exe"; DestDir: "{app}"

[Icons]
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"; Parameters: "-параметр запуска 1 -параметр запуска 2";


inyourspace 03-01-2023 23:31 3000169

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

Vanadiy777 04-01-2023 11:41 3000196

Цитата:

Цитата inyourspace
Из-за чего может так быть? »

inyourspace,
компилятор, видимо, не понимает кодировку, в которой сохранен txt.
Попробуйте сохранить txt-файл в другой кодировке.

vetal_the_great@vk 05-01-2023 18:09 3000335

Приветствую.
Возможно здесь где-то есть ответ, но я сейчас с телефона и искать крайне сложно.

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

К примеру:
Data1.bin нужно установить однозначно.
Затем или Data2.bin, или Data3.bin, что зависит от выбора пользователя. Установить оба архива невозможно.
Далее установить Data4.bin и Data5.bin, или какой-то один из этих архивов, или вовсе ни одного.

Заранее спасибо.

ZVSRus 06-01-2023 10:48 3000349

Цитата:

Цитата vetal_the_great@vk
Пожалуйста, подскажите или дайте ссылку на информацию о том, как сделать выборочную распаковку архивов.

Может как то так

Код:

[Setup]
AppName=My Application
 AppVersion=1.5
 DefaultDirName={pf}\My Application
 OutputDir=.

[Languages]
Name: "EN"; MessagesFile: "compiler:Languages\English.isl"
 Name: "RU"; MessagesFile: "compiler:Languages\Russian.isl"

[CustomMessages]
EN.ComponentsName1=Install Data1.bin
 EN.ComponentsName1_1=Install Data2.bin
 EN.ComponentsName1_2=Install Data3.bin
 EN.ComponentsName2=Install Data4.bin
 EN.ComponentsName3=Install Data5.bin

 RU.ComponentsName1=Установить Data1.bin
 RU.ComponentsName1_1=Установить Data2.bin
 RU.ComponentsName1_2=Установить Data3.bin
 RU.ComponentsName2=Установить Data4.bin
 RU.ComponentsName3=Установить Data5.bin

[Components]
Name: Data1; Description: {cm:ComponentsName1}; Types: Full Compact Custom; Flags: fixed
 
Name: Data1\Data2; Description: {cm:ComponentsName1_1}; Types: Full; Flags: exclusive
 
Name: Data1\Data3; Description: {cm:ComponentsName1_2}; Types: Compact; Flags: exclusive
 
Name: Data4; Description: {cm:ComponentsName2}; Types: Full;
 Name: Data5; Description: {cm:ComponentsName3}; Types: Full;

[Files]
Source: "Data1.txt"; DestDir: "{app}"; Components: Data1; Flags: ignoreversion
 
Source: "Data2.txt"; DestDir: "{app}"; Components: Data1\Data2; Flags: ignoreversion
 
Source: "Data3.txt"; DestDir: "{app}"; Components: Data1\Data3; Flags: ignoreversion
 
Source: "Data4.txt"; DestDir: "{app}"; Components: Data4; Flags: ignoreversion
 
Source: "Data5.txt"; DestDir: "{app}"; Components: Data5; Flags: ignoreversion


vetal_the_great@vk 06-01-2023 12:11 3000352

Спасибо за ответ, но, похоже, что примерно таким способом я и делаю. Минус этого в том, что inno setup засовывает файлы непосредственно в setup.exe, увеличивая его размер. При установке он просто засовывает нераспакованные архивы в папку. Да, можно указать, чтобы установщик эти архивы распечатал, но размер setup.exe от этого не уменьшится. Поэтому я хочу сделать так, чтобы при выборе архива А он распаковывался, а архив Б оставался нетронутым, не засовывался ни в какие папки.

Вот тут идет распаковка:
Скрытый текст
if not ISArcExtract ( 0, 100, ExpandConstant('{src}\data.bin'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;


Вот какие строчки надо добавить, чтобы установщик, ссылаясь к выбранным компонентам, распаковывал соответствующие архивы, находящиеся в одной папке с setup.exe.

Vanadiy777 06-01-2023 15:52 3000369

Цитата:

Цитата vetal_the_great@vk
Вот какие строчки надо добавить, чтобы установщик, ссылаясь к выбранным компонентам, распаковывал соответствующие архивы, находящиеся в одной папке с setup.exe. »

vetal_the_great@vk,
тогда не понятна суть вопроса.

vetal_the_great@vk 06-01-2023 16:43 3000377

Вложений: 1
Цитата:

Цитата Vanadiy777
тогда не понятна суть вопроса. »

Ладно, попробую еще раз.

Есть 5 архивов .bin. Они лежат в папке с setup.exe (см. картинку).

Вот мне нужно, чтобы data.bin установился однозначно, так как там основные файлы.

Архивы data 1.bin и data 2.bin содержат данные интерфейса, противоречащие друг другу. Поэтому нужно установить какой-то один из них, но на выбор: кого-то больше устроит data 1.bin, кого-то data 2.bin.

Архивы data 3.bin и data 4.bin содержат дополнительные файлы, которые можно установить все, или любой из них, или ни одного вообще.

Как это сделать в компонентах я примерно понимаю.

Скрытый текст
Код:

[Components]
Name: Interface; Description: Интерфейс; Types: full; Flags: exclusive
Name: Interface\data 1.bin; Description: Стандартный дизайн интерфейса; Flags: exclusive; ExtraDiskSpaceRequired: 200000000
Name: Interface\data 2.bin; Description: Новый дизайн интерфейса; Flags: exclusive; ExtraDiskSpaceRequired: 100000000

Name: adfiles; Description: Дополнительные файлы; Types: full; Flags: dontinheritcheck
Name: adfiles\data 3.bin; Description: доп файл 1; Flags: checkablealone; ExtraDiskSpaceRequired: 500000000
Name: adfiles\data 4.bin; Description: доп файл 2; Flags: checkablealone; ExtraDiskSpaceRequired: 600000000
#endif

[Files]
Source: output\data 1.bin; DestDir: {app}; Components: adfiles\data 3.bin;
Source: output\data 2.bin; DestDir: {app}; Components: adfiles\data 4.bin;
Source: output\data 3.bin; DestDir: {app}; Components: Interface\data 1.bin;
Source: output\data 3.bin; DestDir: {app}; Components: Interface\data 2.bin;



Но тогда все эти файлы загрузятся внутрь setup.exe и этот файл будет весить более 300мб, а сейчас он весит четь больше 1 мб.
Я хочу, чтобы никакие архивы не добавлялись внутрь setup.exe. При запуске exe и после выбора пользователем нужных компонентов, setup.exe распаковывал только те архивы, которые были указаны, а остальные не трогал. То есть если юзер выбрал data 1.bin, то data 2.bin просто пропускается.

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

Vanadiy777 06-01-2023 17:22 3000380

Цитата:

Цитата vetal_the_great@vk
Где я уже только не лазил, ответ не нахожу. Это мой первый скрипт, и я сразу решил морочить себе голову »

vetal_the_great@vk,
Скрипт дайте полностью (можете в личку, если здесь светить не хотите...) :wink:

DA-Bro 23-01-2023 13:25 3001595

Здравствуйте! Помогите пожалуйста со скриптом как у NSIS.
Может есть получше варианты, пока не видел.

ZVSRus 24-01-2023 09:02 3001647

Цитата:

Цитата DA-Bro
Здравствуйте! Помогите пожалуйста со скриптом.
Нужен скрипт установки вот с таким окном и с теми же вариантами установки:

С чьих репаков сделаны скрины я понял, только где вы их взяли, там ещё 3 автора, со своими разновидностями.
Ну да ладно, Так пойдёт (предварительный вариант)

Vanadiy777 24-01-2023 09:45 3001651

Цитата:

Цитата ZVSRus
Ну да ладно, Так пойдёт (предварительный вариант) »

ZVSRus,
мне очень пойдет.
Буду очень признателен, если со мной тоже поделитесь.
Заранее спасибо.

DA-Bro 24-01-2023 13:17 3001663

ZVSRus, Здравствуйте! Ещё как пойдёт.

Vanadiy777 24-01-2023 16:18 3001680

Цитата:

Цитата DA-Bro
Ещё как пойдёт. Давайте пожалуйста. »

ZVSRus,
и мне давайте пожалуйста, даже в таком варианте подойдет. :)

ZVSRus 24-01-2023 16:57 3001684


Второй вариант скрипта. Тестируйте на предмет ошибок, а то уже глаз за мылился. Как отшлифую так и выложу.

DA-Bro 24-01-2023 17:14 3001685

ZVSRus, да визуально всё нормально.

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

ZVSRus 24-01-2023 17:38 3001690

Цитата:

Цитата DA-Bro
да визуально всё нормально

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

DA-Bro 24-01-2023 18:03 3001696

ZVSRus, да так всё пощелкал, посмотрел, всё совпадает.

При выборе английского языка установщика надписи на русском. Но это в принципе сам тогда доделаю.

Ещё хотел тут по тихим ключам установки.

А именно:

Обычный вариант установки, понятно, /verysilent. Как бы вопросов нет.

Но вот с портативным режимом нужно, чтобы был ключ /p и /P, чтобы срабатывали и нижний и верхний регистры.

То есть так:

/verysilent - обычная тихая установка
/VERYSILENT - обычная тихая установка

/verysilent /p - распаковка портативной версии
/VERYSILENT /P - распаковка портативной версии

Ну или даже так срабатывало

/verysilent /P и /VERYSILENT /p


А, вот еще, скорее наверное вопрос:

А можно вообще при установке обычной версии AppId было выбранной редакции.
AIDA64 Business, AIDA64 Extreme...
Или для всего оставить AIDA64 и не заморачиваться.

ZVSRus 24-01-2023 18:54 3001698

Цитата:

Цитата DA-Bro
Ещё хотел тут по тихим ключам установки.

Прикручу, придётся подождать.

Цитата:

А можно вообще при установке обычной версии AppId было выбранной редакции.
Вот поэтому и написал, чтобы все хотелки сразу.
В данном скрипте есть функция AppID, для каждой редакции свой AppID
Код:

function GetAppID(const Value: string): string;                 
var                                                             
 
AppID: string;


DA-Bro 24-01-2023 19:03 3001699

ZVSRus, да конечно подожду сколько нужно, не горит. С AppID понял. Спасибо большое!

При завершении установки не знаю у Вас появляется окно: установка или распаковка завершена, запустить программу сейчас.

Vanadiy777 24-01-2023 19:35 3001700

ZVSRus, DA-Bro,
Парни, ну скрип то дайте пожалуйста... Хоть какой-нибудь промежуточный... :)
А, то у вас междусобойчик, а я здесь как сирота... :o

ZVSRus 24-01-2023 19:37 3001701

Скрытый текст



DA-Bro 24-01-2023 19:40 3001702

Vanadiy777, так он его допиливает, у меня его тоже нет.
ps я в прошлый раз со скриптом разобрался. У меня там косяк похоже был из-за скина. Похоже скин такой что при наведении на кнопку Далее она не подсвечивается, а только тогда когда нажмёшь на кнопку. Без скина попробовал, всё нормально с кнопкой. Аномалия) Так что спасибо за помощь! Потом уж со скином придётся разобираться.

Vanadiy777 24-01-2023 19:51 3001704

Цитата:

Цитата DA-Bro
У меня там косяк похоже был из-за скина. »

DA-Bro,
от использования скинов давно отказался...
Во первых, лишний вес, во вторых, гораздо большее срабатывание сканеров на VirusTotal...

DA-Bro 24-01-2023 19:52 3001705

ZVSRus, такое вот хотелось бы окно:

Только в первой строчке: Установка / Распаковка завершена. В зависимости от установки или распаковки.
Скрытый текст


И ещё, можно чтобы файл в окне "Информация" InfoBeforeRu.rtf некликабельным был и выделить там текст нельзя было. Только прокручивать.

Vanadiy777 24-01-2023 20:16 3001708

Цитата:

Цитата DA-Bro
можно чтобы файл в окне "Информация" InfoBeforeRu.rtf некликабельным был и выделить там текст нельзя было. Только прокручивать. »

DA-Bro,
Я, конечно, не профессор в этом деле, но, если мне не изменяет память, то нет в Inno Setup такой функции...

DA-Bro 24-01-2023 20:23 3001709

Vanadiy777, в Inno Setup может и нет. Но у репакеров такое есть. Не выделяется текст.
Если там конечно ссылка какая на сайт, чтобы кликнуть, то лучше чтобы кликабельность была. А если нет, достаточно для чтения прокутки одной и чтобы этот "слеш", как его там, не моргал перед передней буквой.

DA-Bro 24-01-2023 21:35 3001710

ZVSRus, вот ещё что хотелось бы. Забыл попросить про выбор папки установки как у NSIS.
И вот кнопку с информацией о программе.

ZVSRus 25-01-2023 19:22 3001778


Ну последний раз протестируйте. И на этом хватит.

DA-Bro 25-01-2023 20:20 3001779

ZVSRus, сказать Спасибо, ничего не сказать. В общем, всё как надо.

Есть ещё кое что подправить:
Я запустил батник с тихой установкой, а там окно всплыло Установка завершена. Получается не тихая установка.

Vanadiy777 25-01-2023 20:27 3001780

ZVSRus,
для меня вообще идеальный вариант.
Огромная просьба - пожалуйста, скиньте в личку весь скрипт.
Заранее - Огромное СПАСИБО!!!

Цитата:

Цитата DA-Bro
то есть ещё несколько чисто косметических просьб. »

DA-Bro,
уж косметику-то сами допилите... Или Вам прямо "под ключ" надо? :)

DA-Bro 25-01-2023 20:38 3001781

Vanadiy777, да я просто скрипт не видел. С виду всё и так отлично! Только вот с тихими ключами окно всплывает о завершении установки.
Да по мелочи туда сюда подвинуть переставить, кое что убавить я уж думаю сам смогу.
Так, сказал на всякий случай. Может Вас попрошу, если не получится)

Vanadiy777 25-01-2023 22:25 3001789

Цитата:

Цитата DA-Bro
Только вот с тихими ключами окно всплывает о завершении установки. »

DA-Bro,
когда скрип будет, то в код, перед окном сообщения, можно будет добавить "if not WizardSilent then"...
Тогда, при тихой установке, окно появляться не будет.
Цитата:

Цитата DA-Bro
Может Вас попрошу, если не получится) »

Все у Вас получится... Вы уже больше меня знаете... :)

ZVSRus 26-01-2023 10:22 3001803

Цитата:

Цитата DA-Bro
Я запустил батник с тихой установкой, а там окно всплыло Установка завершена. Получается не тихая установка.

А вы обратили внимание на то что находится на финишной форме, помимо информации что программа установлена есть функция на запуск каждой редакции, и чекбокс на открытие интернет страницы, и if not WizardSilent then здесь бессилен.
Вы такое окно захотели. Вывод: или ключи тихой установки в топку, или финишное окно без всяких наворотов, информация и кнопка OK.

Цитата:

Цитата DA-Bro
А вот эта штука продолжает моргать перед первой буквой:

Что-бы слеш не мигал я ни у кого не видел. В TRichEditViewer всё обшарил, как отключить не нашёл. Если вы видели у кого то
(догадываюсь у кого) запустите его установщик, кликнете лкм на экране (не на установщике) а потом кликнете на значок установщика в панели задач, и вы увидете что и у него мигает.

Цитата:

Цитата DA-Bro
В пути установки сейчас показывает при длинном пути вначале букву диска:
А по нормальному должно показывать конечную папку:

Это вы так хотите, или же так должно быть. Если DirEdit не светится синим цветом, то InnoSetup именно так и хотит.
А длинный путь укоротите перемещением готового установщика, ну скажем в корень диска D:, или в скрипте константу {src} замените
на {sd} или {userdesktop} и будет короткий путь, но тут как говориться, о вкусах не спорят.

Цитата:

Цитата Vanadiy777
когда скрип будет, то в код, перед окном сообщения, можно будет добавить "if not WizardSilent then"...
Тогда, при тихой установке, окно появляться не будет.

Нужно не перед окном сообщения добавлять "if not WizardSilent then"..., а в procedure CurStepChanged(CurStep: TSetupStep);
на этапе ssDone

Vanadiy777 26-01-2023 10:27 3001804

Цитата:

Цитата ZVSRus
Нужно не перед окном сообщения добавлять "if not WizardSilent then"..., а в procedure CurStepChanged(CurStep: TSetupStep);
на этапе ssDone »

Я это и имел ввиду, просто не стал расписывать очевидные вещи... :wink:

DA-Bro 26-01-2023 10:59 3001806

ZVSRus, Здравствуйте! Получается из-за редакций нельзя по тихому поставить с окном завершения. Тогда уж тихую установку оставьте.

Vanadiy777 26-01-2023 11:11 3001807

ZVSRus,
Не могли бы Вы мне дать скрипт именно в таком виде как сейчас?
Спасибо заранее!

DA-Bro 26-01-2023 14:10 3001819

Цитата:

Цитата ZVSRus
помимо информации что программа установлена есть функция на запуск каждой редакции »

Я предполжил, что при выборе любой редакции будет ставиться в папку "AIDA64" без всяких приставок редакций.

Vanadiy777 26-01-2023 14:25 3001822

Цитата:

Цитата DA-Bro
Я предполжил, что при выборе любой редакции будет ставиться в папку "AIDA64" без всяких приставок редакций. »

DA-Bro,
а с чего, вдруг, у Вас возникло такое предположение?
В оригинальных установщиках тоже в названии папки редакция прописывается.
Вполне вероятно, что сделано это для того, чтобы было можно поставить несколько редакций одновременно.

DA-Bro 26-01-2023 16:50 3001828

Vanadiy777, да я как-то и не думал, чтобы в обычной установке саму папку с выбранной редакцией называть. Если только при распаковке.
В оригинале, один установщик - одна редакция, а тут все в одном.
Да и не предполагал сразу несколько редакций ставить.

ZVSRus 26-01-2023 17:25 3001832


Setup Final

Господа, я конечно извиняюсь, ничего личного, вы для чего в данной теме находитесь?. Что-бы кто-то чем-то помог, или ласкать друг друга в виде лайков за посты не о чём.
Вы своим флудом всю тему засрали!. Многие тему по InnoSetup на данном форуме стали стороной обходить. Страница 97 4 поста не о чём, но свои лайки крендель получил.
Администратор от вас уже начал кнопку прятать.

PS: Если в моих постах информация для вас не несёт ничего позновательного, ставить лайк мне не нужно, меня даже и это раздражает!

DA-Bro 26-01-2023 17:41 3001833

ZVSRus, да всё отлично!

ZVSRus 26-01-2023 17:56 3001834

Цитата:

Цитата DA-Bro
Только вот закрался маленький нюансик. Там вроде путь прописан, а не название и версия.

Путь там, это константа {src} это значит что портативная версия распакуется рядом с установщиком в папку какую выделили.

DA-Bro 26-01-2023 18:09 3001837

ZVSRus, а как там надпись на название и версию поправить. А то надпись сверху в "Установка - AIDA64 ХХХХ Business, и в "Распаковка - AIDA64 ХХХХ Business" также думаю должна.

ZVSRus 26-01-2023 18:43 3001839

В процедуре
procedure CurPageChanged(CurPageID: Integer);
найди wpSelectDir:
далее в
if Portable.Checked and Extreme.Checked then
if Portable.Checked and Business.Checked then
if Portable.Checked and Engineer.Checked then
if Portable.Checked and NetworkAudit.Checked then
найди строки
WizardForm.SelectDirLabel.Caption:= FmtMessage(ExpandConstant('Программа распакует {#MyAppNamePortable_4} в следующую папку.'), [ExpandConstant('{#SetupSetting("AppName")}')]);
WizardForm.Caption:= FmtMessage(ExpandConstant('Распаковка — {#MyAppNamePortable_4}'), [ExpandConstant('{#SetupSetting("AppName")}')]);

названия {#MyAppNamePortable_4} исправь на {#MyAppName_4}, в общем сотри слово {#MyAppNamePortable_4} везде, индекс 1, 2, 3, 4 не трогай.

ZVSRus 27-01-2023 09:09 3001856

DA-Bro,

Для одной программы так пойдёт?.

DA-Bro 27-01-2023 12:29 3001861

ZVSRus, Пойдёт.
В начале выбор языка не показывает Русский-Английский.
Можно пожалуйста ещё добавить ярлык Закрепить в меню Пуск (это где все программы, а не ярлык где папки с программами).
Можно пожалуйста ещё добавить ассоциации с файлами?
Старые скрипты какие-то где-то видел, но пойдут ли они для новых систем - неизвестно.
И ещё по кнопке О программе. Можно ли надпись сверху по центру сделать?

ZVSRus 27-01-2023 13:39 3001868

Цитата:

Цитата DA-Bro
В начале выбор языка не показывает Русский-Английский.

Не показывает потому что в скрипте ещё нет секции [Languages]
Цитата:

Цитата DA-Bro
Можно пожалуйста ещё добавить ярлык Закрепить в меню Пуск (это где все программы, а не ярлык где папки с программами).

Этот ярлык я принципиально не делаю, так-как опять же нужно лезть в меню пуск, если ярлык на панели задач, и лазить ни куда не нужно, зачем же ещё там то дублировать, это во первых. Во вторых учтите что многие ставят специализированные программы расширяющие возможности меню пуск, и тогда ярлык там крепиться не будет, а к вам будут вопросы почему ярлык не крепиться.
У меня стоит Classic Start Menu и ярлыки у меня в меню пуск не крепятся.
Цитата:

Цитата DA-Bro
Можно пожалуйста ещё добавить ассоциации с файлами?

Принято!
Цитата:

Цитата DA-Bro
И ещё просьба по кнопке О программе. Можно ли надпись сверху по центру сделать?

Можно, но только вручную. Находишь в скрипте Диалоговое окно "О программе" далее procedure InfoButtonClick(Sender: TObject);
далее Caption:= 'Информация о RePack,е'; и двигаешь от передней кавычки слово Информация о RePack,е, тестируешь и смотришь.

Vanadiy777 27-01-2023 14:18 3001874

ZVSRus,
Помогите пожалуйста, если возможно...
Компилятор Inno Setup 5.5.1.ee2 Ultra Unicode (это принципиально)
Мне необходимо сделать так, чтобы программа запускалась только на Windows 10 и выше.

В секции [Setup] прописываю директиву MinVersion=0.0,6.3 - не работает, MinVersion=0.0,10.0 - не работает...
Понимает только MinVersion=0.0,6.2, но это же для Windows 8, а надо, чтобы работало начиная с Windows 10...

Подскажите, как правильно сделать...

Спасибо.

DA-Bro 27-01-2023 14:24 3001875

Цитата:

Цитата ZVSRus
Этот ярлык я принципиально не делаю, так-как опять же нужно лезть в меню пуск, если ярлык на панели задач, и лазить ни куда не нужно, зачем же ещё там то дублировать »

Да тут зависит у кого какие тараканы в голове. Каждый нажмёт на тот ярлык который ему нужен. Я у других посмотрел, например в StartAllBack он нормально крепится. А где не сработает, не беда. Да и удалять, не добавлять.

Если можно, окно об удалении настроек программы.

ZVSRus 27-01-2023 19:51 3001900

Цитата:

Цитата Vanadiy777
Компилятор Inno Setup 5.5.1.ee2 Ultra Unicode (это принципиально)
Мне необходимо сделать так, чтобы программа запускалась только на Windows 10 и выше.

В секции [Setup] прописываю директиву MinVersion=0.0,6.3 - не работает, MinVersion=0.0,10.0 - не работает...
Понимает только MinVersion=0.0,6.2, но это же для Windows 8, а надо, чтобы работало начиная с Windows 10...

Что значит MinVersion=0.0,6.3 - не работает, MinVersion=0.0,10.0 - не работает...
И что значит Понимает только MinVersion=0.0,6.2
На какой ОС работаете.

Картинки



Правильно

Правильно

Правильно

Правильно

Правильно
Как видно по картинкам все директивы отработали правильно, так-как сижу на Win7


Почитай здесь.

Vanadiy777 27-01-2023 21:12 3001904

Цитата:

Цитата ZVSRus
Почитай здесь. »

ZVSRus,
перечитал все с самого начала до последней части [часть 9] еще задолго до этого, ответа не нашел...

Разговор о том, что инсталлятор, собранный в Inno Setup 5.5.1.ee2 Ultra Unicode, не понимает директиву выше чем MinVersion=0.0,6.2 на ОС выше Windows 8...
Inno Setup 5.5.1.ee2 Ultra Unicode






Тот же скрипт, собранный в другом компиляторе, нормально отрабатывает.
Inno Setup 5.6.1 Unicode


Операционная система Windows 10-11.

Можно это как-то обойти?

ZVSRus 28-01-2023 10:47 3001917

Vanadiy777,
Всё правильно, если верить справке что прикреплена к Inno Setup 5.5.1.ee2 Ultra Unicode MinVersion принимается до Win8
А в справке Inno Setup 5.6.1 сказано что MinVersion принимается по Win10.
Ну да ладно, если я правильно понял вам нужно что-бы ваш установщик запускался начиная с Win10, а на версии что ниже Win10 установщик не запускался ну и выдавал какое либо сообщение.
Если так тогда может вам не вокруг MinVersion танцевать, а прикрутить функцию проверки версии Windows.
В Win 10 установщик будет запускаться, а что ниже 10 будет выдавать сообщение о не соответствии Windows.

Vanadiy777 28-01-2023 12:35 3001923

Цитата:

Цитата ZVSRus
а прикрутить функцию проверки версии Windows. »

ZVSRus,
Да, это я уже понял...
Только пока не знаю, какой вариант использовать.
Можно попробовать взять из реестра значение CurrentVersion, у 10-ки оно 6.3, и если значение будет меньше,
то сообщение о не соответствии и выход.
Или заморочиться с процедурой GetWindowsVersionEx, потому, что функция GetWindowsVersion отрабатывает некорректно.

Если у Вас есть какие-либо соображения, пните в нужном направлении, пожалуйста...

ZVSRus 28-01-2023 17:27 3001931

Vanadiy777,
Тестируй

Код:


[Setup]
AppName=My Application
 AppVersion=1.5
 DefaultDirName={pf}\My Application
 OutputDir=.

[Code**]
function IsWindowsVersionOrNewer(Major, Minor: Integer): Boolean;
var
 
Version: TWindowsVersion;

begin
 
GetWindowsVersionEx(Version);
  Result:= (Version.Major > Major) or ((Version.Major = Major) and (Version.Minor >= Minor));
end;

function InitializeSetup(): Boolean;
begin
  if
IsWindowsVersionOrNewer(10, 0) then Result:= True else
   
MsgBox('Версия Windows не соответствует требуемым параметрам', mbError, MB_OK);
end;


Vanadiy777 28-01-2023 21:34 3001942

ZVSRus,
Нет, не работает пока...
На всех ОС окошко выдает...
Если править Result:= , то начинает запускаться на всех ОС.
Не понимает она, видимо, Major больше заявленного в программе...

Похоже, через реестр придется делать...

ZVSRus 29-01-2023 09:45 3001954

Vanadiy777,
В Result ничего править не нужно.
Поиграйся с циферками if IsWindowsVersionOrNewer(10, 0).

Vanadiy777 29-01-2023 13:30 3001966

Цитата:

Цитата ZVSRus
В Result ничего править не нужно.
Поиграйся с циферками if IsWindowsVersionOrNewer(10, 0). »

ZVSRus,
Result не трогаю...
Играюсь с циферками в if IsWindowsVersionOrNewer...

Смотри, что получается:
Если ставлю if IsWindowsVersionOrNewer(6, 2), то нормально запускается на 10-11, но и на 8-ке тоже запускается (чего совсем не хотелось бы...).
На 7-ке, как и должно быть, выдает окно о несоответствии.
Если ставлю if IsWindowsVersionOrNewer(6, 3), то сразу окно о несоответствии на всех системах...

Похоже, что в этом компиляторе, процедура GetWindowsVersionEx так же не понимает новые Major, Minor,
так же как и директива MinVersion...

Осталось только попробовать костыль с реестром, через CurrentVersion...

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

iglezz 29-01-2023 15:14 3001970

Цитата:

Цитата Vanadiy777
Похоже, что в этом компиляторе, процедура GetWindowsVersionEx так же не понимает новые Major, Minor, »

Именно так, это было исправлено в версии 5.5.6

И это можно легко исправить самому через изменение манифеста:

1. Открыть Setup.e32 и SetupLdr.e32 в Resource Hacker
2. Открыть Manifest
там в конце xml-манифеста будет секция
Код:

  <application>
        <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
        .....
    </application>

её надо исправить на
Код:

    <application>
        <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
        <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
        <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
        <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
        <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
    </application>

после этого скомпилировать изменённый манифест (F5)
3. Сохранить изменённый файл

Код для тестирования
Код:

procedure TestWindowsVersion();
var
  V: TWindowsVersion;
begin
  GetWindowsVersionEx(V);

  MsgBox(Format( \
    'Major'#09'%d'#13 \
    'Minor'#09'%d'#13 \
    'Build'#09'%d'#13 \
    'SPMajor'#09'%d'#13 \
    'SPMinor'#09'%d'#13 \
    , [V.Major, V.Minor, V.Build, V.ServicePackMajor, V.ServicePackMinor]), mbInformation, MB_OK);
end;

function InitializeSetup(): Boolean;
begin
  TestWindowsVersion()       
        Result := False
end;


Vanadiy777 29-01-2023 15:52 3001972

iglezz,
Просто - СУПЕР!!!
Теперь работает все.

Спасибище Вам огромаднейшее!!! :Beer: :beer2:

ZVSRus 02-02-2023 14:30 3002274

Цитата:

Цитата DA-Bro
Если можно, окно об удалении настроек программы.

Какие действия будут происходить под кнопкой "Да" в информационном окне "Удалить настройки?"

PS: Вы делаете закосы под других репакеров, а они не будут возмущаться?.

DA-Bro 02-02-2023 16:20 3002283

ZVSRus, Здравствуйте! Да нет никаких закосов. Я смотрю функциональность, которая мне нужна. Тем более у каждого скрипт индивидуален. И в Вашем исполении он уже заметно отличается. Тем более я его ещё в процессе буду изменять под свои предпочтения.
Цитата:

Цитата ZVSRus
Какие действия будут происходить под кнопкой "Да" в информационном окне "Удалить настройки?" »

Будет удаляться ключ в реестре или папка с настройками в "Roaming", смотря по обстоятельствам.

Vanadiy777 02-02-2023 20:13 3002297

Цитата:

Цитата ZVSRus
Вы своим флудом всю тему засрали!. Многие тему по InnoSetup на данном форуме стали стороной обходить. »

ZVSRus, DA-Bro,
Получается, что это вы тему-то засрали, превратив ее в личный чат...
На протяжении шести страниц вы ведете какой-то междусобойчик,
кидаясь отдельными фразами и готовыми ехе, а в теме выхлопа - ноль, не смотря на многочисленные просьбы...
Остальным, видимо, в личке обмениваетесь...

Как-то не по пионерски получается... Вы не находите?

Поэтому многие и обходят эту тему стороной...

Цитата:

Цитата ZVSRus
но свои лайки крендель получил. »

ZVSRus, это, видимо, Вы на меня намёкиваете? :)
Так не могу я людям запретить ставить лайк под моим сообщением, если оно понравилось, даже если оно не несет смысловой нагрузки.
Это право каждого...


А "хотелки" у DA-Bro не закончатся, видимо, никогда... :lol:

Извините, коллеги, ничего личного...

DA-Bro 11-02-2023 03:06 3002880

Здравствуйте! Подскажите пожалуйста, как в этих двух строчках русские буквы правильно заменить на "CustomMessage":

Код:

Caption:= FmtMessage(ExpandConstant('Установка - {#AppName}'), [ExpandConstant('{#SetupSetting("AppName")}')]);
Caption:= FmtMessage(ExpandConstant('Программа установит {#AppName} в следующую папку.'), [ExpandConstant('{#SetupSetting("AppName")}')]);

Что-то вроде этого нужно:

CustomMessage('Установка')
CustomMessage('Программа установит')
CustomMessage('в следующую папку.')
CustomMessage('Программа установит {#AppName} в следующую папку.')

ZVSRus 11-02-2023 13:46 3002909

[CustomMessages]
RU.text1=Установка — %1
EN.text1=Setup — %1

RU.text2=Программа установит %1 в следующую папку.
EN.text2=The program will install %1 in the following folder.


Caption:= FmtMessage(ExpandConstant('{cm:text1}'), [ExpandConstant('{#SetupSetting("AppName")}')]);
Caption:= FmtMessage(ExpandConstant('{cm:text2}'), [ExpandConstant('{#SetupSetting("AppName")}')]);

Nicolayka 27-02-2023 22:06 3004266

Всем привет!
Читаю-читаю-читаю......никак не могу понять. Можно ли увеличить максимальный объём тома? Сейчас 2 Гб. Или может есть другая программа для создания Repack-ов игр, в которой нет ограничения на размер тома? Спасибо заранее за ответ!

TROY Diamond 29-03-2023 02:07 3006335

Здравствуйте!
Подскажите, пожалуйста, код как можно реализовать случайное копирование определенного файла, при каждом новом запуске инсталлятора, Условно говоря у меня есть файл 1.txt, таких файлов будет 10-20-30.
Можно ли сделать так, чтобы при каждом новом запуске-установке чтобы копировался один из этих файлов в папку установки, вне зависимости ни от чего. Просто новая установка - копирование нового файла. Или же запись в этот файл определенного значения из списка который я укажу.
Суть - нужно просто чтобы информация в файле при каждой новой установке менялась или случайно или, пускай даже подряд. Первая установка - первое значение (файл), вторая установка - второй файл (значение).
Это вообще реально сделать?
Никаких задач (компонентов) для выбора пользователю не нужно, а то так бы да, я бы мог предложить пользователю выбрать один их этих файлов. )) Нет, так не надо! Надо чтобы совершенно без участия пользователя, чтобы копировался один и тот же файл в папку установки, но с разным значением или один любой из 10-20-30 файлов, которые я положу отдельно, но имя у них при копировании в папку установки должно быть одно и тоже, т.е. у меня будет 1-2-3-4-5-6-7... txt, где-то лежать до компиляции, а в конечном итоге в папке назначения (установки) должен скопироваться любой из этих файлов, но получить название 1.txt
Помогите, пожалуйста! Желательно для Юникод версии Inno Setup!

El Sanchez 30-03-2023 09:34 3006378

Цитата:

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

Код:

[Files]
Source: "1.txt"; DestDir: {app}; Flags: ignoreversion; AfterInstall: WriteRandomFile

[Code]
procedure WriteRandomFile;
begin
  SaveStringToFile(ExpandConstant(CurrentFileName), GetMD5OfString(ExpandConstant('{tmp}')), False);
end;


Vladimir_02 30-07-2023 12:05 3013102

Может кому пригодится. Добавление своих строк в файл hosts и удаление их при деинсталляции

Код:

procedure AddLineToFile(FileName, Line: String);
var
  Lines: TStringList;
begin
  // Создаем объект TStringList для чтения файла в память
  Lines := TStringList.Create;
  try
    // Загружаем содержимое файла в TStringList
    Lines.LoadFromFile(FileName);

    // Проверяем, существует ли строка в файле
    if Lines.IndexOf(Line) = -1 then
    begin
      // Если строка не существует, добавляем ее в конец списка
      Lines.Add(Line);

      // Сохраняем изменения обратно в файл
      Lines.SaveToFile(FileName);
    end;
  finally
    // Освобождаем память, занятую объектом TStringList
    Lines.Free;
  end;
end;
         
procedure RemoveLineFromFile(FileName, Line: String);
var
  Lines: TStringList;
begin
  // Создаем объект TStringList для чтения файла в память
  Lines := TStringList.Create;
  try
    // Загружаем содержимое файла в TStringList
    Lines.LoadFromFile(FileName);

    // Ищем индекс строки, которую хотим удалить
    // Если строка найдена, удаляем ее из списка
    while Lines.IndexOf(Line) <> -1 do
      Lines.Delete(Lines.IndexOf(Line));

    // Сохраняем изменения обратно в файл
    Lines.SaveToFile(FileName);
  finally
    // Освобождаем память, занятую объектом TStringList
    Lines.Free;
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  HostsFilePath: String;
  LineToAdd1, LineToAdd2, LineToAdd3, LineToAdd4: String;
begin
  // Получаем путь к файлу hosts в системе
  HostsFilePath := ExpandConstant('{sys}\drivers\etc\hosts');
  // Строка, которую мы хотим добавить в файл hosts (для отключение рекламы)
  LineToAdd1 := '127.0.0.1 player.kmpmedia.net';
  LineToAdd2 := '127.0.0.1 log.kmplayer.com';
  LineToAdd3 := '127.0.0.1 cdn.kmplayer.com';
  LineToAdd4 := '127.0.0.1 cdn.pandora.tv';

  // Проверяем, что текущий шаг установки ssPostInstall
  // Это гарантирует, что файл hosts существует до того, как мы попытаемся его изменить
  if CurStep = ssPostInstall then
  begin
    // Проверяем существование файла
    if not FileExists(HostsFilePath) then
    begin
      // Файл не существует, создаем его
      //MsgBox('File not exists!', mbInformation, MB_OK);
      if SaveStringToFile(HostsFilePath, '', False) then
      begin
        // Файл создан успешно, добавляем строку (если такой строки еще нет)
      AddLineToFile(HostsFilePath, LineToAdd1);
      AddLineToFile(HostsFilePath, LineToAdd2);
      AddLineToFile(HostsFilePath, LineToAdd3);
      AddLineToFile(HostsFilePath, LineToAdd4);
      end;
    end
    else
    begin
      // Файл существует, добавляем строку (если такой строки еще нет)
    //MsgBox('File exists!', mbInformation, MB_OK);
    AddLineToFile(HostsFilePath, LineToAdd1);
    AddLineToFile(HostsFilePath, LineToAdd2);
    AddLineToFile(HostsFilePath, LineToAdd3);
    AddLineToFile(HostsFilePath, LineToAdd4);
    end;
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  HostsFilePath: String;
  LineToRemove1, LineToRemove2, LineToRemove3, LineToRemove4: String;
begin
  // Получаем путь к файлу hosts в системе
  HostsFilePath := ExpandConstant('{sys}\drivers\etc\hosts');

  // Строка, которую мы хотим удалить из файла hosts
  LineToRemove1 := '127.0.0.1 player.kmpmedia.net';
  LineToRemove2 := '127.0.0.1 log.kmplayer.com';
  LineToRemove3 := '127.0.0.1 cdn.kmplayer.com';
  LineToRemove4 := '127.0.0.1 cdn.pandora.tv';

  // Проверяем текущий шаг деинсталляции
  if CurUninstallStep = usPostUninstall then
  begin
      // Проверяем существование файла
    if not FileExists(HostsFilePath) then
    begin
      // Файл не существует, ничего не делаем
      //MsgBox('File not exists!', mbInformation, MB_OK);
    end
    else
    begin
    // Файл существует. Удаляем строку из файла hosts при деинсталляции
    RemoveLineFromFile(HostsFilePath, LineToRemove1);
    RemoveLineFromFile(HostsFilePath, LineToRemove2);
    RemoveLineFromFile(HostsFilePath, LineToRemove3);
    RemoveLineFromFile(HostsFilePath, LineToRemove4);
    end;
  end;
end;


mrAndy 26-08-2023 20:58 3014621

Вложений: 1
Подскажите, что нужно сделать, что бы после установки корректно отображалась иконка приложения в установке и удалении программ в Windows? Сейчас это выглядит вот так:

Vanadiy777 26-08-2023 22:01 3014627

mrAndy,
Можно так:
Код:

[Setup]
UninstallDisplayIcon={app}\MyProg.exe


PsuchO 22-09-2023 23:09 3016602

Господа. Спасайте .... вообще 0 во всём этом.
В общем, хочу написать функцию, которая проверяет версию dotNet SDK. Параметр Version находится в реестре по пути \HKEY_LOCAL_MACHINE\SOFTWARE\dotnet\Setup\InstalledVersions\x64\sharedhost
Всё, что удалось сделать, это проверить, что путь \HKEY_LOCAL_MACHINE\SOFTWARE\dotnet\Setup\InstalledVersions\x64\ существует, как таковой
[code]
Код:

function IsDotNetSDKInstalled: Boolean;
var
    dotNetVersion: string;
    reg_key: string; // Просматриваемый подраздел системного реестра
    reg_root: string;
begin
    reg_key := 'SOFTWARE\dotnet\Setup\InstalledVersions\x64\sharedhost';
    reg_root := 'HKEY_LOCAL_MACHINE';
   
  if RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\dotnet\Setup\InstalledVersions\x64\sharedhost') then
  begin
              ???????????????
  end;
end;

Молю, помогите вытащить значение из реестра

El Sanchez 25-09-2023 18:51 3016897

Цитата:

Цитата PsuchO
хочу написать функцию, которая проверяет версию dotNet SDK. »

PsuchO,
Код:

function IsDotNetSDKInstalled: Boolean;
var
  LSubKeyName: string;
begin
  LSubKeyName := 'SOFTWARE\dotnet\Setup\InstalledVersions\x64\sharedhost';
  Result := RegKeyExists(HKLM32, LSubKeyName) and
    RegValueExists(HKLM32, LSubKeyName, 'Version') and
    DirExists(ExpandConstant('{reg:HKLM32\' + LSubKeyName + ',Path|}'));
end;


EdMSL 14-10-2023 09:00 3018207

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

ZVSRus 27-10-2023 12:10 3019000

Цитата:

Цитата EdMSL
Хотелось бы выводить на последнем экране время, затраченное на установку.

Данный пример есть в справке. ( версия 6.1.2 )

ROMKA-1977 26-02-2024 19:17 3024677

Подскажите пож. возможно ли в секции [Tasks] добавить CheckBox для перехода по веб ссылке ?

ROMKA-1977 26-02-2024 19:55 3024679

Цитата:

Цитата ROMKA-1977
Подскажите пож. возможно ли в секции [Tasks] добавить CheckBox для перехода по веб ссылке ? »

Или через секцию [code] на страницу SelectTasksPage добавить CheckBox для перехода по веб ссылке

ZVSRus 29-02-2024 10:30 3024788

Цитата:

Цитата ROMKA-1977
возможно ли в секции [Tasks] добавить CheckBox для перехода по веб ссылке ?

Может так

Код:

[Setup]
  AppName=My Application
  AppVersion=1.5
  DefaultDirName={pf}\My Application
  OutputDir=.

[Tasks]
  Name: WebSite; Description: "Перейти на страницу Автора"; GroupDescription: "Другие задачи:"; Flags: unchecked

[Code  ]
procedure CurStepChanged(CurStep: TSetupStep);
var
 
r: integer;

begin
  if
CurStep = ssDone then if IsTaskSelected('WebSite') then
  begin
   
ShellExec('open', 'http://forum.oszone.net/post-3024679-1051.html', '','', SW_SHOW, ewNoWait, r);
  end;
end;


habib2302 29-02-2024 11:22 3024793

Цитата:

Цитата ZVSRus (Сообщение 3024788)
Может так

Код:

[Setup]
  AppName=My Application
  AppVersion=1.5
  DefaultDirName={pf}\My Application
  OutputDir=.

[Tasks]
  Name: WebSite; Description: "Перейти на страницу Автора"; GroupDescription: "Другие задачи:"; Flags: unchecked

[Code  ]
procedure CurStepChanged(CurStep: TSetupStep);
var
 
r: integer;

begin
  if
CurStep = ssDone then if IsTaskSelected('WebSite') then
  begin
   
ShellExec('open', 'http://forum.oszone.net/post-3024679-1051.html', '','', SW_SHOW, ewNoWait, r);
  end;
end;


А выполнить открытие сайта через секцию run нельзя?

ZVSRus 29-02-2024 13:17 3024796

Цитата:

Цитата habib2302
А выполнить открытие сайта через секцию run нельзя?

[Run]
Filename: http://forum.oszone.net/post-3024679-1051.html; Tasks: WebSite; Flags: shellexec;

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

NickKruto 28-04-2024 23:11 3026855

Здравствуйте. Подскажите как сделать bin файлы, но так чтобы в первом была запакована одна папка, а во втором другая. И в установщике, перед тем как выбрать директорию предлагалось, что именно распаковать.

ROMKA-1977 22-05-2024 15:26 3027499

Подскажите как изменить размеры формы выбора языка в стандартной версии Inno Setup (не расширенной) ? Или как создать кастомную форму выбора языка в стандартной версии Inno Setup ?

ZVSRus 23-05-2024 10:12 3027513

Цитата:

Цитата ROMKA-1977
Подскажите как изменить размеры формы выбора языка в стандартной версии Inno Setup (не расширенной)

Пример

Код:


[Setup]
  AppName=My Application
  AppVersion=1.5
  DefaultDirName={pf}\My Application
  OutputDir=.

[Languages]
  Name: "english"; MessagesFile: "compiler:Languages\English.isl"
  Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Code  ]
function InitializeLanguageDialog(): Boolean;                                                 
begin                                                                                           
  with
SelectLanguageForm do begin                                                             
   
ClientWidth  := ScaleX(297);                                                               
    ClientHeight := ScaleY(125);                                                               

    IconBitmapImage.SetBounds(ScaleX(8), ScaleY(8), ScaleX(32), ScaleY(32));
    SelectLabel.SetBounds(ScaleX(56), ScaleY(8), ScaleX(233), ScaleY(39));
    LangCombo.SetBounds(ScaleX(56), ScaleY(56), ScaleX(233), ScaleY(21));
    OKButton.SetBounds(ScaleX(133), ScaleY(93), ScaleX(75), ScaleY(23));
    CancelButton.SetBounds(ScaleX(214), ScaleY(93), ScaleX(75), ScaleY(23));
  end;                                                                                         
    Result := True;                                                                             
end;     



PS: Поторопился чуток, в стандартной версии ни в 6 ни в 5 данная функция не принимается (ошибка на SelectLanguageForm). Пардон!

El Sanchez 25-05-2024 12:23 3027563

Вложений: 1
Цитата:

Цитата ROMKA-1977
Подскажите как изменить размеры формы выбора языка в стандартной версии Inno Setup (не расширенной) ? Или как создать кастомную форму выбора языка в стандартной версии Inno Setup ? »

ROMKA-1977, в стандартной доступа к SelectLanguageForm нет, так что только кастом.

ROMKA-1977 02-06-2024 15:25 3027805

Вложений: 1
Цитата:

Цитата El Sanchez
в стандартной доступа к SelectLanguageForm нет, так что только кастом. »

El Sanchez,
Вот ещё один пример создания кастомной формы:
Файл 169886

ROMKA-1977 15-06-2024 15:56 3028203

Помогите пожалуйста, если возможно. Пример кода:
Скрытый текст

[Files]
Source: Program\*; DestDir: {app}; AfterInstall: BtnDisable(); Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons};

Name: DirectX; Description: Microsoft DirectX; GroupDescription: Дополнительное ПО; Flags: unchecked;
Name: vcredist2019_x86; Description: Microsoft Visual С++ 2015-2019 Redistributable; GroupDescription: Дополнительное ПО; Flags: unchecked;
Name: vcredist2019_x64; Description: Microsoft Visual С++ 2015-2019 Redistributable x64; GroupDescription: Дополнительное ПО; Flags: unchecked; Check: IsWin64;

[Run]
Filename: {src}\Redistributable\DirectX\DXSETUP.exe; Parameters: /silent; Tasks: DirectX; StatusMsg: DirectX;
Filename: {src}\Redistributable\MVC++2019\VC_redist.x86.exe; Tasks: vcredist2019_x86; Parameters: /q; StatusMsg: Microsoft Visual С++ 2015-2019 Redistributable;
Filename: {src}\Redistributable\MVC++2019\VC_redist.x64.exe; Tasks: vcredist2019_x64; Parameters: /q; StatusMsg: Microsoft Visual С++ 2015-2019 Redistributable x64;

[_code]
var
Button: TButton;

procedure InitializeWizard();
begin
Button:= TButton.Create(WizardForm);
Button.SetBounds(ScaleX(20), ScaleY(327),ScaleX(75), ScaleY(23));
Button.Caption:= 'XXX';
Button.Parent:= WizardForm;
end;

procedure BtnDisable();
begin
Button.Enabled := False;
end;

В данном примере созданная кастомная кнопка отключается на странице InstallingPage перед началом распаковки файлов. Необходимо её отключить после распаковки файлов но перед установкой дополнительного ПО как это происходи с кнопкой Отмена. Для ISDone у меня пример есть но он не подходит если упаковка средствами Inno Setup.

ZVSRus 10-07-2024 18:56 3028910

Вопрос к El Sanchez
В посте что выше вы реализовали доступ к SelectLanguageForm в стандартной версии Inno, так может у вас получится реализовать доступ к стандартному окну, что вызывается кнопкой Обзор на странице SelectDirPage, как я понимаю даже в расширенной версии к данному окну доступ закрыт. Интересует не кастомная форма, а хотелось бы знать как там правильно называется Edit и FolderTreeView. Очень нужно для реализации непосредственно на странице SelectDirPage.

Gobethron 10-07-2024 22:00 3028913

Добрый вечер.
Форум живой? Интересует какая-то активность по Inno Setup.

Есть много вопросов, по поисковику многое не нашёл...
Но для начала, проинформирую, что в 2к24 данная ссылка на сообщение уже не актуальна, потому что зеркала и прочее уже слишком сильно, к сожалению, устарело. Речь об: "Скрипты инсталляторов для игр - скрипты инсталляторов для игр, (ссылка на сообщение);"

Если вдруг у кого остались наработки, меня заинтересовал "Корона скин", тот, который первый. Если нету... то мне бы хоть что-нибудь посмотреть.

El Sanchez 11-07-2024 10:23 3028924

Цитата:

Цитата ZVSRus
как там правильно называется Edit и FolderTreeView »

Обычные классы TEdit и TFolderTreeView, дескрипторы окон получить можно.

Flix 11-07-2024 13:41 3028927

Цитата:

Цитата Gobethron
меня заинтересовал "Корона скин" »

Gobethron, "корону скин" можно найти здесь, а также все остальное.

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

P.S. Не сочтите за рекламу.

ZVSRus 11-07-2024 16:27 3028931

Цитата:

Цитата El Sanchez
Обычные классы TEdit и TFolderTreeView, дескрипторы окон получить можно

Спасибо что ответили. Что TEdit и TFolderTreeView Обычные классы, это понятно, но я спросил не об этом, а как внутреннее name. Например создаю кастомный эдит, я задаю ему имя XXXXXEdit := TNewEdit.Create(WizardForm);.
Открыв редактором ресурсов Setup.e32 на вкладке TSELECTFOLDERFORM видим object PathEdit: TEdit, подставляю данное имя PathEdit в строку получаю ошибку неизвестный идентификатор, сразу возникает вопрос, или доступа к данному окну нет, или неправильное имя, по этому и спросил как имена этих классов.
Но суть вопроса заключалось не в этом. Создал диалоговое окно непосредственно на SelectDirPage, все пути выставляются правильно, все работает, но есть одно НО, заходим через кнопку Обзор, все пути установки по умолчанию правильные и в Edit и в DirTreeView C:\Program Files (x86)\My Application, выбираем путь в корень диска C: жмем ОК, при повторном заходе также пути верны C:\My Application но почему то директория C:\Program Files (x86) не сворачивается как в кастомных формах, В чем причина не пойму, или сделано на самой странице или в чем то другом, вот и спросил об стандартном окне.

PS: В Оригинальном установщике R.G. Catalyst 2022-11-16 Ссылка также реализовано на странице SelectDirPage (на панелях) там установка в корень диска D:. меняешь путь в корень диска C:, пака на диске C: появляется но диск D: не сворачивается. Хотя это и не ошибка и не критично, но всё же хотелось отшлифовать до конца.

Скрипт скинул в личку.

Gobethron 11-07-2024 21:04 3028938

Цитата:

Цитата Flix
"корону скин" можно найти здесь, а также все остальное. »

Цитата:

Цитата Flix
Но сейчас лучше использовать новую, современную библиотеку - FMXInno. »

Cпасибо что ответили.
К сожалению, скачать эти вещи я не могу - мне пишет, что недостаточно прав. Возможно ли как-то обойти эту проблему?..
___
На самом деле, вопросов у меня очень много. Мы с командой доделываем масштабный проект, в определённых кругах. И как-то надоели классические скучные инсталляторы. Поэтому, взялись за поиски всяких фич.

Начать можно с текущей проблемы... замены курсора. Да, я прошерстил, наверное, весь форум. Видел несколько штук проектов, как это можно сделать. К сожалению, ни один не подошёл под мои "запросики".
Нужно чтобы кастомный (пользовательский) курсор менялся только в инсталляторе, ни на что больше не влияя. Причём, нужен именно .cur
На данный момент я достиг того, что смог прикрепить кастомный курсор, при наведении на кнопки "далее".
Также я смог реализовать кастомный курсор для "всего", то есть, работает и в инсталляторе, и вне его. А это неприемлемо.

Почему мне не один из вариантов не подошёл? Ну, во-первых, я нуб в программировании. Во-вторых, сложилось впечатление, что в моём новом inno setup 6.0 не хватает каких-то функций. Пошёл искать "улучшенную версию Inno ISCmplr Setup 5.4.1 build 110214", но тоже, либо не могу скачать, либо на форумах не осталось следов.
Каждый раз когда какой-то из старых кодов беру, то какая-то "мелочь" мешает. Компилятор выдаёт ошибку, не видит идентификаторов и т.д. (а переписал/украл я код достаточно хорошо))))

Чтобы не быть голословным, скину код и проблемные строки. Наиболее "перспективным" (вроде как) считаю первый код:
Код:

#define A = (Defined UNICODE) ? "W" : "A"

[Setup]
AppName = My Program
AppVersion = 1.5
DefaultDirName = {pf}\My Program
DefaultGroupName = My Program

[Files]
Source: "Mycursor.cur"; Flags: dontcopy;

[Code ]
function LoadCursorFromFile(FileName: String): Cardinal; external 'LoadCursorFromFile{#A}@user32 stdcall';
function DeleteObject(p1: Longword): BOOL; external 'DeleteObject@gdi32.dll stdcall';

const
  MyCursor = 101;
  RT_RCDATA = 10;

var
  ResStream: TResourceStream;
  hcur: Cardinal;

procedure InitializeWizard();
begin
  ResStream := TResourceStream.Create(HInstance, '_IS_MYCURSOR', RT_RCDATA);
  ResStream.SaveToFile(ExpandConstant('{tmp}\Mycursor.cur'));
  hcur := LoadCursorFromFile(ExpandConstant('{tmp}\Mycursor.cur'));
  Screen.Cursors[MyCursor] := hcur; // в других версиях эта строка является проблемной//

  WizardForm.BackButton.Cursor := MyCursor;
  WizardForm.DirBrowseButton.Cursor := MyCursor;
  WizardForm.GroupBrowseButton.Cursor := MyCursor;
  WizardForm.NextButton.Cursor := MyCursor;
  WizardForm.CancelButton.Cursor := MyCursor;
end;

procedure DeinitializeSetup();
begin
  DeleteObject(hcur);
end;

Проблемные строки выделил жирным шрифтом.

Код:

#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
SolidCompression=yes
Compression=lzma/ultra
OutputDir=Output

[Files]
Source: cursor.ani; Flags: dontcopy

[code ]
function LoadCursorFromFile(FileName: String): Cardinal; external 'LoadCursorFromFile{#A}@user32 stdcall';
function DeleteObject(p1: Longword): BOOL; external 'DeleteObject@gdi32.dll stdcall';

const
MyCursor = 101;

var
hcur: Cardinal;

function InitializeSetup:boolean;
begin
if not FileExists(ExpandConstant('{tmp}\cursor.ani')) then ExtractTemporaryFile('cursor.ani');
Result := True;
end;

procedure InitializeWizard();
begin
with WizardForm do begin
Cursor := MyCursor;
end;
hcur := LoadCursorFromFile(ExpandConstant('{tmp}\cursor.ani'));
Screen.Cursors[MyCursor] := hcur;
end;

procedure DeinitializeSetup();
begin
DeleteObject(hcur);
end;

Проблемные строки выделил жирным шрифтом.

И вот ещё:
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
RawDataResource=MyCursor:cursor.ani

[code ]
function LoadCursorFromFile(FileName: String): Cardinal;
external 'LoadCursorFromFileA@user32 stdcall';

const
MyCursor = 101;
RT_RCDATA = 10;

var
hcur: Cardinal;
ResStream: TResourceStream;

procedure InitializeWizard;
begin
with WizardForm do begin
ClientWidth:=ScaleX(650);
ClientHeight:=ScaleY(400);
Position:=poScreenCenter;
OuterNotebook.Hide;
InnerNotebook.Hide;
Bevel.Hide;
Cursor := MyCursor;
end;

ResStream := TResourceStream.Create(HInstance, '_IS_MYCURSOR', RT_RCDATA);
try
ResStream.SaveToFile(ExpandConstant('{tmp}\cursor.ani'));
hcur := LoadCursorFromFile(ExpandConstant('{tmp}\cursor.ani'));
Screen.Cursors[MyCursor] := hcur;
finally
ResStream.Free;
end;

with WizardForm.NextButton do
begin
SetBounds(ScaleX(400), ScaleY(300), ScaleX(81), ScaleY(30));
Cursor := MyCursor;
end;

with WizardForm.BackButton do
begin
SetBounds(ScaleX(300), ScaleY(300), ScaleX(81), ScaleY(30));
Cursor := MyCursor;
end;

with WizardForm.CancelButton do
begin
SetBounds(ScaleX(530), ScaleY(300), ScaleX(81), ScaleY(30));
Cursor := MyCursor;
end;
end;

procedure DeinitializeSetup();
begin
DeleteObject(hcur);
end;

Проблемные строки выделил жирным шрифтом.

Тут у меня есть и .cur и .ani , на самом деле, не сильно важно (предпочтительнее .cur).
________________
В общем, господа-товарищи, если есть современное решение проблемы (потому что я читал ответы аж с 2009 по 2015 гг), то будем с командой очень вам благодарны.

Flix 11-07-2024 23:26 3028944

Цитата:

Цитата Gobethron
если есть современное решение проблемы »

Gobethron, современное решение проблемы уже озвучено - библиотека FMXInno (автор BLACKFIRE69, источник).
Она полностью адаптирована под современные системы и современный Inno Setup. Активно развивается и поддерживается.

Озвученные вами проблемы в сценариях (RawDataResource, TResourceStream, Screen.Cursors) касаются только китайской неофициальной Inno Setup v5.5, развитие которой прекратилось в 2012 году. Никакими другими версиями Inno Setup прямо из "коробки" эти фишки не поддерживаются. Сейчас вам нужен курсор, потом что-то другое, потом третье. А все вместе это потянет за собой множество сторонних библиотек (botva, isdone и т.д. и т.п.), которые уже давно не развиваются. Добавьте к этому проблемы совместимости с современными операционными системами. Разбираться и помогать вам с устаревшими и потерявшими свою актуальность библиотеками и решениями уже вряд ли кто-то будет, разве что вы сделаете это самостоятельно. Но самое грустное в этой истории будет то, что вы потеряете время и ваш проект не будет нормально работать в разрешении 2K/4K на современных системах.

Лучше уделите свое время на изучение всех особенностей одной единственной библиотека FMXInno. Поверьте, она с лихвой позволит реализовать любые ваши фантазии и фишки. Библиотека поставляется с множеством примеров различных аспектов оформления программ установок. Также на форуме представлены готовые решения под конкретные игры. Библиотека очень сложная и многосторонняя, поэтому просто не будет. Но если у вас команда, то справитесь.

P.S. На krinkels, чтобы что-то скачать, изучите правила, они не сложные. На fileforums есть возможность скачивания после регистрации.

El Sanchez 13-07-2024 18:56 3028970

Вложений: 1
Цитата:

Цитата ZVSRus
при повторном заходе также пути верны C:\My Application но почему то директория C:\Program Files (x86) не сворачивается как в кастомных формах »

ZVSRus, даже со стилем TVS_SINGLEEXPAND автосворачиваются только соседи, всё остальное — нестандарт, поэтому ручками.

OldGamer 18-07-2024 04:01 3029076

Здравствуйте уважаемые форумчане!

Есть стандартное окно с выбором языков установки.
При нажатии на Отмена или крестик выбивает ошибку:
"Runtime Error (at 105:118)
Could not call proc".
Не критично, но напрягает. Кто-нибудь с таким сталкивался? И как это исправить?



Скрипт

[Setup]
SourceDir=.
OutputDir=Setup
AppName=Spyro the Dragon
AppVersion=2.0
AppPublisher=EmuGames
AppCopyright=by Ma2012ks ©
AppPublisherURL=www.emugames.do.am
AppSupportURL=www.emugames.do.am
AppUpdatesURL=www.emugames.do.am
DefaultDirName={pf}\Insomniac Games\Spyro the Dragon™
DefaultGroupName=Insomniac Games\Spyro the Dragon™
AllowNoIcons=yes
InfoBeforeFile=C:\Users\Maks\Desktop\InstalledImages\System requirements.txt
InfoAfterFile=C:\Users\Maks\Desktop\InstalledImages\Thank you for the installation of the game.txt
OutputBaseFilename=setup
WizardImageFile=C:\Users\Maks\Desktop\InstalledImages\LeftImage.bmp
WizardSmallImageFile=C:\Users\Maks\Desktop\InstalledImages\Icon-Up.bmp
SetupIconFile=C:\Users\Maks\Desktop\InstalledImages\Icon.ico
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=none
DiskSpanning=yes
DiskSliceSize=2100000000
SlicesPerDisk=1
RestartIfNeededByRun=no
PrivilegesRequired=none
ShowUndisplayableLanguages=yes

[Languages]
Name: english; MessagesFile: compiler:Languages\English.isl
Name: french; MessagesFile: compiler:Languages\French.isl
Name: german; MessagesFile: compiler:Languages\German.isl
Name: spanish; MessagesFile: compiler:Languages\Spanish.isl
Name: italian; MessagesFile: compiler:Languages\Italian.isl
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Messages]

SelectLanguageTitle=Spyro the Dragon
SelectLanguageLabel=Please select installation language. Âûáåðèòå ÿçûê óñòàíîâêè.

[LangOptions]
english.LanguageName=English
french.LanguageName=French
german.LanguageName=German
spanish.LanguageName=Spanish
italian.LanguageName=Italian
russian.LanguageName=Russian

[Types]
Name: full; Description: Ïîëíàÿ óñòàíîâêà
Name: custom; Description: Âûáîðî÷íàÿ óñòàíîâêà; Flags: iscustom

[Tasks]
Name: desktopicon; Description: Ñîçäàòü ÿðëûê íà ðàáî÷åì ñòîëå; GroupDescription: ßðëûêè:
Name: pin; Description: Çàêðåïèòü ÿðëûê íà ïàíåëè çàäà÷; GroupDescription: ßðëûêè:; Flags: unchecked

Name: DirectX; Description: Îáíîâèòü DirectX; GroupDescription: Äîïîëíèòåëüíîå ÏÎ:; Flags: checkablealone
Name: Redist; Description: Óñòàíîâèòü Visual C++ 2010; GroupDescription: Äîïîëíèòåëüíîå ÏÎ:; Flags: checkablealone

[Files]
Source: ISSkin.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: steam.cjstyles; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\0.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\1.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\2.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\3.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\4.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\5.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\6.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\7.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\8.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\9.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\10.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\Miniature.gif; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: isgsg.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: bass.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: innocallback.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\Music-1.mp3; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Maks\Desktop\InstalledImages\Music-2.mp3; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

Source: D:\Max\NightLection Team\CurrentProject\Spyro-1\Pakovano\ENG\*; DestDir: {app}; Check: PortableCheck; AfterInstall: ExtLog(); Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
Source: D:\Max\NightLection Team\CurrentProject\Spyro-1\Pakovano\Vector\NEW\*; DestDir: {app}; Check: InstallerCheck; AfterInstall: ExtLog(); Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension

[Icons]
Name: "{group}\Spyro the Dragon"; Filename: "{app}\Spyro the Dragon.exe"; WorkingDir: "{app}";
Name: "{userdesktop}\Spyro the Dragon"; Filename: "{app}\Spyro the Dragon.exe"; WorkingDir: "{app}"; Tasks: desktopicon;
Name: "{group}\Spyro the Dragon (Vector)"; Filename: "{app}\Spyro the Dragon (Vector).exe"; WorkingDir: "{app}";
Name: "{userdesktop}\Spyro the Dragon (Vector)"; Filename: "{app}\Spyro the Dragon (Vector).exe"; WorkingDir: "{app}"; Tasks: desktopicon;
Name: "{group}\Spyro the Dragon-Options"; Filename: "{app}\Spyro the Dragon-Options.exe"; WorkingDir: "{app}";
Name: "{userdesktop}\Spyro the Dragon-Options"; Filename: "{app}\Spyro the Dragon-Options.exe"; WorkingDir: "{app}"; Tasks: desktopicon;
Name: "{group}\{cm:UninstallProgram,Spyro the Dragon}"; Filename: "{uninstallexe}"

[Run]
Description: "{cm:LaunchProgram, Spyro the Dragon}"; Filename: "{app}\Spyro the Dragon.exe"; WorkingDir: "{app}"; Flags: nowait postinstall skipifsilent unchecked
Description: "{cm:LaunchProgram, Spyro the Dragon-Options}"; Filename: "{app}\Spyro the Dragon-Options.exe"; WorkingDir: "{app}"; Flags: nowait postinstall skipifsilent unchecked

[UninstallDelete]
Type: filesandordirs; Name: {app}
Type: filesandordirs; Name: "{localappdata}\Thinstall\Spyro™ the Dragon;"

[code]
var
ComponentPage : TWizardPage;
InstallGroupBox : TNewGroupBox;
Installer : TNewRadioButton;
Portable : TNewRadioButton;

function InstallerCheck: Boolean;
begin
Result := Installer.Checked;
end;

function PortableCheck: Boolean;
begin
Result := Portable.Checked;
end;

var
ProgressLabel: TLabel;

procedure ExtLog();
begin
SaveStringToFile(ExpandConstant('{tmp}\setup.log'), #13#10 + GetDateTimeString('dd/mm/yyyy hh:nn:ss', '-', ':') +
' - ' + ExpandConstant(CurrentFileName), True);
with WizardForm.ProgressGauge do
ProgressLabel.Caption:= IntToStr((Position-Min)/((Max - Min)/100)) + '%';
end;

const
AW_BLEND = $00080000;
AW_HIDE = $00010000;

function AnimateWindow(hWnd: HWND; dwTime: DWORD; dwFlags: DWORD): Boolean;
external 'AnimateWindow@user32 stdcall';

function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
if CurPageID=wpFinished then
begin
if WizardForm.RunList.Checked[0] then
Result := True;
end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_OKCANCEL) = IDOK then
begin
Confirm := False;
AnimateWindow(WizardForm.Handle, 2500, AW_BLEND or AW_HIDE);
Cancel := True;
end else
Cancel := False;
end;

const
LOAD_LIBRARY_AS_DATAFILE = $2;

#define A = (Defined UNICODE) ? "W" : "A"

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';
function SHGetNewLinkInfo(pszLinkTo, pszDir: String; var pszName: Char; var pfMustCopy: Longint; uFlags: UINT): BOOL; external 'SHGetNewLinkInfo{#A}@shell32.dll stdcall';
function PinToTaskbar(const szFilename: String; IsPin: Boolean): Boolean;

var
hInst: THandle;
buf: array [0..255] of Char;
i, res: Integer;
strLnk, strVerb: String;
objShell, colVerbs: Variant;
begin
Result := False;
if (GetWindowsVersion < $06010000) or not FileExists(szFilename) then Exit; { below Windows 7 }

{ String resources }
if IsPin then
begin
if SHGetNewLinkInfo(szFilename, ExpandConstant('{tmp}'), buf[0], res, 0) then
begin
while buf[Length(strLnk)] <> #0 do Insert(buf[Length(strLnk)], strLnk, Length(strLnk)+1);
if FileExists(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName(strLnk)) then Exit;
end;
res := 5386; { Pin to Tas&kbar }
end else res := 5387; { Unpin from Tas&kbar }

{ Load string resource }
hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
if hInst <> 0 then
try
for i := 0 to LoadString(hInst, res, buf[0], 255)-1 do Insert(buf[i], strVerb, i+1);
try
objShell := CreateOleObject('Shell.Application');
colVerbs := objShell.Namespace(ExtractFileDir(szFilename)).ParseName(ExtractFileName(szFilename)).Verbs;
for i := 1 to colVerbs.Count do if CompareText(colVerbs.Item[i].Name, strVerb) = 0 then
begin
colVerbs.Item[i].DoIt;
Result := True;
Break;
end;
except
Exit;
end;
finally
FreeDLL(hInst);
end;
end;

type
HSTREAM=DWORD;
TTimerProc=procedure(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
const
Indent=25;

var
MP3List:TStringList;
CurrentMP3:integer;
hMP3:HWND;
TimerID:LongWord;

function AppendMenu(hMenu: HMENU; uFlags, uIDNewItem: UINT; lpNewItem: PChar): BOOL; external 'AppendMenuA@user32.dll stdcall';
function GetSystemMenu(hWnd: HWND; bRevert: BOOL): HMENU; external 'GetSystemMenu@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall delayload';
function ssInitialize(hParent:HWND;ssTimeShow:integer;FadeOut:boolean;StretchMode:integer;BkgColor:DWORD):boo lean; external 'ssInitialize@files:isgsg.dll stdcall delayload';
procedure ShowMP3Panel(hMainFrm:HWND;StartVolume:integer;DefMP3Dir,BASSDir,MLabel:PChar;IsShowMP3Info,IsBkgFrm Visible:boolean;ShowTimeMP3Info:integer;dBottom:integer);external 'ShowMP3Panel@files:isgsg.dll stdcall';
procedure KillMP3Panel;external 'KillMP3Panel@files:isgsg.dll stdcall';
procedure ssDeInitialize; external 'ssDeInitialize@files:isgsg.dll stdcall delayload';
procedure ssSetBkgImage(FileName:PChar); external 'ssSetBkgImage@files:isgsg.dll stdcall delayload';
procedure ssAddImage(FileName:PChar); external 'ssAddImage@files:isgsg.dll stdcall delayload';
procedure ssStartShow; external 'ssStartShow@files:isgsg.dll stdcall delayload';
procedure ssStopShow; external 'ssStopShow@files:isgsg.dll stdcall delayload';
procedure ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
function GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';
function SetTimer(hWnd:HWND;nIDEvent,uElapse:UINT;lpTimerFunc:LongWord{TFNTimerProc}):UINT; external 'SetTimer@user32.dll stdcall delayload';
function KillTimer(hWnd:HWND;uIDEvent:UINT):BOOL; external 'KillTimer@user32.dll stdcall delayload';
function BASS_ChannelIsActive(Handle:HWND):DWORD; external 'BASS_ChannelIsActive@files:bass.dll stdcall';
function BASS_SetConfig(Option,Value:DWORD):DWORD; external 'BASS_SetConfig@files:bass.dll stdcall';
function BASS_Init(Device:integer;Freq,Flags:DWORD;Win:HWND;CLSID:integer):boolean; external 'BASS_Init@files:bass.dll stdcall delayload';
function BASS_StreamCreateFile(Mem:BOOL;f:PChar;Offset:DWORD;Length:DWORD;Flags:DWORD):HSTREAM; external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_StreamFree(Handle:HWND):boolean; external 'BASS_StreamFree@files:bass.dll stdcall';
function BASS_ChannelPlay(Handle:HWND;Restart:boolean):boolean; external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_Start: Boolean; external 'BASS_Start@files:bass.dll stdcall';
function BASS_Stop: Boolean; external 'BASS_Stop@files:bass.dll stdcall';
function BASS_Free: Boolean; external 'BASS_Free@files:bass.dll stdcall delayload';
function WrapTimerProc(CallBack:TTimerProc;ParamCount:integer):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall';
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';

procedure TimerTick(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
begin
if BASS_ChannelIsActive(hMP3)=0 then begin
BASS_Stop;
BASS_StreamFree(hMP3);
hMP3:=BASS_StreamCreateFile(False,PChar(MP3List.Strings[CurrentMP3]),0,0,0);
BASS_Start;
if hMP3<>0 then
if BASS_ChannelPlay(hMP3,True) then begin
CurrentMP3:=CurrentMP3+1;
if CurrentMP3>MP3List.Count-1 then CurrentMP3:=0;
end;
end;
end;

procedure RunListClickCheck(Sender: TObject);
var
i:integer;
begin
if WizardForm.RunList.Checked[WizardForm.RunList.ItemIndex] then begin
for i:=0 to WizardForm.RunList.Items.Count-1 do
WizardForm.RunList.Checked[i]:=False;
WizardForm.RunList.Checked[WizardForm.RunList.ItemIndex]:=True;
end;
end;

function InitializeSetup:boolean;
begin
ExtractTemporaryFile('Music-1.mp3');
ExtractTemporaryFile('Music-2.mp3');
MP3List:=TStringList.Create;
CurrentMP3:=0;
ExtractTemporaryFile('steam.cjstyles');
LoadSkin(ExpandConstant('{tmp}')+'\steam.cjstyles', '');
Result:=True;
end;

procedure InitializeWizard;
begin
if not AppendMenu(GetSystemMenu(Wizardform.Handle, True), 200, 0, SetupMessage(msgAboutSetupMenuItem)) then
WizardForm.Position:= poScreenCenter;
begin
ComponentPage := CreateCustomPage(wpInfoBefore, 'Please select game language (Rus/Multi)', 'Âûáåðèòå ÿçûê èãðû...');

{ InstallGroupBox }
InstallGroupBox := TNewGroupBox.Create(WizardForm);
with InstallGroupBox do
begin
Parent := ComponentPage.Surface;
SetBounds(ScaleX(0),ScaleY(0),ScaleX(240),ScaleY(70));
Caption := 'Ëîêàëèçàöèÿ / Game language:';
end;

{ Installer }
Installer := TNewRadioButton.Create(WizardForm);
with Installer do
begin
Parent := ComponentPage.Surface;
SetBounds(ScaleX(9),ScaleY(43),ScaleX(145),ScaleY(17));
Caption := 'Ðóññêàÿ âåðñèÿ / Russian';
Checked := True;
end;

{ Portable }
Portable := TNewRadioButton.Create(WizardForm);
with Portable do
begin
Parent := ComponentPage.Surface;
SetBounds(ScaleX(9),ScaleY(19),ScaleX(230),ScaleY(17));
Caption := 'English / French / German / Spanish / Italian';
end;

begin
ProgressLabel := TLabel.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressLabel.Top := Top + Height + ScaleY(8);
ProgressLabel.Left:= Left + Width/2 - ScaleX(8);
ProgressLabel.Caption := '0%';
ProgressLabel.AutoSize := True;
ProgressLabel.Parent := WizardForm.InstallingPage;
end;
WizardForm.RunList.OnClickCheck:=@RunListClickCheck;
ExtractTemporaryFile('Miniature.gif');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Miniature.gif',7000,5000,4000,0,255,Fal se,$FFFFFF,10);
ShowMP3Panel(WizardForm.Handle,80,ExpandConstant('{tmp}'),ExpandConstant('{tmp}'),'- Volume +',False,True,0,Indent);
TimerID:=SetTimer(0,0,500,WrapTimerProc(@TimerTick,5));
BASS_Init(-1,44100,0,0,0);
BASS_SetConfig(5,100);
BASS_SetConfig(6,100);
ssInitialize(GetWindowLong(MainForm.Handle,-8),18,True,1,$FF000000);
ExtractTemporaryFile('0.bmp');
ssSetBkgImage(ExpandConstant('{tmp}')+'\0.bmp');
WizardForm.TypesCombo.ItemIndex:=0;
WizardForm.BeveledLabel.Enabled:=True;
end;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then begin
ExtractTemporaryFile('1.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\1.bmp');
ExtractTemporaryFile('2.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\2.bmp');
ExtractTemporaryFile('3.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\3.bmp');
ExtractTemporaryFile('4.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\4.bmp');
ExtractTemporaryFile('5.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\5.bmp');
ExtractTemporaryFile('6.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\6.bmp');
ExtractTemporaryFile('7.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\7.bmp');
ExtractTemporaryFile('8.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\8.bmp');
ExtractTemporaryFile('9.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\9.bmp');
ExtractTemporaryFile('10.bmp');
ssAddImage(ExpandConstant('{tmp}')+'\10.bmp');
ssStartShow;
end;
if CurStep=ssPostInstall then ssStopShow;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
WizardForm.TypesCombo.Hide;
begin
case CurPageID of
wpFinished: end
if IsTaskSelected('Pin') then
PinToTaskbar(ExpandConstant('{app}\Spyro the Dragon-Options.exe'), True);
if CurPageID=wpInstalling then begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(395);
WizardForm.Height:=ScaleY(142);
WizardForm.Left:=ScaleX(GetSystemMetrics(0)-WizardForm.Width-Indent);
WizardForm.Top:=ScaleY(GetSystemMetrics(1)-WizardForm.Height-Indent);
WizardForm.InnerNotebook.Left:=ScaleX(10);
WizardForm.InnerNotebook.Top:=ScaleY(10);
WizardForm.InnerNotebook.Width:=ScaleX(370);
WizardForm.StatusLabel.Left:=ScaleX(0);
WizardForm.StatusLabel.Top:=ScaleY(0);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(154);
WizardForm.CancelButton.Top:=ScaleY(80);
end;
if (CurPageID=wpFinished) or (CurPageID=wpInfoAfter) then begin
WizardForm.RunList.Checked[0]:=True;
if WizardForm.Width<>502 then begin
WizardForm.Visible:=False;
WizardForm.Width:=ScaleX(502);
WizardForm.Height:=ScaleY(392);
WizardForm.Left:=(GetSystemMetrics(0)-WizardForm.Width) div 2;
WizardForm.Top:=(GetSystemMetrics(1)-WizardForm.Height) div 2;
WizardForm.MainPanel.Visible:=True;
WizardForm.Bevel1.Visible:=True;
WizardForm.InnerNotebook.Left:=ScaleX(40);
WizardForm.InnerNotebook.Top:=ScaleY(72);
WizardForm.InnerNotebook.Width:=ScaleX(417);
WizardForm.Visible:=True;
end;
end;
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
case CurUninstallStep of
usUninstall: begin
PinToTaskbar(ExpandConstant('{app}\Spyro the Dragon-Options.exe'), False);
end;
end;
end;

procedure DeinitializeSetup;
begin
KillMP3Panel;
KillTimer(0,TimerID);
BASS_Stop;
BASS_Free;
MP3List.Free;
ShowWindow(WizardForm.Handle,0);
UnloadSkin();
ssDeInitialize;
end;

function IsRegularUser(): Boolean;
begin
Result := not (IsAdminLoggedOn or IsPowerUserLoggedOn)
end;

function GetDefRoot(Param: String): String;
begin
if IsRegularUser then
Result := ExpandConstant('{localappdata}')
else
Result := ExpandConstant('{pf}')
end;


Flix 22-07-2024 10:39 3029178

Цитата:

Цитата OldGamer
При нажатии на Отмена или крестик выбивает ошибку: »

Ошибка в процедуре CancelButtonClick.
В функции AnimateWindow передается хендл окна мастера установки (WizardForm.Handle), которое ещё не создано.

Не используйте процедуру CancelButtonClick или упростите её до вида:

Код:

{ Процедура обработки нажатия кнопки "Отмена" }
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  // Отключаем подтверждение о закрытии программы установки
  Confirm := False;
end;


OldGamer 22-07-2024 12:19 3029183

Flix, спасибо но ошибка все равно вылазит... это не работает. :(
И до момента написания функции AnimateWindow эта ошибка уже была.

ZVSRus 23-07-2024 20:41 3029218

Цитата:

Цитата OldGame
Спасибо но ошибка все равно вылазит... это не работает.

Ошибка вылезает по той причине, что (обратите внимание сколько у вас прикручено картинок, DLL, скинов) при запуске установщика, все это грузится в память, вы нажимаете на кнопку Отмена или крестик, но при этом все эти картинки и все остальное остается висеть в памяти.
Вставь в скрипте это:

function InitializeLanguageDialog(): Boolean;
begin
// if not
FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
with SelectLanguageForm do begin
end
;
Result := True;
end;

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

OldGamer 24-07-2024 02:19 3029232

ZVSRus, спасибо - буду пытаться... хотя готов уже забить на это.
Сейчас при компиляции ошибка: Unknown identifier SelectLanguageForm ...

ZVSRus 24-07-2024 06:28 3029235

function InitializeLanguageDialog(): Boolean;
begin
// if not
FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
// with SelectLanguageForm do begin
// end;
Result := True;
end;

OldGamer 24-07-2024 07:42 3029237

Цитата:

Цитата ZVSRus
function InitializeLanguageDialog(): Boolean;
begin
// if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
// with SelectLanguageForm do begin
// end;
Result := True;
end; »

Сейчас вот ЭТО:

ZVSRus 24-07-2024 08:01 3029238

OldGamer,
Это означает что вы работаете на стандартной (не расширенной версии InniSetup). В стандартной версии в 5 или 6 доступа к SelectLanguageForm нет. Вернитесь на страницу 106 данного форума, увидите код от El Sanchez что он написал для РОМКИ-1977, и получите доступ к кастомной форме выбора языка. Пропишете у себя в скрипте (лучше конечно прицепить модулем т.к. у вас скрипт большой и там тоже не маленький), и уже в нем прописываете то, из за чего выбивает ошибка.

PS: На какой версии InnoSetup вы работаете?. Ранее ваш скрипт особо не разглядывал по той причине, что у вас много чего прикручено (картинки dll, скины) где их брать знаете только вы. Такие скрипты обычно выкладывают архивом. У вас сейчас разглядел в скрипте
InstallGroupBox := TNewGroupBox.Create(WizardForm);. Этот компонент принимается только в расширенной версии 5.5.1.
В других версиях на на этом компоненте будут ошибки (Неизвестный тип). Так что с этим скриптом на вашей версии InnoSetup печалька.

El Sanchez 26-07-2024 16:54 3029322

Цитата:

Цитата Flix
Ошибка в процедуре CancelButtonClick.
В функции AnimateWindow передается хендл окна мастера установки (WizardForm.Handle), которое ещё не создано. »

Нет. Речь шла про окно выбора языка, WizardForm ещё нет и CancelButtonClick некому вызывать, так что мимо.
Цитата:

Цитата ZVSRus
Ошибка вылезает по той причине, что (обратите внимание сколько у вас прикручено картинок, DLL, скинов) при запуске установщика, все это грузится в память, вы нажимаете на кнопку Отмена или крестик, но при этом все эти картинки и все остальное остается висеть в памяти. »

Нет. Окно выбора языка выполняется до InitializeSetup, так что ещё мимее.
Цитата:

Цитата OldGamer
Есть стандартное окно с выбором языков установки.
При нажатии на Отмена или крестик выбивает ошибку:
"Runtime Error (at 105:118)
Could not call proc". »

OldGamer, ошибка в DeinitializeSetup на вызове MP3List.Free, объект MP3List будет создан позднее в InitializeSetup, вы пытаетесь освободить несуществующий объект. Даже если закомменировать эту строку, то следующая же ShowWindow(WizardForm.Handle,0) тоже грохнет установщик, WizardForm ещё нет. Поэтому всегда в DeinitializeSetup пишите первой строкой if ExpandConstant('{wizardhwnd}') = '0' then Exit;

OldGamer 26-07-2024 22:37 3029329

El Sanchez , спасибо Большое! Это... РАБОТАЕТ! +1000 :good:

T1cOoN 28-07-2024 00:05 3029361

Добрый день. Прошу помощи. Имеется кастомная страница, которая создается через
Код:

Procedure InitializeWizard();
Begin
CreateCustomPlayerNamePage;
end;

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

UPD: решил вот так
Код:

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if IsComponentSelected('Crack\One') then // проверяем выбран ли компонента Crack/One
if (PageID = PlayerNamePage.ID) then // если он выбран то страница с именем PlayerNamePage будет пропускаться
Result := True
else
Result := False; // а если нет, то показываем как обычно
end;


proffbik 01-08-2024 14:02 3029526

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

При создании скрипта через wizard, отмечаю "Разрешить пользователю отключить создание папки в меню пуск". В итоге этот выбор не предоставляется пользователю при установке. Помогите люди добрые)

Dodakaedr 01-08-2024 21:05 3029532

proffbik, Для этого нужно задействовать секцию [Icons].

proffbik 01-08-2024 23:01 3029536

Цитата:

Цитата Dodakaedr
proffbik, Для этого нужно задействовать секцию [Icons]. »

Благодарю. Могу ли услышать подробнее для более четкого понимания? Если есть пример кода, то был бы очень признателен

Код:

[Icons]
Name: "{group}\{#MyAppNameIcon}"; Filename: "{app}\{#MyAppExeName}"; WorkingDir: "{app}"; IconFilename: "{app}\game.ico"
Name: "{commondesktop}\{#MyAppNameIcon}"; Filename: "{app}\{#MyAppExeName}"; WorkingDir: "{app}"; IconFilename: "{app}\game.ico"; Tasks: desktopicon
Name: "{commonappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon


Flix 02-08-2024 10:15 3029546

Цитата:

Цитата proffbik
При создании скрипта через wizard, отмечаю "Разрешить пользователю отключить создание папки в меню пуск". В итоге этот выбор не предоставляется пользователю при установке. Помогите люди добрые) »

Проверь наличие и значение в сценарии директивы AllowNoIcons.
Должно быть AllowNoIcons=yes

proffbik 02-08-2024 23:44 3029558

Цитата:

Цитата Flix
Проверь наличие и значение в сценарии директивы AllowNoIcons.
Должно быть AllowNoIcons=yes »

Благодарю. Решил проблему тем, что скачал версию 5.5.9 unicode и в ней как раз таки высветилась эта строчка AllowNoIcons=yes. А в более новых версиях она почему то не прикрепляется визардом)

proffbik 06-08-2024 13:04 3029658

Приветствую, друзья!

Хочу сделать закрепление иконки на панели задач, испробовал все скрипты выложенные в интернете (От Эль Санчеза и т.п.). Ничего из этого не работает. Есть варианты сделать это?

ZVSRus 11-08-2024 13:34 3029792

Вложений: 1
Цитата:

Цитата proffbik
Ничего из этого не работает. Есть варианты сделать это?

Примеры от El Sanchez все рабочие. Фуфло никто выкладывать не будет!.

lmiol 12-08-2024 10:10 3029810

Ребята, всем привет. Такая проблема

создал батник, который запускаю вручную -- реестр успешно считывается
если запускаю этот же батник через [run] секцию уже в созданном Inno Setup приложении, то исполняется весь код успешно, кроме чтения реестра

Батник делает простое
Смотрит в реестре путь к игре и если есть потом пишет его в файл.
Писать в файл он может всё что угодно через Inno Setup (это проверено и работает)

Короче вот 2 варианта кода чтения ресстра (которые, повторюсь, рабочие и работают если их запускать вручную, но не хотят если запускать из Inno Setup в любом виде)
Код:

rem Получаем путь к установке Brawlhalla из реестра
for /f "tokens=2*" %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 291550" /v "InstallLocation"') do (
    set "registry=%%b"
)

Код:

powershell -Command "& { $registryPath = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 291550'; $valueName = 'InstallLocation'; $installLocation = Get-ItemProperty -Path $registryPath -Name $valueName | Select-Object -ExpandProperty $valueName; $iconPath = Join-Path -Path $installLocation -ChildPath 'Brawlhalla.exe'; $appDataPath = [System.Environment]::GetFolderPath('ApplicationData'); $hubFilePath = 'Brawlhalla\hub.omx'; if (Test-Path $hubFilePath) { [xml]$xmlContent = Get-Content -Path $hubFilePath; $iconNode = $xmlContent.SelectSingleNode('//icon'); $iconNode.InnerText = $iconPath; $xmlContent.Save($hubFilePath); } }"

Я также написал код, который проверяет наличие реестра самим Inno Setup установщиком, но мне этот вариант нужен на самый крайний случай. Ведь я хочу динамическое обновление приложения посредством загрузки данных, а не статичный установщик, который надо будет переобновлять с выходом новой версии.

Пробовал запускать с правами админа, но в чём смысл если сам Inno Setup может читать, а батник нет, мне не подходит вариант даже если это заработает.
Также знаю что в 64 версиях внутри Inno Setup нужно писать HKEY_LOCAL_MACHINE_64
я это пробовал и в батнике (думал вдруг связь есть)
но нет, не помогает
Кто справится с первого раза получит 1000₽ по номеру телефона. Кто не с первого 700₽ (под разом подразумевается выдача готового решения)
Спасибо

El Sanchez 21-08-2024 10:39 3030107

Цитата:

Цитата lmiol
Батник делает простое
Смотрит в реестре путь к игре и если есть потом пишет его в файл. »

lmiol, reg.exe он разных разрядностей бывает. В зависимости от окружения, 32- или 64-разрядного, из которого вызвали батник, будет вызван 32- или 64-разрядный reg.exe. Только вот 64-разрядный reg при таком запросе полезет искать в 64-разрядный раздел HKLM\SOFTWARE, 32-разрядный reg в 32-разрядный HKLM\SOFTWARE, который фактически является HKLM\SOFTWARE\WOW6432Node. Steam пишет в 64-разрядный раздел, понятно, что 32-разрядный reg или 32-разрядный Inno, вызывающий 32-разрядный reg, ничего не найдут в 32-разрядном разделе. Начитавшись инторнетов, умники в батниках или ещё где явно пишут WOW6432Node, не думая о разрядности вызывающего, потом в 32-разрядных системах в реестре появляется раздел WOW6432Node, которого быть там не должно, или на 64-разрядных системах в 32-разрядном разделе появляется лишний HKLM\SOFTWARE\WOW6432Node\WOW6432Node.
Чтобы такого не происходило, лучше в reg при запросе сразу указывать в какую ветку лезть параметрами /reg:32 или /reg:64, в таком случае разрядность reg не имеет значения.
Код:

function GetSteamAppInstallLocation(const AAppID: Integer): string;
var
  LSubkeyName: string;
begin
  Result := '';
  LSubkeyName := Format('SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App %u', [AAppID]);
  if IsWin64() then
  begin
    if RegQueryStringValue(HKCU64, LSubkeyName, 'InstallLocation', Result) and
      (Result <> '') then Exit;
    if RegQueryStringValue(HKLM64, LSubkeyName, 'InstallLocation', Result) and
      (Result <> '') then Exit;
  end;
  if RegQueryStringValue(HKCU32, LSubkeyName, 'InstallLocation', Result) and
    (Result <> '') then Exit;
  RegQueryStringValue(HKLM32, LSubkeyName, 'InstallLocation', Result);
end;

procedure InitializeWizard();
begin
  MsgBox(GetSteamAppInstallLocation(291550), mbInformation, MB_OK);
end;


lmiol 21-08-2024 17:19 3030124

Цитата:

Цитата El Sanchez
lmiol, reg.exe он разных разрядностей бывает. В зависимости от окружения, 32- или 64-разрядного, из которого вызвали батник, будет вызван 32- или 64-разрядный reg.exe. Только вот 64-разрядный reg при таком запросе полезет искать в 64-разрядный раздел HKLM\SOFTWARE, 32-разрядный reg в 32-разрядный HKLM\SOFTWARE, который фактически является HKLM\SOFTWARE\WOW6432Node. Steam пишет в 64-разрядный раздел, понятно, что 32-разрядный reg или 32-разрядный Inno, вызывающий 32-разрядный reg, ничего не найдут в 32-разрядном разделе. Начитавшись инторнетов, умники в батниках или ещё где явно пишут WOW6432Node, не думая о разрядности вызывающего, потом в 32-разрядных системах в реестре появляется раздел WOW6432Node, которого быть там не должно, или на 64-разрядных системах в 32-разрядном разделе появляется лишний HKLM\SOFTWARE\WOW6432Node\WOW6432Node.
Чтобы такого не происходило, лучше в reg при запросе сразу указывать в какую ветку лезть параметрами /reg:32 или /reg:64, в таком случае разрядность reg не имеет значения. »

Я же уже написал в сообщении что знаю как проверять реестр через inno setup. Мне это не нужно, у меня уже есть готовый код.
И повторяю еще раз. Делая реестр через Inno setup будет означать что и данные приложения будут захардкожены в установщике. Т.е. отдельный установщик - отдельные проверки на реестр или если другими словами то новая версия приложения означает что мне надо новый установщик собирать. Моя задача была сделать Inno Setup установщик один а данные чтобы всегда скачивались вместе с батником, в котором уже будет прописана логика. И при апдейте приложения я и батник обновлю. Иными словами это будет один установщик и разные данные приложения, включая разное чтение реестра.

Я еще раз повторяю мой батник успешно читает что угодно (путь текущий например) и успешно всё это пишет в нужный мне файл (когда запускается через inno setup), вот только считать данные с реестра он не может (зато может когда я запускаю его вручную из под винды). Код считывания с реестра батником я приложил
Я ничего не пишу в реестр мне только надо считать с него и всё


PS я проверю твое предположение про WOW6432Node и прочее
если поможет -- отпишусь

DA-Bro 23-08-2024 23:48 3030184

Подскажите.
Столкнулся с константой {commonfonts}.
На строчку
Код:

Source: "{commonfonts}\*.*"; DestDir: "{commonfonts}";
выдаёт сообщение, что неизвестная константа. В справке её нет.
Если я напишу просто {fonts}
Код:

Source: "{commonfonts}\*.*"; DestDir: "{fonts}";
будет без разницы?
Или это как то нужно по другому сделать.

Flix 24-08-2024 16:37 3030202

Цитата:

Цитата DA-Bro
Столкнулся с константой {commonfonts}... В справке её нет. »

В справке она есть (смотреть).

Цитата:

Цитата DA-Bro
выдаёт сообщение, что неизвестная константа. »

Значит вы пользуетесь какой-то древней версией Inno.

Константа появилась с версии 6.1.0 (читать). До этого она была {fonts}.

Как правильно устанавливать шрифты - читать.

DA-Bro 24-08-2024 17:14 3030204

Flix, ну да, пробовал в версии Inno Setup 6.0.5, там же в справке и смотрел.
Тут всё теперь понятно.
Так в моём случае получается {commonfonts} и {fonts} одно и тоже? Или как.

Flix 24-08-2024 18:01 3030206

Цитата:

Цитата DA-Bro
Так в моём случае получается {commonfonts} и {fonts} одно и тоже? Или как. »

DA-Bro, до версии 6.1.0 это была константа {fonts}, а после была переименована в {commonfonts}.
Если используете версию Inno ниже 6.1.0, то указываете {fonts}.
Если выше 6.1.0 - то {commonfonts}, но с учетом 10 версии винды и выше, а также привилегий, могут быть варианты с {userfonts} и {autofonts}. Если не имеете понятия про версию винды и права пользователя, то рекомендуется использовать константу {autofonts}.

lmiol 04-09-2024 22:41 3030648

Цитата:

Цитата El Sanchez
lmiol, reg.exe он разных разрядностей бывает. В зависимости от окружения, 32- или 64-разрядного, из которого вызвали батник, будет вызван 32- или 64-разрядный reg.exe. Только вот 64-разрядный reg при таком запросе полезет искать в 64-разрядный раздел HKLM\SOFTWARE, 32-разрядный reg в 32-разрядный HKLM\SOFTWARE, который фактически является HKLM\SOFTWARE\WOW6432Node. Steam пишет в 64-разрядный раздел, понятно, что 32-разрядный reg или 32-разрядный Inno, вызывающий 32-разрядный reg, ничего не найдут в 32-разрядном разделе. Начитавшись инторнетов, умники в батниках или ещё где явно пишут WOW6432Node, не думая о разрядности вызывающего, потом в 32-разрядных системах в реестре появляется раздел WOW6432Node, которого быть там не должно, или на 64-разрядных системах в 32-разрядном разделе появляется лишний HKLM\SOFTWARE\WOW6432Node\WOW6432Node.
Чтобы такого не происходило, лучше в reg при запросе сразу указывать в какую ветку лезть параметрами /reg:32 или /reg:64, в таком случае разрядность reg не имеет значения. »

Проверил, это не то что надо, это вообще отдельный раздел реестра WOW6432Node
я думал это редирект а оказалось это просто отдельный раздел для 64биток.
Я также исследовал редиректы внутренние, но это не помогло. А также я выяснил что не может читать только с HKEY_LOCAL_MACHINE, а вот с HKEY_CURRENT_USER без проблем читает.
Поэтому я решил пойти другим путем и определить путь игры через Steam.
Вышло даже лучше чем я хотел - я определяю еще и диск (ведь игру можно в либе переместить на другой том)

HTML код:

powershell -Command "$SteamPath=(Get-ItemProperty 'HKCU:\SOFTWARE\Valve\Steam').SteamPath.Replace('/', '\');$LibraryFoldersPath=Join-Path -Path $SteamPath -ChildPath 'steamapps\libraryfolders.vdf';$libraryContent=Get-Content $LibraryFoldersPath -Raw;if($libraryContent -match '\\u0022291550\\u0022\s+\\u0022(\d+)\\u0022'){$matchIndex=$libraryContent.IndexOf($matches[0]);$pathIndex=$libraryContent.LastIndexOf('\\u0022path\\u0022',$matchIndex);if($pathIndex -gt -1){$startPathIndex=$libraryContent.IndexOf('\\u0022',$pathIndex+6)+1;$endPathIndex=$libraryContent.IndexOf('\\u0022',$startPathIndex);$gamePath=$libraryContent.Substring($startPathIndex,$endPathIndex-$startPathIndex);$FinalPath=Join-Path -Path $gamePath -ChildPath 'steamapps\common\Brawlhalla';$FinalPath=$FinalPath.Replace('\\\\', '\');$FinalPath=$FinalPath.Replace('\\', '\'); $FinalPath}else{'Путь не найден.'}}else{'Игра с идентификатором 291550 не найдена.'}  $installPath = $FinalPath; $appDataPath = [System.Environment]::GetFolderPath('ApplicationData'); $hubFilePath = '%APPDATA%\Open Mod Manager\Brawlhalla\Maps\channel.omx'; if (Test-Path $hubFilePath) { [xml]$xmlContent = Get-Content -Path $hubFilePath; $installNode = $xmlContent.SelectSingleNode('//install'); $installNode.InnerText = $installPath; $xmlContent.Save($hubFilePath); } "
получилось очень даже хорошо и мой динамический установщик кайфово отпрабатывает и готов к любым обновлениям версий и тому что там разработчик может изменить.
Т.е. мой Inno Setup проверяет только наличие стима и флага что игра установлена (так как всё это для одной игры требуется), а вот путь где установлено, построение конфигов и всё остальное я чекаю через скрипты

Beavimo 09-10-2024 01:38 3031473

дал мне когда то форумчанин по имени Gnom_aka_Lexander отличный визуал скрипт. подредактировал я этот скрипт немножко под себя - и восторгу моему не было предела. вот спустя годы возникла нужда в написании setup.exe, достал я значит заготовку, и смастерил инсталлятор. запускаю, а картинка в форме не на весь экран
фото
думаю в чем дело, все ж нормально было, пробую старый проект - такая же картина. оказалось дело в том, что у меня стоит увеличения текста в Windows (изменение размера текста, приложений и других элементов свыше 100%). походил я по интернету, и нашел решение, откат на версию 5.1.9 конца 2006 года, но и тут меня ждала небольшая засада, рамки вокруг надписей
фото
как заставить это работать правильно, на более новых версиях Inno, может есть какое дополнение (библиотека), или версия Inno, по типу (advanced)?


в дополнение: нужно решить еще две проблемы, чтобы довести скрипт до ума.
1.) найти способ перетаскивать форму при (BorderStyle:=bsNone).
код
[Setup]
AppName=Test
AppVerName=Test
OutputBaseFilename=Test
OutputDir=userdocs:..\desktop
CreateAppDir=no
Uninstallable=no

[code]
procedure InitializeWizard();
var
ClientWidth: Integer;
ClientHeight: Integer;
begin
ClientWidth := WizardForm.ClientWidth;
ClientHeight := WizardForm.ClientHeight;

WizardForm.BorderStyle := bsNone;

WizardForm.ClientWidth := ClientWidth;
WizardForm.ClientHeight := ClientHeight;
end;
2.) и отключить установку с клавиатуры. то есть сделать так, чтобы кнопка Install (NextButton) - не реагировал на нажатия Enter, Пробел.


вторую неделю уже колдую, и все ни как :clever-ma . в принципе жить можно, но вот перетащить форму очень бы хотелось.

El Sanchez 16-10-2024 13:23 3031704

Цитата:

Цитата Beavimo
1.) найти способ перетаскивать форму при (BorderStyle:=bsNone).
2.) и отключить управление с клавиатуры. то есть сделать так чтобы Setup не реагировал на нажатия Enter, и на другие кнопки клавиатуры. »

Скрытый текст

Код:

[Files]
#ifndef IS_ENHANCED
  #if VER < 0x06000000
; https://web.archive.org/web/20150510131335if_/http://restools.hanzify.org/inno/callbackctrl/InnoCallbackCtrl_V1.1.zip
Source: CallbackCtrl.dll; Flags: dontcopy
 
#endif
#endif

[Code]
const
  WH_KEYBOARD = 2;

  VK_LBUTTON = $0001;

  WM_SETCURSOR = $0020;
  WM_LBUTTONDOWN = $0201;

  HTCLIENT = 1;

  SWP_NOSIZE        = 1;
  SWP_NOZORDER      = 4;
  SWP_NOOWNERZORDER = $0200;

// CallbackCtrl.dll Functions
#ifndef IS_ENHANCED
  #if VER < 0x06000000
type
  TKeyboardProc = function(nCode: Integer; wParam: UINT_PTR; lParam: INT_PTR): Longint;
  TSubclassProc = function(hWnd: HWND; uMsg: UINT; wParam: UINT_PTR; lParam: INT_PTR;
    uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): INT_PTR;
function WrapKeyboardProc(Callback: TKeyboardProc; ParamCount: Integer): LongWord; external 'wrapcallbackaddr@files:callbackctrl.dll stdcall';
function WrapSubclassProc(Callback: TSubclassProc; ParamCount: Integer): LongWord; external 'wrapcallbackaddr@files:callbackctrl.dll stdcall';
  #endif
#endif

// Process and Thread Functions
function GetCurrentThreadId(): DWORD; external 'GetCurrentThreadId@kernel32.dll stdcall';
// Hook Functions
function CallNextHookEx(hhk: THandle; nCode: Integer; wParam: UINT_PTR; lParam: INT_PTR): INT_PTR; external 'CallNextHookEx@user32.dll stdcall';
function SetWindowsHookEx(idHook: Integer; lpfn: LongWord; hmod: THandle; dwThreadId: DWORD): THandle; external 'SetWindowsHookExW@user32.dll stdcall';
function UnhookWindowsHookEx(hhk: THandle): BOOL; external 'UnhookWindowsHookEx@user32.dll stdcall';
// Shell Functions
function SetWindowSubclass(hWnd: HWND; pfnSubclass: LongWord; uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): BOOL; external 'SetWindowSubclass@comctl32.dll stdcall';
function RemoveWindowSubclass(hWnd: HWND; pfnSubclass: LongWord; uIdSubclass: UINT_PTR): BOOL; external 'RemoveWindowSubclass@comctl32.dll stdcall';
function DefSubclassProc(hWnd: HWND; uMsg: UINT; wParam: UINT_PTR; lParam: INT_PTR): INT_PTR; external 'DefSubclassProc@comctl32.dll stdcall';
// Cursor Functions
function GetCursorPos(out lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
// Window Functions
function GetWindowRect(hWnd: HWND; out lpRect: TRect): BOOL; external 'GetWindowRect@user32.dll stdcall';
function SetWindowPos(hWnd, hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; external 'SetWindowPos@user32.dll stdcall';
// Keyboard Input Functions
function GetAsyncKeyState(vKey: Integer): SmallInt; external 'GetAsyncKeyState@user32.dll stdcall';
// Rectangle Functions
function OffsetRect(var lprc: TRect; dx, dy: Integer): BOOL; external 'OffsetRect@user32.dll stdcall';

var
  HHookProc: THandle;
  PKeyboardProc: LongWord;
  PWndProc: LongWord;

function WndProc(hWnd: HWND; uMsg: UINT; wParam: UINT_PTR; lParam: INT_PTR;
  uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): INT_PTR;
var
  LWindowRect: TRect;
  LSavePt, LCurPt: TPoint;
begin
  case uMsg of
    WM_SETCURSOR:
      begin
        Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
        if (lParam shr $10 = WM_LBUTTONDOWN) and
          (lParam and $FFFF = HTCLIENT) then
        begin
          GetWindowRect(hWnd, LWindowRect);
          GetCursorPos(LSavePt);
          while (GetAsyncKeyState(VK_LBUTTON) <> 0) do
          begin
            GetCursorPos(LCurPt);
            OffsetRect(LWindowRect, LCurPt.x - LSavePt.x, LCurPt.y - LSavePt.y);
            SetWindowPos(hWnd, 0, LWindowRect.Left, LWindowRect.Top,
              0, 0, SWP_NOOWNERZORDER or SWP_NOSIZE or SWP_NOZORDER);
            LSavePt := LCurPt;
          end;
        end;
      end;
  else
    Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
  end;
end;

procedure SubclassWizardForm(const ARemove: Boolean);
begin
  if PWndProc = 0 then
  #ifdef IS_ENHANCED
   
PWndProc := CallbackAddr('WndProc');
  #elif VER >= 0x06000000
   
PWndProc := CreateCallback(@WndProc);
  #else
   
PWndProc := WrapSubclassProc(@WndProc, 6);
  #endif

 
if not ARemove then
    SetWindowSubclass(WizardForm.Handle, PWndProc, 0, 0)
  else if PWndProc <> 0 then
    RemoveWindowSubclass(WizardForm.Handle, PWndProc, 0);
end;

function KeyboardProc(nCode: Integer; wParam: UINT_PTR; lParam: INT_PTR): Longint;
begin
  if nCode < 0 then
    Result := CallNextHookEx(HHookProc, nCode, wParam, lParam)
  else
    Result := 1;
end;

procedure SetHook();
begin
  if PKeyboardProc = 0 then
  #ifdef IS_ENHANCED
   
PKeyboardProc := CallbackAddr('KeyboardProc');
  #elif VER >= 0x06000000
   
PKeyboardProc := CreateCallback(@KeyboardProc);
  #else
   
PKeyboardProc := WrapKeyboardProc(@KeyboardProc, 3);
  #endif
 
HHookProc := SetWindowsHookEx(WH_KEYBOARD, PKeyboardProc, 0, GetCurrentThreadId());
end;

procedure UnHook();
begin
  if HHookProc > 0 then
    UnhookWindowsHookEx(HHookProc);
end;

procedure InitializeWizard;
begin
  WizardForm.BorderStyle := bsNone;
  SetHook();
  SubclassWizardForm(False);
end;

procedure DeinitializeSetup();
begin
  SubclassWizardForm(True);
  UnHook();
end;


Beavimo 18-10-2024 16:19 3031775

El Sanchez, дружище только увидел твой пост - думал это невозможно:idontnow:
Я перелопатил весь интернет в поисках решения, но так ничего и не нашел, а тут такое:wow:

Наконец осуществилась моя мечта, иметь на борту достойный инсталлятор.


СПАСИБИЩЕ ТЕБЕ БОЛЬШОЕ!!!
:hi:

Beavimo 24-10-2024 09:49 3031962

Доброго дня Форумчане
есть у меня вот такой
код

[Setup]
AppName=Test
AppVerName=Test
OutputBaseFilename=Test
OutputDir=userdocs:..\desktop
DefaultDirName=Test
Uninstallable=no

[code]
const
VK_LBUTTON = $0001;
WM_SETCURSOR = $0020;
WM_LBUTTONDOWN = $0201;
HTCLIENT = 1;
SWP_NOSIZE = 1;
SWP_NOZORDER = 4;
SWP_NOOWNERZORDER = $0200;

function SetWindowSubclass(hWnd: HWND; pfnSubclass: LongWord; uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): BOOL; external 'SetWindowSubclass@comctl32.dll stdcall';
function RemoveWindowSubclass(hWnd: HWND; pfnSubclass: LongWord; uIdSubclass: UINT_PTR): BOOL; external 'RemoveWindowSubclass@comctl32.dll stdcall';
function DefSubclassProc(hWnd: HWND; uMsg: UINT; wParam: UINT_PTR; lParam: INT_PTR): INT_PTR; external 'DefSubclassProc@comctl32.dll stdcall';
function GetCursorPos(out lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
function GetWindowRect(hWnd: HWND; out lpRect: TRect): BOOL; external 'GetWindowRect@user32.dll stdcall';
function SetWindowPos(hWnd, hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; external 'SetWindowPos@user32.dll stdcall';
function GetAsyncKeyState(vKey: Integer): SmallInt; external 'GetAsyncKeyState@user32.dll stdcall';
function OffsetRect(var lprc: TRect; dx, dy: Integer): BOOL; external 'OffsetRect@user32.dll stdcall';

var
PWndProc: LongWord;

function WndProc(hWnd: HWND; uMsg: UINT; wParam: UINT_PTR; lParam: INT_PTR;
uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): INT_PTR;
var
LWindowRect: TRect;
LSavePt, LCurPt: TPoint;
begin
case uMsg of
WM_SETCURSOR:
begin
Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
if (lParam shr $10 = WM_LBUTTONDOWN) and
(lParam and $FFFF = HTCLIENT) then
begin
GetWindowRect(hWnd, LWindowRect);
GetCursorPos(LSavePt);
while (GetAsyncKeyState(VK_LBUTTON) <> 0) do
begin
GetCursorPos(LCurPt);
OffsetRect(LWindowRect, LCurPt.x - LSavePt.x, LCurPt.y - LSavePt.y);
SetWindowPos(hWnd, 0, LWindowRect.Left, LWindowRect.Top,
0, 0, SWP_NOOWNERZORDER or SWP_NOSIZE or SWP_NOZORDER);
LSavePt := LCurPt;
end;
end;
end;
else
Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
end;
end;

procedure SubclassWizardForm(const ARemove: Boolean);
begin
if PWndProc = 0 then
PWndProc := CreateCallback(@WndProc);
if not ARemove then
SetWindowSubclass(WizardForm.Handle, PWndProc, 0, 0)
else if PWndProc <> 0 then
RemoveWindowSubclass(WizardForm.Handle, PWndProc, 0);
end;


procedure TButtonOnClick( Sender: TObject );
var
MainForm: TSetupForm;
begin
begin
MainForm := CreateCustomForm();
with MainForm do
try
BorderIcons := [];
ClientWidth := ScaleX( 300 );
ClientHeight := ScaleY( 300 );
Caption := 'Информация';
//Position := poScreenCenter;
Position := poMainFormCenter

with TBevel.Create( nil ) do
begin
Parent := MainForm;
SetBounds( ScaleX( 8 ), ScaleY( 8 ), ScaleX( 284 ), ScaleY( 249 ) );
Shape := bsFrame;
end;

with TNewStaticText.Create( nil ) do
begin
Parent := MainForm;
SetBounds( ScaleX( 12 ), ScaleY( 12 ), ScaleX( 276 ), ScaleY( 241 ) );
AutoSize := False;
Caption := 'Информация:' + #13#10 +
'Версия:' + #13#10 +
'И т.д.';
WordWrap := True;
end;

with TButton.Create( nil ) do
begin
Parent := MainForm;
SetBounds( ScaleX( 112 ), ScaleY( 266 ), ScaleX( 76 ), ScaleY( 25 ) );
ModalResult := mrOk;
Caption := 'Закрыть';
end;

ShowModal();
finally

Free;
end;
end;
end;

procedure InitializeWizard();
begin
with TButton.Create( nil ) do
begin
Parent := WizardForm;
Left := ScaleX( 12 );
Top := ScaleY( 327 );
Caption := 'Info';
OnClick := @TButtonOnClick;
end;
begin
SubclassWizardForm(False);
end;
end;
спасибо El Sanchez за пример перетаскивания формы.

и вот стоит у меня несколько задач по данному примеру.
1.) Непонятно почему форма перетаскивается, а окно информации нет?
2.) Почему окно информации открывается не по центру формы?
3.) Возможно ли сделать так, чтобы окно информации закрывалось кликом по нему?

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

Beavimo 24-10-2024 13:08 3031978

люди помогите :help:

у меня уже чердак дымит. я весь вымотался

Dodakaedr 24-10-2024 13:16 3031981

Beavimo, имейте терпение. Знающие люди придут с работы и помогут чем смогут.

Beavimo 24-10-2024 13:42 3031985

раньше безпроблем гуглил. сейчас немогу, уже второй день немогу установть временный файл при запуске инсталятора, я точно имею пример в две строчьки на другом пк. флаг (dontcopy) не работает в момент установки программы, если нужно обратится к файлу вылетает ошыбка. если вручную положыть файл то все работает как надо. как установить файл при запуске инталятора, в какой секции это прописать RUN или Files. все эти флаги перебрал перечитал, они работают только в момент инсталяции.

как установить временный файл при запуске инсталятора?

Dodakaedr 24-10-2024 21:22 3032007

Цитата:

Цитата Beavimo
как установить временный файл при запуске инсталятора? »

Код:

[Files]
Source: "tmp\MyFile.ini"; DestDir: "{tmp}"; Flags: dontcopy

[Code]
function InitializeSetup(): Boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\MyFile.ini')) then ExtractTemporaryFile('MyFile.ini');
  Result := True;
end;


proffbik 29-10-2024 17:10 3032159

Не понимаю, помогите плиз. Использую скрипт El Sanchez по прикреплению ярлыка на панели быстрого запуска. Для этого я самостоятельно создаю ярлык по главному запускающему файлу exe и прописываю его в скрипте в формате "{app}\xxxxx.lnk. Компилится, все хорошо.

Но вот после установки закрепляется ярлык, который не находит свой основной файл( Как можно решить?

Я думаю надо просто сделать автоматическое создание ярлыка запускающего exe при установке программы, но не знаю как это реализовать в коде скрипта inno


Время: 18:04.

Время: 18:04.
© OSzone.net 2001-