2016-04-29 7 views
2

Я пытаюсь загрузить VclStylesInno.dll для удаления формы Inno Setup. Следующий код объявлен в середине [Code] раздела:Загрузите внешнюю DLL для процесса удаления в Inno Setup

procedure uLoadVCLStyle(VClStyleFile: String); 
    external '[email protected]{app}/VclStylesInno.dll stdcall'; 

, но я столкнулся ошибку

была предпринята попытка расширить «приложение» константа, прежде чем он был инициализирован

Каков наилучший способ загрузки DLL для процесса удаления?

+0

Я думаю, что в этом случае костюм мои требования: [ Как применить стили 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) –

ответ

0

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

Когда установщик запускается, {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?

+0

Я видел совет, чтобы переместить его в временную папку, но понятия не имею, как это сделать, если только процесс ExtractTemporaryFile не работает для Uninstall. –

+0

Спасибо, Мартин. Я собирался использовать FileCopy. –

 Смежные вопросы

  • Нет связанных вопросов^_^