Лишний бэкслеш, т.е. надо так -
ExtractArc('{src}\data-1.arc','{app}'); и т.д.
Цитата A1EXXX:
как-то пробовал ваш скрипт FreeArc - вообще не распаковывалось... что я не так делаю? »
|
У меня всё нормально распаковывается...
Цитата A1EXXX:
Окно во время распаковки не кликабельное, т.е. свернуть, переместить нельзя, - это можно как-то исправить??? »
|
При использовании
ewWaitUntilTerminated окно и будет не кликабельным...
Выход из ситуации - это запускать распаковку без ожидания, плюс добавить процедуру в которой проверять в цикле список процессов и если
arc.exe есть, то делать ожидание, скажем 200-300 мс.
Процесс можно проверять через
ISTask.dll или через функцию
IsProgRunning, из этого скрипта (правда работает не на всех версиях Windows):
Пример
Код:

; В Диспетчере задач, вкладка Процессы, присутствует MyProc.exe.
; Как его остановить программно, аналогично тому, как это делает кнопка Завершить процесс в Диспетчере?
; Данный пример показывает, как проверить работает ли программа и если необходимо, то завершить её.
; Не уверен, что будет работать на всех версиях Windows...
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes
VersionInfoCopyright=Serega, serg_0675@mail.ru
[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
[Code]
var
ResultCode: Integer;
function IsProgRunning(ProgName: string): Boolean;
// функция определяет, запущенно ли приложение
var
Size: Integer;
begin
Result:= False;
Exec('cmd', '/c tasklist /fi "IMAGENAME eq ' + ProgName + '" >"' +
ExpandConstant('{tmp}\RunList"'), '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
if FileSize(ExpandConstant('{tmp}\RunList'), Size) then
if Size > 0 then Result:= True;
end;
function CloseProg(ProgName: string; Child: Boolean): Boolean;
// функция завершает работающее приложение со всеми дочерними (Child) процессами
var
Tree: string;
begin
Result:= False;
if Child then Tree:= ' /t' else Tree:= '';
Exec('cmd', '/c taskkill /f' + Tree + ' /im ' + ProgName, '', SW_HIDE,
ewWaitUntilTerminated, ResultCode);
if not IsProgRunning(ProgName) then Result:= True;
end;
function InitializeSetup(): Boolean;
begin
Result:= False;
if Exec(ExpandConstant('{win}\notepad.exe'), '', '', SW_SHOWMINIMIZED, ewNoWait, ResultCode) then
if IsProgRunning('notepad.exe') then
if MsgBox('Обнаружена работающая программа notepad. Закрыть её?',
mbConfirmation, MB_YESNO) = IDYES then
if CloseProg('notepad.exe', True) then
begin
MsgBox('Программа успешно завершена.', mbInformation, MB_OK)
Result:= True;
end
else MsgBox('К сожалению, программу завершить не удалось.', mbInformation, MB_OK);
end;