Цитата boss911:
Предложу использовать библиотеку KillProc.dll для Inno Setup. »
|
Не понимаю зачем, если это делается стандартными средствами. Ну может быть для кого-то это может оказаться единственно рабочим решением.
Цитата Chudmin:
И всё-таки, у Elchupacabra этот процесс происходит сразу же после запуска инсталятора, КАК? »
|
Ну так всё зависит от того, когда выполняется ваш код. Сколько у вас файлов в секции [Files] и когда они запускаются?
Скорее всего ваши файлы смирно сидят в инсталляторе и терпеливо ждут, пока юзер не пройдёт все этапы, проставит галочки, там создавать ярдыки на рабочем столе, выбирает дополнения, путь установки, а тоько в заключении жмёт кнопку "Установить". Вот тогда и активируется ваша "Моя_прога.exe", а перед её запуском и начинается поиск процесса и его уничтожение.
Чтобы процесс уничтожался сразу при запуске инсталлятора, нужно чтобы у вас в [Files] был бы назначен на
BeforeInstall какой-нибудь файлик, который бы извлекался в %TEMP% именно при запуске инсталлятора, а не по нажатию кнопки "Установить".
Для примера, вы можете прикрепить к инсталлятору Сплэш-заставку и заодно на неё повесить убийцу процесса:
Код:
[Files]
; Файлы Splash-заставки, загружаются первыми
Source: Include\isgsg.dll; DestDir: {tmp}; Flags: dontcopy nocompression; BeforeInstall: TaskKill('Моя_прога.exe')
Source: Include\Splash.png; DestDir: {tmp}; Flags: dontcopy nocompression
В секции [ Code ] объявляете процедуру заставки и процедуру убийцы процесса в самом начале:
Код:
[ Code ]
{ Splash заставка }
procedure ShowSplashScreen(p1:HWND;p2:AnsiString;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer);
external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
procedure TaskKill(FileName: String);var ResultCode: Integer;begin
Exec(ExpandConstant('taskkill.exe'),'/f /im '+'"'+FileName+'"','',SW_HIDE,ewWaitUntilTerminated,ResultCode);end;
Этот код извлечения и запуска заставки вставляете в нужном вам месте. Я её разместил после всей массы программного кода в конец, но перед отрисовкой формы окна:
Код:
{ Splash заставка }
procedure Splash();
begin
ExtractTemporaryFile('Splash.png');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}\Splash.png'),500,800,500,0,255,True,$FFFFFF,10);
end;
И в конце кода инициализируете её:
Код:
procedure InitializeWizard();
begin
Splash();
end;
Таким образом, при запуске программы сразу извлекаются файлы заставки в %TEMP% и запускается заставка перед стартом инсталлятора, но ещё перед этим, запускается убийца процесса, потому что на файл заставки выставлен флаг BeforeInstall.