1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

DLL ISTask 1.0.1.0

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

  1. Знаток Проверенный

    Регистрация:
    8 фев 2012
    Сообщения:
    1
    Симпатии:
    2
    Пользователь Genri разместил новый ресурс:

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

    Узнать больше об этом ресурсе...
     
    YURSHAT и Awalder нравится это.
  2. Ветеран

    Регистрация:
    28 май 2013
    Сообщения:
    38
    Симпатии:
    4
    Доброе время суток. Я решил использовать библиотеку для завершения explorer.exe, но код почему то не срабатывает. Кодировка ANSI
     
  3. Ветеран Проверенный

    Регистрация:
    18 июн 2011
    Сообщения:
    703
    Симпатии:
    494
    Xabib2302, пример но не через istask
    Код (Text):
    [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;
     
    Последнее редактирование: 23 июл 2015
    SBalykov нравится это.
  4. Новичок

    Регистрация:
    27 апр 2016
    Сообщения:
    1
    Симпатии:
    0
    Пол:
    Мужской
    Что то не пашет эта фигня
     
  5. Пользователь

    Регистрация:
    16 фев 2016
    Сообщения:
    62
    Симпатии:
    9
    Пол:
    Мужской
    Вроде бы всё работает, причем в игре 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;
     
  6. Старожил

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

    Так что, правильнее будет так:
    Код (Inno):

    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 нравится это.
  7. Пользователь

    Регистрация:
    16 фев 2016
    Сообщения:
    62
    Симпатии:
    9
    Пол:
    Мужской
    я
    я неточно выразился. В моей игре может одновременно работать одно из приложений ( оригинал или любой из двух аддонов) Устанавливая мод - любой из 3х работающих процессов нормально закрывается. Однако если не убить процесс, нажав НЕТ, - инсталлятор продолжает работу на фоне приложения, что по сути неправильно. Влияют ли както библиотеки IsSkin, botva на этот процесс?
    То же самое и с процедурой Initialize Setup. Вроде бы прописано условие что если игра не найдена - то инсталлятор должен прекратить работу ( вроде бы так и было, пока инсталл был самым простейшим). Сейчас сообщение о том что игра не найдена - инсталлом игнорится, хз почему
     
  8. Пользователь

    Регистрация:
    16 фев 2016
    Сообщения:
    62
    Симпатии:
    9
    Пол:
    Мужской
    с
    спасибо, посмотрю. Вначале не полностью прочёл
     
  9. Пользователь

    Регистрация:
    16 фев 2016
    Сообщения:
    62
    Симпатии:
    9
    Пол:
    Мужской
    Спасибо за подсказку, в итоге заработал такой вариант:
    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;
    остальные процессы аналогично.
    Возник ещё один вопрос - как сделать сообщения , которые выдаёт инсталлятор в одном стиле с используемым скином? У меня скин чёрный, а сообщения обычные.
     
  10. Ветеран

    Регистрация:
    31 мар 2015
    Сообщения:
    275
    Симпатии:
    130
    Пол:
    Мужской
    Создавать свой MsgBox и прикручивать его к скину до InitializeSetup ...
     
    Awalder нравится это.
  11. Пользователь

    Регистрация:
    16 фев 2016
    Сообщения:
    62
    Симпатии:
    9
    Пол:
    Мужской
    подробнее? Или где в справке почитать. Это типа кастомный MsgBox?
     
  12. Ветеран

    Регистрация:
    31 мар 2015
    Сообщения:
    275
    Симпатии:
    130
    Пол:
    Мужской
    Что- то вроде этого.
    Как вариант, создать свою форму сообщений и ее вызывать вместо MsgBox ...
    P.S. Вот только ISTask не работает с 64-битными процессами. Если запущено 64-битное приложение, то ISTask не сможет его остановить.
    Поэтому, лучше использовать то, что предложил выше, vint56.
    Правда и в этом случае получается не идеальный вариант, так как отсутствует возможность предупредить пользователя о закрытии приложения ...
     
    Последнее редактирование: 11 май 2016
  13. Старожил

    Регистрация:
    14 авг 2014
    Сообщения:
    72
    Симпатии:
    34
    Пол:
    Мужской
    Загружать скин в начале InitializeSetup().

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

    Регистрация:
    16 фев 2016
    Сообщения:
    62
    Симпатии:
    9
    Пол:
    Мужской
    Спасибо! Все проще чем я думал :)
     
  15. Ветеран

    Регистрация:
    31 мар 2015
    Сообщения:
    275
    Симпатии:
    130
    Пол:
    Мужской
    Спасибо за подсказку. Все как доктор прописал.
    Правда, все-таки создал форму сообщения, чтобы не выбиваться из общего стиля.
    Может кому пригодится ...
    Код (Inno):

    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;
     
    Последнее редактирование: 11 май 2016
    Awalder нравится это.
  16. Пользователь

    Регистрация:
    16 фев 2016
    Сообщения:
    62
    Симпатии:
    9
    Пол:
    Мужской
    При удалении приложения как эту библиотеку задействовать?
     
  17. Ветеран

    Регистрация:
    31 мар 2015
    Сообщения:
    275
    Симпатии:
    130
    Пол:
    Мужской
    Примерно так:
    Код (Inno):

    [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;
     
    Последнее редактирование: 13 май 2016

Поделиться этой страницей