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

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

Пользователь


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

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


Цитата K.A.V.:
Возможно это защищенный системный процесс »
Да, этот процесс от защитного ПО, поэтому выгружается средствами самой программы вручную. От инсталлятора требуется только определить его наличие, выдать предложение о закрытии, дождаться ручного закрытия и продолжить работу. Все это проделывает без зависания, именно урезанный код, а полный виснет.
Цитата K.A.V.:
вы вырезали тот код, который отвечает за определение наличия процесса... »
В том-то и дело, что процесс определяется без этой части кода...

читать дальше »

Полный код, который приводит к зависанию.

Function EnumProcessCall
StrCmp $R3 "$3" 0 nokill
${KillProcess} "$5" $R4
nokill:
FunctionEnd
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Function GetAccountType
UserInfo::GetAccountType
Pop $1
StrCmp $1 "Admin" okAccountType 0
MessageBox MB_OK|MB_ICONEXCLAMATION `Для установки программы "${PRODUCT_NAME}" необходимо войти в систему с правами Администратора!$\n$\nПрограмма установки завершает свою работу`
quit
okAccountType:
FunctionEnd

Function .onInit
Var /Global CommandLine
!insertmacro GetParametersCall $CommandLine
${GetTime} "" "L" $Day $Month $Year $WeekDay $Hour $Minute $Seconds
StrCpy $TMPDIR "$TEMP\sfxcreator_$Minute$Hour$Seconds"
StrCpy $R0 0
newSearch_1:
${FindProcessName} "AVJF.EXE" $R1 ;Вот же, поиск есть
StrCmp $R1 "1" 0 end_1
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "Для продолжения необходимо выгрузить $\nПожалуйста, закройте приложение самостоятельно.$\n$\nМожете отказаться от установки, нажав кнопку 'Отмена'" idOK +2
quit
${KillProcess} "AVJF.EXE" $R1 ;Эта строчка тоже не нужна
sleep 1000
goto newSearch_1
end_1:
CreateDirectory "$TMPDIR"
call PRE_Function
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Код между \\\\\\\\\\\\\ компилируется без ошибок и дает возможность установщику определить наличие процесса, ждет его ручное закрытие и отрабатывает, далее, без зависаний. Я, когда удалял верхнюю часть, подумал, что она относится только к Убиванию процесса(?), что мне не требовалось.

Может есть этому объяснение...
А может функция определения прав Админа "всунулась" не туда и должна быть над Function EnumProcessCall ? Или это не важно? (Проверил позже, - перемещение ничего не дает)

Проверил все еще раз. Скомпилировал все заново. Полный код виснет. Урезанный работает.

Последний раз редактировалось Salmo, 09-12-2012 в 02:14.


Отправлено: 23:37, 08-12-2012 | #523