Я предполагаю, что вы получаете сообщение об ошибке при запуске программы установки, а не деинсталляции.
Когда установщик запускается, {app}
, очевидно, пока неизвестно.
Но, как вам нужно импортировать только деинсталлятор, который знает {app}
, вы можете добавить uninstallonly
option:
procedure uLoadVCLStyle(VClStyleFile: String);
external '[email protected]{app}\VclStylesInno.dll stdcall uninstallonly';
Хотя это не помогает, так как деинсталлятор хочет удалить DLL, в противном случае, поскольку у него есть сама DLL.
Решение прост, просто следуйте официальным instructions for uninstalling the VCL Styles for Inno Setup.
Вам необходимо установить DLL где-то еще, кроме {app}
, и оставить DLL при удалении. Это на самом деле уродливое решение, которое imho не оправдывает стильный деинсталлятор. Но это ваш выбор.
Как вы предложили, вы можете скопировать DLL на временную папку Windows, загрузите его оттуда и надеяться на Windows, чтобы в конечном итоге удалить DLL во временной очистки каталога.
Это следует делать (обратите внимание на delayload
option):
[Files]
Source: VclStylesinno.dll; DestDir: {app}
[Code]
procedure LoadVCLStyle_UnInstall(VClStyleFile: String);
external '[email protected]{%TEMP}\VclStylesInno.dll stdcall uninstallonly delayload';
function InitializeUninstall: Boolean;
begin
if FileCopy(ExpandConstant('{app}\VclStylesinno.dll'),
ExpandConstant('{%TEMP}\VclStylesinno.dll'), False) then
begin
LoadVCLStyle_UnInstall(...);
end;
end;
другое решение (лучше, но более усложнит для реализации), см How keep uninstall files inside uninstaller?
Я думаю, что в этом случае костюм мои требования: [ Как применить стили VCL к форматам на основе DLL в Inno Setup для удаления? Не удалось импортировать dll] (http://stackoverflow.com/questions/36745054/how-to-apply-vcl-styles-to-dll-based-forms-in-inno-setup-for-uninstall-cannot-i) –