Автор: VlVlV
Дата сообщения: 16.01.2013 09:56
Пожалуйста, помогите адаптировать старый скрипт к новой версии ИС.
Суть в том, чтобы можно было устанавливать без перезагрузки поверх запущенной программы любое количество раз (многие файлы заблокированы). Этот скрипт писал давно, и в старой версии ИС он прекрасно работает, а в самой новой он не выполняет ничего, что от него требуется. Подставлял мсгбоксы в разные места скрипта, и увидел, что идет какая-то задержка передачи аргумента с именем текущего файла. Вместо этого ИС сам пытается удалить файл, естественно не может и выкидывает свое окно: прервать/повтор/пропустить.
Как оказалось, второй скрипт тоже рабочий, просто я запускал готовый инсталятор из под ИС, который у меня портативный, т.е. установка происходила в песочнице, потому и не работало. Удалять не буду, может кому пригодится. Оба скрипта немного доработал.
-----------------------------------------------------------------
inno setup 4.2.7 (все работает)
[Files]
Source: "{app}\1.exe"; DestDir: "{app}"; BeforeInstall: "BeforeFileInstall({app}\1.exe)"; Flags: ignoreversion uninsrestartdelete
Source: "{app}\2.exe"; DestDir: "{app}"; BeforeInstall: "BeforeFileInstall({app}\2.exe)"; Flags: ignoreversion uninsrestartdelete
Source: "{app}\3.dll"; DestDir: "{app}"; BeforeInstall: "BeforeFileInstall({app}\3.dll)"; Flags: ignoreversion uninsrestartdelete
[Code]
var
FileName: String;
TempFileName: String;
TempFileNameFull: String;
ResultCode: Integer;
i: Integer;
procedure BeforeFileInstall(FileNameFull: String);
begin
if FileExists(FileNameFull) then begin
if DeleteFile(FileNameFull) = False then begin
FileName := ExtractFileName(FileNameFull);
if FileName = '2.exe' then begin
InstExec(AddBackslash(ExpandConstant('{app}')) + 'xxx.exe', '/c', '', True, False, SW_SHOW, ResultCode);
end;
if FileName = 'help.chm' then begin
InstExec(AddBackslash(ExpandConstant('{sys}')) + 'taskkill.exe', '/f /im hh.exe', '', True, False, SW_HIDE, ResultCode);
end;
i := 0;
while i < 5 do begin
if DeleteFile(FileNameFull) then
i := 5
else
i := i + 1;
Sleep(1000);
end;
if FileExists(FileNameFull) then begin
TempFileName := ExtractFileName(GenerateUniqueName(FileName, '.tmp'));
TempFileNameFull := AddBackslash(ExtractFilePath(FileNameFull)) + TempFileName;
RenameFile(FileNameFull, TempFileNameFull);
if FileExists(TempFileNameFull) then begin
RegWriteStringValue (HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce', TempFileName, 'cmd /c del ' + AddQuotes(TempFileNameFull));
end;
end;
end;
end;
end;
-----------------------------------------------------------------
inno setup 5.5.2 (ошибок нет, но не работает)
[Files]
Source: "{app}\1.exe"; DestDir: "{app}"; BeforeInstall: "BeforeFileInstall('1.exe')"; Flags: ignoreversion uninsrestartdelete
Source: "{app}\2.exe"; DestDir: "{app}"; BeforeInstall: "BeforeFileInstall('2.exe')"; Flags: ignoreversion uninsrestartdelete
Source: "{app}\3.dll"; DestDir: "{app}"; BeforeInstall: "BeforeFileInstall('3.dll')"; Flags: ignoreversion uninsrestartdelete
Source: "{app}\4.dll"; DestDir: "{app}"; BeforeInstall: "BeforeFileInstall('4.dll')"; Flags: ignoreversion uninsrestartdelete
Source: "{app}\5.dll"; DestDir: "{app}"; BeforeInstall: "BeforeFileInstall('5.dll')"; Flags: ignoreversion uninsrestartdelete
[Code]
procedure BeforeFileInstall(FileNameFull: String);
var
FileName: String;
TempFileName: String;
TempFileNameFull: String;
ResultCode: Integer;
i: Integer;
begin
FileNameFull := AddBackslash(ExpandConstant('{app}')) + FileNameFull;
if FileExists(FileNameFull) then begin
if DeleteFile(FileNameFull) = False then begin
FileName := ExtractFileName(FileNameFull);
if FileName = '2.exe' then begin
Exec(AddBackslash(ExpandConstant('{app}')) + 'xxx.exe', '/c', '', SW_SHOW, ewNoWait, ResultCode);
end;
if FileName = 'help.chm' then begin
Exec(AddBackslash(ExpandConstant('{sys}')) + 'taskkill.exe', '/f /im hh.exe', '', SW_HIDE, ewNoWait, ResultCode);
end;
i := 0;
while i < 5 do begin
if DeleteFile(FileNameFull) then
i := 5
else
i := i + 1;
Sleep(1000);
end;
if FileExists(FileNameFull) then begin
TempFileName := ExtractFileName(GenerateUniqueName(FileName, '.tmp'));
TempFileNameFull := AddBackslash(ExtractFilePath(FileNameFull)) + TempFileName;
RenameFile(FileNameFull, TempFileNameFull);
if FileExists(TempFileNameFull) then begin
RegWriteStringValue (HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce', TempFileName, 'cmd /c del ' + AddQuotes(TempFileNameFull));
end;
end;
end;
end;
end;