Возможности сценариев в разделе реестра - PullRequest
1 голос
/ 29 февраля 2020

Наше программное обеспечение поддерживает диапазон (~ 70) сопоставлений файлов, которые пользователь может выбрать для сопоставления с нашим приложением. Это просто установить в разделе Registry программы установки и использовать флаги для управления поведением при удалении, а также флаг Check для контроля, следует ли записывать его в реестр или нет. Пользователи могут контролировать, какие ассоциации устанавливать через пользовательскую страницу с помощью CheckListBox.

. Теперь мне интересно, есть ли способ для l oop над CheckBox элементами CheckListBox внутри Registry секции? В настоящее время я могу только представить, что мне придется создавать все записи реестра через раздел Code, но для этого потребуется также написать код для деинсталлятора, поскольку флаги, управляющие поведением деинсталляции, здесь недоступны?

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Вы не можете использовать Pascal код для генерации Registry записей раздела.

Но вы можете использовать Препроцессор Inno Setup для генерации как ваших Registry разделов, так и кода для добавления расширений к CheckListBox. Примерно так:

#define Extension(Mode, Ext) \
  Mode == "Registry" ? \
    "Root: HKCU; Subkey: ""Software\My Company""; ValueType: string; ValueName: """ + \
      Ext + """; ValueData: ""yes""; Check: RegisterExtension('" + Ext + "')" + NewLine \
  : Mode == "Check" ? \
    "  if (Ext = '" + Ext + "') and CheckListBox.Checked[I] then Exit;" + NewLine + \
    "  Inc(I); " + NewLine \
  : Mode == "AddCheckbox" ? \
    "  CheckListBox.AddCheckBox('" + Ext + "', '', 0, True, True, False, True, nil);" + \
      NewLine \
  : ""


#define Extensions(Mode) \
  Extension(Mode, 'jpg') + \
  Extension(Mode, 'gif') + \
  Extension(Mode, 'png') + \
  ""
[Registry]
#emit Extensions("Registry")
[Code]

var
  CheckListBox: TNewCheckListBox;

function RegisterExtension(Ext: string): Boolean;
var
  I: Integer;
begin
  I := 0;
  Result := True;
  #emit Extensions("Check")
  Result := False;
end;

procedure AddExtensionsToCheckListBox;
begin
  #emit Extensions("AddCheckbox")
end;
  • Registry запись является просто (бесполезным) примером.
  • Вызовите AddExtensionsToCheckListBox где-то из кода, где Вы создаете CheckListBox.

См. мой другой ответ для менее элегантного, но более удобочитаемого решения.


Чтобы увидеть, что это делает, добавьте это в конец вашего скрипта:

#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")

Проверьте Preprocessed.iss после компиляции. Это должно дать вам что-то вроде (для удобства чтения добавлены пустые строки и перенос строк) :

[Registry]
Root: HKCU; Subkey: "Software\My Company"; ValueType: string; ValueName: "jpg"; \
  ValueData: "yes"; Check: RegisterExtension('jpg')
Root: HKCU; Subkey: "Software\My Company"; ValueType: string; ValueName: "gif"; \
  ValueData: "yes"; Check: RegisterExtension('gif')
Root: HKCU; Subkey: "Software\My Company"; ValueType: string; ValueName: "png"; \
  ValueData: "yes"; Check: RegisterExtension('png')

[Code]
var
  CheckListBox: TNewCheckListBox;

function RegisterExtension(Ext: string): Boolean;
var
  I: Integer;
begin
  I := 0;
  Result := True;
  if (Ext = 'jpg') and CheckListBox.Checked[I] then Exit;
  Inc(I); 
  if (Ext = 'gif') and CheckListBox.Checked[I] then Exit;
  Inc(I); 
  if (Ext = 'png') and CheckListBox.Checked[I] then Exit;
  Inc(I); 
  Result := False;
end;

procedure AddExtensionsToCheckListBox;
begin
  CheckListBox.AddCheckBox('jpg', '', 0, True, True, False, True, nil);
  CheckListBox.AddCheckBox('gif', '', 0, True, True, False, True, nil);
  CheckListBox.AddCheckBox('png', '', 0, True, True, False, True, nil);
end;
0 голосов
/ 03 марта 2020

Я придумал альтернативное решение для моего первого ответа . Это менее элегантно. Но, вероятно, способ более читабелен, особенно для тех, кто не имел опыта работы с синтаксисом препроцессора Inno Setup.

Он использует директиву препроцессора #sub , которая позволяет использовать собственный синтаксис Inno Setup для генерации * Раздел 1008 *, вместо того чтобы создавать его с помощью выражения препроцессора. Код препроцессора генерирует опрос индексированных записей, которые условно используются во время выполнения. Вам просто нужно убедиться, что MaxExt достаточно большой, чтобы вместить все ваши расширения.

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

#define MaxExt 100

[Registry]
#define I

#sub RegistryEntry
Root: HKCU; Subkey: "Software\My Company"; ValueType: string; \
  ValueName: "{code:GetExt|{#I}}"; ValueData: "yes"; Check: RegisterExt({#I})
#endsub

#for {I = 0; I < MaxExt; I++} RegistryEntry
[Code]

var
  Exts: TStrings;
  CheckListBox: TNewCheckListBox;

function RegisterExt(I: Integer): Boolean;
begin
  Result := (I < CheckListBox.Items.Count) and CheckListBox.Checked[I];
end;

function GetExt(Param: string): string;
var
  I: Integer;
begin
  I := StrToInt(Param);
  if I < Exts.Count then Result := Exts[I]
    else Result := 'unused';
end;

procedure AddExt(Ext: string);
begin
  { Separate list of extensions is needed only in case that the list box items caption }
  { is more complex than a mere extension name. Otherwise you could read the extension }
  { name from checked item caption in GetExt. }
  Exts.Add(Ext);
  CheckListBox.AddCheckBox(Ext, '', 0, True, True, False, True, nil);
end;

procedure AddExtensionsToCheckListBox;
begin
  Exts := TStringList.Create;
  AddExt('jpg');
  AddExt('gif');
  AddExt('png');
  { ... }
end;
  • Registry запись является просто (бесполезным) примером.
  • Вызов AddExtensionsToCheckListBox где-то из кода , где вы создаете CheckListBox.

Чтобы увидеть, что делает часть препроцессора, добавьте это в конец вашего скрипта:

#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")

Проверьте Preprocessed.iss после компиляции. Он должен содержать l ie из 100 сгенерированных записей, таких как:

[Registry]
Root: HKCU; Subkey: "Software\My Company"; ValueType: string; ValueName: "{code:GetExt|0}"; ValueData: "yes"; Check: RegisterExt(0)
Root: HKCU; Subkey: "Software\My Company"; ValueType: string; ValueName: "{code:GetExt|1}"; ValueData: "yes"; Check: RegisterExt(1)
Root: HKCU; Subkey: "Software\My Company"; ValueType: string; ValueName: "{code:GetExt|2}"; ValueData: "yes"; Check: RegisterExt(2)
...
Root: HKCU; Subkey: "Software\My Company"; ValueType: string; ValueName: "{code:GetExt|99}"; ValueData: "yes"; Check: RegisterExt(99)
...