Вопрос Удаление остатков, проверка наличия файлов и деинсталляция.

Natrix

Новичок
Доброго времени суток.

Подскажите пожалуйста,
доп. ПО оставляет временные файл, какой есть вариант удаления этих файлов после установки с учётом что их может и не быть?
Код:
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssDone then
  begin
    DelTree(ExpandConstant('{app}') + 'folder\name.file', True, True, True);
  end;
end
Отказывается удалять при любом значении CurStep =. Подскажите пожалуйста ещё варианты.
_________________________________________________________________________________________________________________________________

Есть код:
Код:
function NextButtonClick(CurPage: Integer): Boolean;
var
s:string;
begin
Result:=True;
If CurPage=6 then
begin
If FileSearch('name.exe', ExpandConstant('{app}'))='' then
begin
s:='В '+ExpandConstant('{app}')+' файл name.exe не найден.';
MsgBox(s, mbError, mb_Ok);
Result:=False;
end;
end;
end;
Как к нему добавить проверку наличия ещё одного файла, только в случае обнаружения не разрешать установку, а наоборот запретить с этой же страницы (CurPage=6) выдавая другое или это же сообщение. Возможно ли это вообще в данном варианте и если нет, то есть ли какие нибудь другие решения для подобной задачи? Т.е. разрешить установку в выбранную директорию если в ней 1.exe обнаружен и 2.exe не обнаружен.
_________________________________________________________________________________________________________________________________

И последняя дилемма, как проверить наличие исполняемого файла (деинсталлятор) в указанном юзером пути установки. Т.е. чекнуть в выбранной директории файл {src}\del\unins000.exe и при его нахождении, выполнить, запустить деинсталляцию в тихом (либо нет, тут уж не суть) режиме, до установки?
 
Последнее редактирование:

Косой

Новичок
По первому вопросу могу предложить использовать DeleteFile, пример:
if FileExists(ExpandConstant('{app}')+'\folder\name.file') then
DeleteFile(ExpandConstant('{{app}') + '\folder\name.file');

По второму вопросу, можно как-то так:
if FileExists(ExpandConstant('{app}')+'\1.exe') and not FileExists(ExpandConstant('{app}')+'\2.exe') then...

По третьему вопросу: загружу скрипт (от nik1967), где реализовано нечто подобное.
 

Вложения

Awalder

Новичок
И последняя дилемма, как проверить наличие исполняемого файла (деинсталлятор) в указанном юзером пути установки. Т.е. чекнуть в выбранной директории файл {src}\del\unins000.exe и при его нахождении, выполнить, запустить деинсталляцию в тихом (либо нет, тут уж не суть) режиме, до установки?
unins000.exe можно по реестру найти, и запустить перед установкой процедуру удаления, я использовал пример из русской справки к инно

[Setup]
AppName=My Program
AppVerName=My Program 1.0
CreateAppDir=no

Код:
var
StaticText: TNewStaticText;
RadioButton_1,RadioButton_2: TRadioButton;
Uninstall,Location:string;
ResultCode:Integer;

///Процедура NextButtonClick для новой страницы.
function Page_NextButtonClick(Page: TWizardPage): Boolean;
begin
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1','UninstallString', Uninstall) then
Uninstall:=RemoveQuotes(Uninstall);
if RadioButton_1.Checked then
begin
if not Exec(Uninstall, ' /SILENT', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
MsgBox('Ошибка удаления. ' #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 'Вероятно, деинсталлятор был перемещен, удален или переименован.', mbError, MB_OK);
Result:=True;
end
else
begin
if not RadioButton_1.Checked then
Result:=True;
end;
end;

///Процедура CancelButtonClick для новой страницы.
procedure Page_CancelButtonClick(Page: TWizardPage; var Cancel, Confirm: Boolean);
begin
Confirm:=False;
Cancel:=True;
end;

///Эта процедура создает новую страницу и все что на нее находится
function CheckInstalledPage(PreviousPageId: Integer): Integer;
var
Page: TWizardPage;
begin
RegQueryStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1','InstallLocation', Location)
Page := CreateCustomPage(PreviousPageId,'Previous Installation Found','Please choose how you want to proceed.');
///Текст на странице
StaticText := TNewStaticText.Create(Page);
StaticText.Parent := Page.Surface;
StaticText.Caption :='Inno Setup is already installed in'+' '+'"' + Location +'"'++' '+'on your system.'#13+ 'It is recommended that you uninstall the current version before continuing.';
StaticText.Left := 0;
StaticText.Top := ScaleY(24);
StaticText.TabOrder := 0;
StaticText.AutoSize:=True;
///Первый RadioButton
RadioButton_1 := TRadioButton.Create(Page);
RadioButton_1.Parent := Page.Surface;
RadioButton_1.Caption := 'Uninstall before continuing (recommended)';
RadioButton_1.Left := 0;
RadioButton_1.Top := ScaleY(104);
RadioButton_1.Width := ScaleX(233);
RadioButton_1.Height := ScaleY(17);
RadioButton_1.Checked := True;
RadioButton_1.TabOrder := 1;
RadioButton_1.TabStop := True;
///Второй RadioButton
RadioButton_2 := TRadioButton.Create(Page);
RadioButton_2.Parent := Page.Surface;
RadioButton_2.Caption := 'Overwrite current version';
RadioButton_2.Left := 0;
RadioButton_2.Top := ScaleY(144);
RadioButton_2.Width := ScaleX(153);
RadioButton_2.Height := ScaleY(17);
RadioButton_2.TabOrder := 2;

Page.OnNextButtonClick := @Page_NextButtonClick;
Page.OnCancelButtonClick := @Page_CancelButtonClick;

Result := Page.ID;
end;

procedure InitializeWizard();
begin
if RegQueryStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1','UninstallString', Uninstall) then
CheckInstalledPage(wpLicense);
///Если параметр регистра присутствует, будет создана новая страница
end;
для моей проги как раз то что надо, идеально ) думаю тихий режим полегче сделать
 
Последнее редактирование:

Natrix

Новичок
Косой, Спасибо, с удалением остатков помогло.
_________________________________________________________________________________________________________________________________
Код:
function NextButtonClick(CurPage: Integer): Boolean;
var
s:string;
begin
Result:=True;
If CurPage=6 then
begin
if FileExists(ExpandConstant('{app}')+'\1.exe') and not FileExists(ExpandConstant('{app}')+'\2.exe') then
begin
s:='В '+ExpandConstant('{app}')+' файл name.exe не найден.';
MsgBox(s, mbError, mb_Ok);
Result:=False;
end;
end;
end;
Ошибок нет, но файлы не проверяет.
Код:
if FileExists(ExpandConstant('{app}')+'\1.exe') then
И такой вариант не работает. Может мне ещё какую строку надо было изменить?
_________________________________________________________________________________________________________________________________

Косой, Awalder, По третьему вопросу без реестра ни как? Просто не совсем понимаю, если известен полный путь и имя файла, то всё равно без указания ключа реестра исполняемый файл, до установки, не запустить?
 
Последнее редактирование:

Косой

Новичок
При такой записи:
if FileExists(ExpandConstant('{app}')+'\1.exe') and not FileExists(ExpandConstant('{app}')+'\2.exe') then
файлы будут проверяться только если 1.exe существует и 2.ехе не существует (то есть, оба условия выполняются), при любых других раскладах срабатывать не будет. Если же нужно, чтоб проверка срабатывала при любом из одного условия (то есть, нет 2.ехе, но есть 1.ехе - срабатывает; нет обоих - срабатывает), то вместо and используй or.

По "третьему" вопросу: без ключа реестра можно обойтись, если инсталлятор уже знает путь установки (переменную App, то есть, начиная со страницы выбора пути установки), то можно как-то так:
var
ResultCode: Integer;
................................
if FileExists(ExpandConstant('{app}')+'\unins000.exe') then
begin
Exec(ExpandConstant('{app}\unins000.exe'),'','',SW_HIDE,ewNoWait,ResultCode);
end;
 

Natrix

Новичок
Косой,
Всё заработало. Спасибо вам большое, уже в который раз выручаете.
_________________________________________________________________________________________________________________________________

Назрел параллельный вопрос,
а можно ли в:
Код:
var
ResultCode: Integer;
if FileExists(ExpandConstant('{app}')+'\unins000.exe') then
begin
Exec(ExpandConstant('{app}\unins000.exe'),'','',SW_HIDE,ewNoWait,ResultCode);
end;
Добавить своё сообщение вместо стандартного:
Вы действительно хотите удалить Name и все компоненты программы?
На что-то вроде:
Перед установкой необходимо удалить предыдущую версию!
Хотите удалить и продолжить установку?

В этой функции для второго события, можно реализовать другое сообщение? Т.е. что бы для каждого события было своё сообщение:
Код:
function NextButtonClick(CurPage: Integer): Boolean;
var
s:string;
begin
Result:=True;
If CurPage=6 then
begin
if FileExists(ExpandConstant('{app}')+'\1.exe') or not FileExists(ExpandConstant('{app}')+'\2.exe') then
begin
s:='В '+ExpandConstant('{app}')+' файл name.exe не найден.';
MsgBox(s, mbError, mb_Ok);
Result:=False;
end;
end;
end
 
Последнее редактирование:

nik1967

Old Men
Проверенный
Добавить своё сообщение вместо стандартного:
Вы действительно хотите удалить Name и все компоненты программы?
На что-то вроде:
Перед установкой необходимо удалить предыдущую версию!
Хотите удалить и продолжить установку?
Код:
[Setup]
AppName = MyApp
AppVerName = MyApp
DefaultDirname = {pf}\MyApp
OutputDir=.

[Messages]
ConfirmUninstall=Перед установкой необходимо удалить предыдущую версию!%nХотите удалить и продолжить установку?
 

Awalder

Новичок
При такой записи:


По "третьему" вопросу: без ключа реестра можно обойтись, если инсталлятор уже знает путь установки (переменную App, то есть, начиная со страницы выбора пути установки), то можно как-то так:
var
ResultCode: Integer;
................................
if FileExists(ExpandConstant('{app}')+'\unins000.exe') then
begin
Exec(ExpandConstant('{app}\unins000.exe'),'','',SW_HIDE,ewNoWait,ResultCode);
end;
главное, чтобы там какой то аналогичный деинсталлятор с этим же именем не находился) Тогда точно без реестра никак.
 

Natrix

Новичок
nik1967, Спасибо.
Awalder, Косой, Спасибо, учту.
_________________________________________________________________________________________________________________________________

В этой функции для второго события, можно реализовать другое сообщение? Т.е. что бы для каждого события было своё сообщение:
Код:
function NextButtonClick(CurPage: Integer): Boolean;
var
s:string;
begin
Result:=True;
If CurPage=6 then
begin
if FileExists(ExpandConstant('{app}')+'\1.exe') or not FileExists(ExpandConstant('{app}')+'\2.exe') then
begin
s:='В '+ExpandConstant('{app}')+' файл name.exe не найден.';
MsgBox(s, mbError, mb_Ok);
Result:=False;
end;
end;
end
 
Последнее редактирование:

Косой

Новичок
nik1967, наверное, имеется в виду if FileExists(ExpandConstant('{app}')+'\1.exe') - первое событие, а not FileExists(ExpandConstant('{app}')+'\2.exe') - второе событие:).
 

Natrix

Новичок
nik1967, Косой, посыл ясен.

__________________________________________________________Всем спасибо.__________________________________________________________
 
Сверху