Как закрыть программу inno setup

Я хочу убить процесс с помощью inno setup. Я хочу проверить, открыто ли окно, прежде чем я начну установку установки.

могу я сделать это, выполнив поиск по имени окна? пожалуйста, помогите мне с примером кода, чтобы убить процесс

Может быть, достаточно простого мьютекса? Добавьте мьютекс в свое приложение, а затем используйте AppMutex Параметр в Setup раздел. — Andreas Rejbrand

4 ответы

в разделе [UninstallRun] вы можете добавить следующий код:

Filename: taskkill.exe; Parameters: «/f /im MyProcess.exe»; Flags: skipifdoesntexist runhidden

Почему [UninstallRun]? OP хотел убить процесс перед запуском установки. Разве [UninstallRun] не вызывается при запуске программы удаления? — побережье

Я сделал это, чтобы предложить пользователю закрыть программу, если она была обнаружена.

function CheckProcessRunning( aProcName, aProcDesc: string ): boolean; var ShellResult: boolean; ResultCode: integer; cmd: string; sl: TStringList; f: string; d: string; begin cmd := ‘for /f «delims=,» %%i ‘ + ‘in (»tasklist /FI «IMAGENAME eq ‘ + aProcName + ‘» /FO CSV») ‘ + ‘do if «%%~i»==»‘ + aProcName + ‘» exit 1’; f := ‘CheckProc.cmd’; d := AddBackSlash( ExpandConstant( » )); sl := TStringList.Create; sl.Add( cmd ); sl.Add( ‘exit /0’ ); sl.SaveToFile( d + f ); sl.Free; Result := true; while ( Result ) do begin ResultCode := 1; ShellResult := Exec( f, », d, SW_HIDE, ewWaitUntilTerminated, ResultCode ); Result := ResultCode > 0; if Result and ( MsgBox( aProcDesc + ‘ is running. This program must be closed to continue.’#13#10 + ‘Please close it and click Yes to retry or click No to cancel this installer.’, mbConfirmation, MB_YESNO ) <> IDYES ) then Break; end; DeleteFile( d + f ); end;

Я использовал его в следующих специальных разделах кода:

Як зробити installer для програми / Inno Setup Compiler


// Perform some initializations. Return False to abort setup function InitializeSetup: Boolean; begin // Do not use any user defined vars in here such as InitializeGlobals; Result := not ( CheckProcessRunning( ‘bcb.exe’, ‘C++ Builder’ ) or CheckProcessRunning( ‘delphi32.exe’, ‘Delphi’ ) or CheckProcessRunning( ‘bds.exe’, ‘Rad Studio’ )); end; function InitializeUninstall: Boolean; begin InitializeGlobals; Result := not ( CheckProcessRunning( ‘bcb.exe’, ‘C++ Builder’ ) or CheckProcessRunning( ‘delphi32.exe’, ‘Delphi’ ) or CheckProcessRunning( ‘bds.exe’, ‘Rad Studio’ )); end;

ответ дан 23 мая ’13, 21:05

Читайте также:
Навигационные программы на планшет для Андроид

Источник: stackovergo.com

Inno Setup: как прервать/завершить настройку во время установки?

Во время моей установки я запускаю файл bat. Если файл bat возвращает ошибку, мне нужно прервать/завершить настройку. Я хотел бы, чтобы он сделал MsgBox , чтобы сообщить пользователю, что произошло, а затем, чтобы прервать, чтобы выглядеть и действовать, как пользователь нажал кнопку «Отмена».

Inno Setup или как создать свой установщик?

Можно ли прервать/завершить настройку?

Примеры кода были бы действительно оценены.

[Run] Filename: test.bat; WorkingDir: ; Flags: waituntilterminated runhidden

ОТВЕТЫ

Ответ 1

Проблема заключается в том, что [Run] происходит после успешного завершения процесса установки. Таким образом, вы не можете отменить на этом этапе, вы можете удалить его.

Кроме того, [Run] не позволяет получить код выхода.

Итак, у вас есть несколько вариантов.

Использовать событие: procedure CurStepChanged(CurStep: TSetupStep);

И вызов test.bat с помощью Exec или ExecAsOriginalUser , оба из них возвращают ResultCode. Затем вы можете попросить пользователя удалить.

Однако я думаю, что выполнение отмена будет проще.

Чтобы сделать это, создайте событие AfterInstall в последнем файле в вашем проекте. И запустите программу из этого события, так как вы можете отменить это событие.

Вот пример кода, который показывает, как это можно сделать.

[Files] Source: «MYPROG.EXE»; DestDir: «»; AfterInstall: MyAfterInstall [Code] procedure MyAfterInstall(); var ResCode : Integer; begin if Exec(ExpandConstant(») + ‘test.bat’, », SW_HIDE, ewWaitUntilTerminated, ResCode) then begin < Program Ran successfully ResCode now contains exit code results > < if Exit was 10 then Cancel Installation. >if ResCode = 10 then begin WizardForm.Close; end; end else begin < Problem running Program >MsgBox(‘Error’, SysErrorMessage(ResCode), mbError, MB_OK); end; end;

Ответ 2

Спасибо, Роберт.

Это обычная проблема, возникающая в любое время, когда script обнаруживает, что настройка не может быть продолжена. Однако в вашем решении есть проблема. WizardForm.Close вызывает диалог отмены, и установка останавливается, только если пользователь отвечает «Да». Чтобы окончательно выйти, мы должны вызвать CancelButtonClick.

[Files] Source: «MYPROG.EXE»; DestDir: «»; AfterInstall: MyAfterInstall [Code] var CancelWithoutPrompt: boolean; function InitializeSetup(): Boolean; begin CancelWithoutPrompt := false; result := true; end; procedure MyAfterInstall(); begin (Do something) if BadResult then begin MsgBox(‘Should cancel because. ‘,mbError,MB_OK) CancelWithoutPrompt := true; WizardForm.Close; end; end; procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean); begin if CurPageID=wpInstalling then Confirm := not CancelWithoutPrompt; end;

Читайте также:
Как пользоваться программой hp USB disk storage format tool

Ответ 3

Просто закруглите другие возможности:

Если вы можете проверить условие предварительного условия перед тем, как собрать какую-либо информацию от пользователя, то лучшее место для проверки — в функции InitializeSetup . Это позволяет вам отображать MsgBox , а затем выйти с помощью Result := False , чтобы прервать установку.

Если вам нужно сначала собрать некоторую информацию от пользователя (например, каталог установки), но все же проверить условие без установки каких-либо файлов (кроме, возможно, нескольких через ExtractTemporaryFile ), то лучшее место в PrepareToInstall . Это позволяет вам отображать сообщение об ошибке (путем его возврата), после чего пользователь может либо вернуться, либо исправить что-либо, либо выйти из самой установки.

Если условие, которое вы проверяете, относится конкретно к выбору пользователя на определенной странице (опять же, например, к целевому каталогу), и вы можете быстро и без каких-либо изменений изменить систему пользователя, тогда лучше всего обрабатывать это в NextButtonClick ; вы можете отобразить MsgBox с ошибкой, а затем вернуть False , чтобы предотвратить переход на следующую страницу.

Если вам нужно подождать до тех пор, пока не установите все остальное, то это слишком поздно, чтобы выйти из установки, но если вы хотите это сделать, тогда ответ Роберта будет достаточным.

Ответ 4

Я использовал код из ответов здесь, чтобы составить полное решение, чтобы безопасно выполнять команды в разделе [Run] с надлежащим уведомлением и откатом при ошибке.

Источник: utyatnishna.ru

Как завершить процесс с помощью inno setup?

Я хочу убить процесс с помощью inno setup. Я хочу проверить, открыто ли окно, прежде чем я начну установку установки.

Могу я сделать это, выполнив поиск по имени окна? пожалуйста, помогите мне с примером кода, чтобы убить процесс

Nithin 27 Окт 2011 в 17:51

Возможно, будет достаточно простого решения для мьютекса? Добавьте мьютекс в свое приложение, а затем используйте параметр AppMutex в разделе Setup .

Andreas Rejbrand
27 Окт 2011 в 19:00

4 ответа

Лучший ответ

Лучше всего использовать мьютекс, чтобы проверить, работает ли он по-прежнему с помощью AppMutex . Один из способов закрыть его — найти дескриптор окна, а затем просто опубликовать простое сообщение WM_CLOSE.

Существуют и другие варианты, такие как расширение используемых файлов и PSVince

Также см. эту статью для получения дополнительной информации.

Deanna 27 Окт 2011 в 20:39

Читайте также:
Что называется файлом в прикладной программе

Begin Wnd := FindWindowByWindowName(‘имя’); если Wnd <> 0, то SendMessage(Wnd, WM_CLOSE, 0, 0); Результат := Истина;. я пробовал так. все работает нормально, но я хочу закрыть окно в трее. как выйти из этого окна

28 Окт 2011 в 08:29

[UninstallRun] Имя файла: ; параметры: /c taskkill /f /im notepad.exe;флаги: runhidden.можно ли мне сделать так?

28 Окт 2011 в 09:44

Не убивайте его сразу, так как это может вызвать проблемы. Используйте скрытое окно и метод FindWindow, чтобы уведомить его о закрытии.

28 Окт 2011 в 11:46

В разделе [UninstallRun] вы можете добавить следующий код:

Filename: taskkill.exe; Parameters: «/f /im MyProcess.exe»; Flags: skipifdoesntexist runhidden
jrm 2 Сен 2014 в 10:33

Почему [UninstallRun]? ОП хотел убить процесс перед запуском установки. Разве [UninstallRun] не вызывается при запуске программы удаления?

15 Май 2019 в 00:36

Я сделал это, чтобы предложить пользователю закрыть программу, если она была обнаружена.

function CheckProcessRunning( aProcName, aProcDesc: string ): boolean; var ShellResult: boolean; ResultCode: integer; cmd: string; sl: TStringList; f: string; d: string; begin cmd := ‘for /f «delims=,» %%i ‘ + ‘in (»tasklist /FI «IMAGENAME eq ‘ + aProcName + ‘» /FO CSV») ‘ + ‘do if «%%~i»==»‘ + aProcName + ‘» exit 1’; f := ‘CheckProc.cmd’; d := AddBackSlash( ExpandConstant( » )); sl := TStringList.Create; sl.Add( cmd ); sl.Add( ‘exit /0’ ); sl.SaveToFile( d + f ); sl.Free; Result := true; while ( Result ) do begin ResultCode := 1; ShellResult := Exec( f, », d, SW_HIDE, ewWaitUntilTerminated, ResultCode ); Result := ResultCode > 0; if Result and ( MsgBox( aProcDesc + ‘ is running. This program must be closed to continue.’#13#10 + ‘Please close it and click Yes to retry or click No to cancel this installer.’, mbConfirmation, MB_YESNO ) <> IDYES ) then Break; end; DeleteFile( d + f ); end;

Я использовал его в следующих специальных разделах кода:

// Perform some initializations. Return False to abort setup function InitializeSetup: Boolean; begin // Do not use any user defined vars in here such as InitializeGlobals; Result := not ( CheckProcessRunning( ‘bcb.exe’, ‘C++ Builder’ ) or CheckProcessRunning( ‘delphi32.exe’, ‘Delphi’ ) or CheckProcessRunning( ‘bds.exe’, ‘Rad Studio’ )); end; function InitializeUninstall: Boolean; begin InitializeGlobals; Result := not ( CheckProcessRunning( ‘bcb.exe’, ‘C++ Builder’ ) or CheckProcessRunning( ‘delphi32.exe’, ‘Delphi’ ) or CheckProcessRunning( ‘bds.exe’, ‘Rad Studio’ )); end;

Источник: question-it.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru