Running script code (adding a registry key) instead of executable in Run entry in Inno Setup

China☆狼群 提交于 2020-05-28 04:39:33

问题


I want to add a registry key after the user accept the key addition. The key will tell Firefox where to find our plugin (which is stored in the app folder)

The user will get a checkbox "install ff plug-in?" in the same form as where we ask "install chrome plugin" and "install ie plugin?".

[Code]
function GetHKLM: Integer;
begin
  if IsWin64 then
    Result := HKLM64
  else
    Result := HKLM32;
end;

function CheckForMozilla: Boolean;
begin
  Result := False;
  if RegKeyExists(GetHKLM(), 'SOFTWARE\Mozilla\Mozilla Firefox') then
  begin
    Result := True;
  end;

  if RegKeyExists(GetHKLM(), 'SOFTWARE\Mozilla\Firefox') then
  begin
    Result := True;
  end;
end;

function AddFFKey : Boolean;
begin
  { Some way to write this key in code section : }
  GetHKLM() + '\SOFTWARE\Mozilla\Mozilla Firefox\extensions\5e12c5a...'
end;
[Run]
Filename: AddFFKey; Flags: runascurrentuser postinstall ; \
    Check: CheckForMozilla; Description: "Install firefox plug-in"

Thank you all!
Steve


回答1:


You can capture the Finish button click by implementing NextButtonClick event function and replace the executable call with a script procedure call.

#define InstallFFPluginDesc "Install firefox plug-in"

[Run]
FileName: "fake.exe"; Flags: postinstall; Description: "{#InstallFFPluginDesc}"; \
    Check: CheckForMozilla

[Code]

procedure AddFFKey;
begin
  Log('Adding FF key');
  RegWriteStringValue(
    GetHKLM(), 'SOFTWARE\Mozilla\Mozilla Firefox\extensions\5e12c5a...', ...);
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var
  Index: Integer;
begin
  if CurPageID = wpFinished then
  begin
    { When restart is needed, the RunList is never populated/shown. }
    if WizardForm.RunList.Items.Count > 0 then
    begin
      { Find the RunList entry for the FF plugin }
      Index := WizardForm.RunList.Items.IndexOf('{#InstallFFPluginDesc}');
      { Does it exist and is it checked? }
      if (Index >= 0) and WizardForm.RunList.Checked[Index] then
      begin
        { Uncheck, so that the fake.exe is not run }
        WizardForm.RunList.Checked[Index] := False;
        { Do our scripted action instead }
        AddFFKey;
      end;
    end;
  end;
  Result := True;
end;

Another alternative is to add a working but noop [Run] entry, and use BeforeInstall or AfterInstall parameter to call your script code.

It's easier and more robust solution, just with a side-effect (you have to run some process, even though it does not need to do anything).

[Run]
FileName: "{cmd}"; Parameters: "/C echo noop"; Flags: postinstall runhidden; \
    Description: "Install firefox plug-in"; Check: CheckForMozilla; \
    BeforeInstall: AddFFKey

[Code]

procedure AddFFKey;
begin
  Log('Adding FF key');
  ...
end;

I believe that your GetHKLM logic is wrong. The Firefox always writes to 32-bit registry.



来源:https://stackoverflow.com/questions/34007625/running-script-code-adding-a-registry-key-instead-of-executable-in-run-entry-i

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!