ISTask

DLL ISTask 1.0.1.0

Нет прав для скачивания

Genri

Знаток
Проверенный
Пользователь Genri разместил новый ресурс:

ISTask - Библиотека для проверки и завершения процесса прлиложения.

Информация:

Описание:
Небольшая библиотека, которая поможет определить запущен ли процесс приложения и завершить его.​
Узнать больше об этом ресурсе...
 

Xabib2302

Новичок
Доброе время суток. Я решил использовать библиотеку для завершения explorer.exe, но код почему то не срабатывает. Кодировка ANSI
 

vint56

Ветеран
Проверенный
Xabib2302, пример но не через istask
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[code]
// только при запуске
//function InitializeSetup(): Boolean;
//var
//errorcode: integer;
//  begin
//  Exec('taskkill',' /f /im explorer.exe', '', SW_Hide, ewWaitUntilTerminated, ErrorCode);
//  Result := True
//end;

// во врем установки
procedure CurStepChanged(CurStep: TSetupStep);
var
  ResultCode:integer;
begin
    if not(CurStep=ssPostInstall) then exit;
    Exec(ExpandConstant('{sys}\taskkill.exe'),'/IM explorer.exe /F','',SW_HIDE,ewWaitUntilTerminated, ResultCode);
    Exec(ExpandConstant('{win}\explorer.exe'),'','',SW_SHOW,ewNoWait, ResultCode);
end;
 
Последнее редактирование:

Awalder

Новичок
Что то не пашет эта фигня
Вроде бы всё работает, причем в игре 3 версии, все корректно завершается если нужно. Единственное, что меня не устраивает, что установку можно продолжить даже при запущенном процессе, не знаю пока как победить, новичок совсем))

[code*]
// Завершение процесса по имени файла
function KillTask(ExeFileName: AnsiString): Integer;
external 'KillTask@files:ISTask.dll stdcall';

// Проверка, запущен ли процесс по имени файла
function RunTask(FileName: AnsiString; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall';
// конец Проверка, запущен ли процесс по имени файла

function InitializeSetup: Boolean;

// поиск запущенного процесса
begin
Result := True;
if RunTask('age3y.exe', False) then
if MsgBox('Закрыть The Asian Dynasties? Если НЕТ, то корректная установка {#MyAppVersion} не гарантируется', mbConfirmation, MB_YESNO) = IDYES then
KillTask('age3y.exe')
else
Result := False;

begin
Result := True;
if RunTask('age3x.exe', False) then
if MsgBox('Закрыть The War Chiefs? Если НЕТ, то корректная установка {#MyAppVersion} не гарантируется', mbConfirmation, MB_YESNO) = IDYES then
KillTask('age3x.exe')
else
Result := False;

begin
Result := True;
if RunTask('age3.exe', False) then
if MsgBox('Закрыть Age of Empires III? Если НЕТ, то корректная установка {#MyAppVersion} не гарантируется', mbConfirmation, MB_YESNO) = IDYES then
KillTask('age3.exe')
else
Result := False;
end;
 

Kotyarko_O

Новичок
Единственное, что меня не устраивает, что установку можно продолжить даже при запущенном процессе
И правильно (исходя из кода).
- Результату присваивается True.
-- Если процесс "age3y.exe" запущен - выдаётся MsgBox. Ответ пользователя положительный - процесс завершается; ответ отрицательный - результату присваивается False.
- Результату присваивается True.
-- Если процесс "age3x.exe" запущен - выдаётся MsgBox. Ответ пользователя положительный - процесс завершается; ответ отрицательный - результату присваивается False.
- Результату присваивается True.
-- Если процесс "age3.exe" запущен - выдаётся MsgBox. Ответ пользователя положительный - процесс завершается; ответ отрицательный - результату присваивается False.
То есть, при первых двух проверках (age3y и age3x) результат всегда будет True, так как в третьей ему принудительно это и присваивается. Установка не продолжится только в третьем случае (если ответ MsgBox`а будет положительный).

Так что, правильнее будет так:
Код:
Function InitializeSetup(): Boolean;
begin
 Result := True;
 if RunTask('age3y.exe', False) then
 begin
  if MsgBox('Закрыть The Asian Dynasties? Если НЕТ, то корректная установка {#MyAppVersion} не гарантируется', mbConfirmation, MB_YESNO) = IDYES then
   KillTask('age3y.exe')
  else
   Result := False;
 end else
 if RunTask('age3x.exe', False) then
 begin
  if MsgBox('Закрыть The War Chiefs? Если НЕТ, то корректная установка {#MyAppVersion} не гарантируется', mbConfirmation, MB_YESNO) = IDYES then
   KillTask('age3x.exe')
  else
   Result := False;
 end else
 if RunTask('age3.exe', False) then
 begin
  if MsgBox('Закрыть Age of Empires III? Если НЕТ, то корректная установка {#MyAppVersion} не гарантируется', mbConfirmation, MB_YESNO) = IDYES then
   KillTask('age3.exe')
  else
   Result := False;
 end;
end;
 

Awalder

Новичок
я
И правильно (исходя из кода).
- Результату присваивается True.
-- Если процесс "age3y.exe" запущен - выдаётся MsgBox. Ответ пользователя положительный - процесс завершается; ответ отрицательный - результату присваивается False.
- Результату присваивается True.
-- Если процесс "age3x.exe" запущен - выдаётся MsgBox. Ответ пользователя положительный - процесс завершается; ответ отрицательный - результату присваивается False.
- Результату присваивается True.
-- Если процесс "age3.exe" запущен - выдаётся MsgBox. Ответ пользователя положительный - процесс завершается; ответ отрицательный - результату присваивается False.
То есть, при первых двух проверках (age3y и age3x) результат всегда будет True, так как в третьей ему принудительно это и присваивается. Установка не продолжится только в третьем случае (если ответ MsgBox`а будет положительный).

Так что, правильнее будет так:
Код:
Function InitializeSetup(): Boolean;
begin
Result := True;
if RunTask('age3y.exe', False) then
begin
  if MsgBox('Закрыть The Asian Dynasties? Если НЕТ, то корректная установка {#MyAppVersion} не гарантируется', mbConfirmation, MB_YESNO) = IDYES then
   KillTask('age3y.exe')
  else
   Result := False;
end else
if RunTask('age3x.exe', False) then
begin
  if MsgBox('Закрыть The War Chiefs? Если НЕТ, то корректная установка {#MyAppVersion} не гарантируется', mbConfirmation, MB_YESNO) = IDYES then
   KillTask('age3x.exe')
  else
   Result := False;
end else
if RunTask('age3.exe', False) then
begin
  if MsgBox('Закрыть Age of Empires III? Если НЕТ, то корректная установка {#MyAppVersion} не гарантируется', mbConfirmation, MB_YESNO) = IDYES then
   KillTask('age3.exe')
  else
   Result := False;
end;
end;
я неточно выразился. В моей игре может одновременно работать одно из приложений ( оригинал или любой из двух аддонов) Устанавливая мод - любой из 3х работающих процессов нормально закрывается. Однако если не убить процесс, нажав НЕТ, - инсталлятор продолжает работу на фоне приложения, что по сути неправильно. Влияют ли както библиотеки IsSkin, botva на этот процесс?
То же самое и с процедурой Initialize Setup. Вроде бы прописано условие что если игра не найдена - то инсталлятор должен прекратить работу ( вроде бы так и было, пока инсталл был самым простейшим). Сейчас сообщение о том что игра не найдена - инсталлом игнорится, хз почему
 

Awalder

Новичок
с
И правильно (исходя из кода).
- Результату присваивается True.
-- Если процесс "age3y.exe" запущен - выдаётся MsgBox. Ответ пользователя положительный - процесс завершается; ответ отрицательный - результату присваивается False.
- Результату присваивается True.
-- Если процесс "age3x.exe" запущен - выдаётся MsgBox. Ответ пользователя положительный - процесс завершается; ответ отрицательный - результату присваивается False.
- Результату присваивается True.
-- Если процесс "age3.exe" запущен - выдаётся MsgBox. Ответ пользователя положительный - процесс завершается; ответ отрицательный - результату присваивается False.
То есть, при первых двух проверках (age3y и age3x) результат всегда будет True, так как в третьей ему принудительно это и присваивается. Установка не продолжится только в третьем случае (если ответ MsgBox`а будет положительный).

Так что, правильнее будет так:
Код:
Function InitializeSetup(): Boolean;
begin
Result := True;
if RunTask('age3y.exe', False) then
begin
  if MsgBox('Закрыть The Asian Dynasties? Если НЕТ, то корректная установка {#MyAppVersion} не гарантируется', mbConfirmation, MB_YESNO) = IDYES then
   KillTask('age3y.exe')
  else
   Result := False;
end else
if RunTask('age3x.exe', False) then
begin
  if MsgBox('Закрыть The War Chiefs? Если НЕТ, то корректная установка {#MyAppVersion} не гарантируется', mbConfirmation, MB_YESNO) = IDYES then
   KillTask('age3x.exe')
  else
   Result := False;
end else
if RunTask('age3.exe', False) then
begin
  if MsgBox('Закрыть Age of Empires III? Если НЕТ, то корректная установка {#MyAppVersion} не гарантируется', mbConfirmation, MB_YESNO) = IDYES then
   KillTask('age3.exe')
  else
   Result := False;
end;
end;
спасибо, посмотрю. Вначале не полностью прочёл
 

Awalder

Новичок
И правильно (исходя из кода).
Так что, правильнее будет так:
[/code]
Спасибо за подсказку, в итоге заработал такой вариант:
begin
If RunTask('age3y.exe', false) then
begin
if MsgBox('В данный момент приложение The Asian Dynasties используется. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
begin
KillTask('age3y.exe');
Result:= True;
end else
Exit;
end;
Result:=True;
остальные процессы аналогично.
Возник ещё один вопрос - как сделать сообщения , которые выдаёт инсталлятор в одном стиле с используемым скином? У меня скин чёрный, а сообщения обычные.
 

SBalykov

Старожил
Возник ещё один вопрос - как сделать сообщения , которые выдаёт инсталлятор в одном стиле с используемым скином? У меня скин чёрный, а сообщения обычные.
Создавать свой MsgBox и прикручивать его к скину до InitializeSetup ...
 

SBalykov

Старожил
подробнее? Или где в справке почитать. Это типа кастомный MsgBox?
Что- то вроде этого.
Как вариант, создать свою форму сообщений и ее вызывать вместо MsgBox ...
P.S. Вот только ISTask не работает с 64-битными процессами. Если запущено 64-битное приложение, то ISTask не сможет его остановить.
Поэтому, лучше использовать то, что предложил выше, vint56.
Правда и в этом случае получается не идеальный вариант, так как отсутствует возможность предупредить пользователя о закрытии приложения ...
 
Последнее редактирование:

Kotyarko_O

Новичок
Возник ещё один вопрос - как сделать сообщения , которые выдаёт инсталлятор в одном стиле с используемым скином? У меня скин чёрный, а сообщения обычные.
Загружать скин в начале InitializeSetup().

Поэтому, лучше использовать то, что предложил выше, vint56.
Правда и в этом случае получается не идеальный вариант, так как отсутствует возможность предупредить пользователя о закрытии приложения ...
Можно использовать FindWindowByWindowName (опираясь на него вызывать MsgBox). А по ответу пользователя уже делать какие-либо действия.
 

SBalykov

Старожил
Можно использовать FindWindowByWindowName (опираясь на него вызывать MsgBox). А по ответу пользователя уже делать какие-либо действия.
Спасибо за подсказку. Все как доктор прописал.
Правда, все-таки создал форму сообщения, чтобы не выбиваться из общего стиля.
Может кому пригодится ...
Код:
function InitializeSetup: Boolean;
var wnd: HWND;
begin
if Cl then begin Result := False;
end else begin Result := True;
ShowWindow(Application.Handle, 0);
wnd := (FindWindowByWindowName('{#NAME}') or FindWindowByWindowName('{#NAME_DE}') or FindWindowByWindowName('{#NAME_ES}') or
FindWindowByWindowName('{#NAME_FR}') or FindWindowByWindowName('{#NAME_NL}'));
if wnd <> 0 then begin
MyMessageBox;
if MessageForm.ShowModal = mrYes then begin
if not isWin64 then
Exec('taskkill', '/f /im TS4.exe', '', 0, ewWaitUntilTerminated, ErrorCode) else
Exec('taskkill', '/f /im TS4_x64.exe', '', 0, ewWaitUntilTerminated, ErrorCode);
end else Result := False;
end;
end;
end;
 
Последнее редактирование:

Awalder

Новичок
При удалении приложения как эту библиотеку задействовать?
 

SBalykov

Старожил
При удалении приложения как эту библиотеку задействовать?
Примерно так:
Код:
[Setup]
AppName=Моя программа
AppVersion=1.5
DefaultDirName={pf}\Моя программа
DefaultGroupName=Моя программа
OutputDir=.

[Languages]
Name: "rus"; MessagesFile: "compiler:Languages\Russian.isl"

[Files]
Source: "ISTask.dll"; DestDir: "{app}";

[Code]
// Завершение процесса по имени файла
function KillTaskU(ExeFileName: AnsiString): Integer; external 'KillTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';;

// Проверка, запущен ли процесс по имени файла
function RunTaskU(FileName: AnsiString; bFullpath: Boolean): Boolean; external 'RunTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';

// Инициализация удаления
function InitializeUninstall: Boolean;
begin
RenameFile(ExpandConstant('{app}\ISTask.dll'), ExpandConstant('{tmp}\ISTask.dll'));
if RunTaskU('notepad.exe', False) then
// При удалении программы сообщение о запущенном приложении можно проигнорировать
//if MsgBox('Закрыть Блокнот?', mbConfirmation, MB_YESNO) = IDYES then
KillTaskU('notepad.exe')
//else
//Result := False;
end;
 
Последнее редактирование:
Сверху