alexii пишет:Завис — это вряд ли, просто его окно скрыто
Почему вряд ли ? - Скрыто-то оно скрыто, но он и Завис - скажем, в цикле проверки какой-ни готовности . У меня, например, эта страница идет с WEB конфигуратора глюкаватого рутера, работа IE с которым может с чем угодно столкнуться...
Если у Вас есть какой-либо адрес, на котором можно поглядеть — попробую.
Адреса нет, могу только соус страницы выложить, м.б. поймете что из ее скриптов, в котроых я не разбираюсь .
Попробуйте в этом месте поставить два цикла ожидания с !(ie.busy) + ie.ReadyState=4. То есть, сначала один, затем паузу на x*100 мс, затем ещё один. Пропадёт эта ошибка?
Да не, не пропадает, точнее - не могу локализовать, когда же она появляется, И не могу понять - как нужно обрабатывать нажатие клавиш Подключения для вышеприведенной страницы. Я уже вот такую штуку замутил, ( есть, правда, сомнения , кодга ie.Busy когда ie.ReadyState нужно анализировать , у меня пока ReadyState всегда 4 ) :
Function ieBusy(ie,ByVal TimeOut,ByRef Descr) 'SHDocVw.InternetExplorer
' TimeOut=0 - Ждать бесконечно до готовности
' =N - Ждать готовности, ( в цикле на 100 msec передавая управление другим) не более N sec ,
' после чего возвратить состояние IE в функции..
' ="T0;T1;T2;T3" - проверка готовности(незанятости) на вшивость
' - Ждать готовности не более T0 sec(или при T0=0 - бесконечно дтпп не будет незанятости) ,
' Если в течении T0 msec обнаружится готовность, то
' еще через T1>0 sec проверить ее T2 раз с T3 msec перерывом(при T2=1 перерыв T3 не важен),
' Это придумано на случай, когда в течении T1 msec после первой готовности IE может еще не не раз терять готовность.
' T2,T3 - м.б. опущены, тогда предполагается T2=2,T3=50
' Например : ieBusy ie,"60;5;4;100" - ждать готовности не более 60сек,после чего через 5 сек 4 раза с периодом 100msec ее проверить.
' N,T0,T1 - м.б. дробными с разделитем "." или ","
' Descr - Если не пустой, то при невозможности дождаться незанятости , выполнение прерывается с сообщением, которое
' содержит Descr.
' Если пустой , то при невозможности дождаться незанятости , в Descr заносятся параметры цикла ожидания, а
' в функции производится возврат : 0 - ie освободился, 1 - остался Занятым
Dim n,n1, T, flDescr
Const READYSTATE_COMPLETE=4, SlipPeriod =100
If typename(TimeOut)="String" Then
T=Split(TimeOut,";")
T(0)=CDblDotComma(T(0))*1000 : T(1)=CDblDotComma(T(1))*1000 ' приведение к msec
If UBound(T)=1 Then
ReDim Preserve T(3)
End If
If T(2)="" Then T(2)=2 : If T(3)="" Then T(3)=50
T(2)=CLng(T(2)) : T(3)=CDblDotComma(T(3))
Else
ReDim T(1)
T(0)= TimeOut*1000 : T(1)= 0 ' - без проверки на вшивость
End If
flDescr=Not (Descr="" Or IsNull(Descr) Or IsEmpty(Descr))
On Error Resume Next ' - на случай , если обработчики событий от IE закроют Quit этот объект.
n=0 : ieBusy=(ie.Busy Or ie.ReadyState <> READYSTATE_COMPLETE )
Do While ieBusy And Err.Number=0
'WriteLog "n=" & n & "TimeOut=" & T(0) & "ie.Busy=" & ie.Busy & ",ie.ReadyState=" & ie.ReadyState
WScript.Sleep SlipPeriod ' DoEvents
ieBusy=(ie.Busy Or ie.ReadyState <> READYSTATE_COMPLETE )
n=n+SlipPeriod : If T(0)>0 Then If n>=T(0) Then Exit Do
Loop
n1=0
If T(1)>0 And Not ieBusy And Err.Number=0 Then ' При необходимости - проверка Готовности на вшивость
WScript.Sleep T(1) ' - в течении T(1) готовность может теряться, но после этого она д.б. воспроизводима T(2) раз с T(3) msec перерывом
While n1<T(2) And Not ieBusy And Err.Number=0
n1=n1+1 : ieBusy=(ie.Busy Or ie.ReadyState <> READYSTATE_COMPLETE )
If n1<T(2) then WScript.Sleep T(3) ' DoEvents
Wend
n1=T(1)+n1*T(3)
End If
n=n+n1 ' - сколько всего msec ждали
Descr=Time & ";" & "n=" & n & ";TimeOut=" & TimeOut & ";ie.Busy=" & ie.Busy & ";ie.ReadyState=" & ie.ReadyState & ";" & Descr
AccumulateLog Descr
If flDescr And (ieBusy Or Err.Number<>0) Then
ie.Quit: ErrRiseMsg= "Невозможно дождаться готовности IE или случилась какая-то ошибка" & vbCrLf & Descr : WScriptQuit '-->>
End If
End Function ' ieBusy -->>
Там хорошо видно, что процесс «iexplore.exe», являющийся хостом для объекта "InternetExplorer.Application", является дочерним процессом по отношению к «svchost.exe».
Это, если прежде пользователем не открыты окна IE, а если они уже открыты, то IEXPLORER.EXE от моего объекта "InternetExplorer.Application" вообще не виден ни в svchost.exe , ни отдельно среди пользовательских, которые дочерние для Explorer.exe без параметров запуска.
При этом, если скрипт при отладке сорван, и после закрыты пользовательские IEXPLORER окна крестиком, то в дочерних для Explorer.exe ОСТАЕТСЯ этот сорванный IEXPLORER.EXE .