Почему мы должны использовать флаг uninsneveruninstall при создании скина для Inno Setup Uninstaller? - PullRequest
1 голос
/ 17 марта 2020

Я немного запутался с этим плагином VCL Styles . Я особенно заинтересован в стороне вещей Uninstaller .

Образец, который они предоставляют, выглядит следующим образом:

#define VCLStylesSkinPath "{localappdata}\VCLStylesSkin"
[Files]
Source: ..\VclStylesinno.dll; DestDir: {#VCLStylesSkinPath}; Flags: uninsneveruninstall
Source: ..\Styles\Amakrits.vsf; DestDir: {#VCLStylesSkinPath}; Flags: uninsneveruninstall


[Code]
{ Import the LoadVCLStyle function from VclStylesInno.DLL }
procedure LoadVCLStyle(VClStyleFile: String);
  external 'LoadVCLStyleW@files:VclStylesInno.dll stdcall setuponly';
procedure LoadVCLStyle_UnInstall(VClStyleFile: String);
  external 'LoadVCLStyleW@{#VCLStylesSkinPath}\VclStylesInno.dll stdcall uninstallonly';
{ Import the UnLoadVCLStyles function from VclStylesInno.DLL }
procedure UnLoadVCLStyles;
  external 'UnLoadVCLStyles@files:VclStylesInno.dll stdcall setuponly';
procedure UnLoadVCLStyles_UnInstall;
  external 'UnLoadVCLStyles@{#VCLStylesSkinPath}\VclStylesInno.dll stdcall uninstallonly';

function InitializeSetup(): Boolean;
begin
  ExtractTemporaryFile('Amakrits.vsf');
  LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
  Result := True;
end;

procedure DeinitializeSetup();
begin
  UnLoadVCLStyles;
end;

function InitializeUninstall: Boolean;
begin
  Result := True;
  LoadVCLStyle_UnInstall(ExpandConstant('{#VCLStylesSkinPath}\Amakrits.vsf'));
end;

procedure DeinitializeUninstall();
begin
  UnLoadVCLStyles_UnInstall;
end;

Меня интересует этот бит:

Source: ..\VclStylesinno.dll; DestDir: {#VCLStylesSkinPath}; Flags: uninsneveruninstall
Source: ..\Styles\Amakrits.vsf; DestDir: {#VCLStylesSkinPath}; Flags: uninsneveruninstall

Я понимаю, что файлы должны быть установлены, потому что они требуются для удаления. Но зачем вам использовать флаг uninsneveruninstall? Это приемлемое поведение?

1 Ответ

1 голос
/ 17 марта 2020

Это DLL. Он загружен в программу удаления. Таким образом, деинсталлятор не может удалить его. Таким образом, есть флаг, чтобы избежать сбоя программы удаления при бессмысленной попытке удалить файл.

Для лучшего решения см. Вторую часть моего ответа на:
Загрузить внешнюю DLL для процесс удаления в Inno Setup

...