Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


Сообщения: 1133
Благодарности: 581

Профиль | Отправить PM | Цитировать


Цитата A1EXXX:
Помогите разобраться: »
Лишний бэкслеш, т.е. надо так - 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;

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:07, 23-11-2009 | #475