Что нового

ошибка в функции _IEAttach

Naisho

Знающий
Сообщения
86
Репутация
12
Имеется встроенное в Шарпридер (RSS читалка) окно Internet Explorer_Server с такими характеристиками :
>>>> Window <<<<
Title: SharpReader
Class: WindowsForms10.Window.8.app.0.1517e87
Position: 25, 51
Size: 1593, 917
Style: 0x16CF0000
ExStyle: 0x00050100
Handle: 0x0002046A

>>>> Control <<<<
Class: Internet Explorer_Server
Instance: 1
ClassnameNN: Internet Explorer_Server1
Name:
Advanced (Class): [CLASS:Internet Explorer_Server; INSTANCE:1]
ID:
Text:
Position: 629, 599
Size: 956, 226
ControlClick Coords: 391, 119
Style: 0x56000000
ExStyle: 0x00000000
Handle: 0x000D05B4

>>>> Mouse <<<<
Position: 1049, 830
Cursor ID: 0
Color: 0xFFFFFF

>>>> StatusBar <<<<

>>>> ToolsBar <<<<

>>>> Visible Text <<<<
&Search:
A&ddress:
S&ubscribe
Refresh


>>>> Hidden Text <<<<
Filter
Apply Filter
Locked Only
Unread Only
Show All
Age:
Text:
Flag:
Feed Properties
PropertyGrid
Description Pane
Command Pane
PropertyGridView
PropertyGridToolBar

Пытаюсь в цикле пробежаться по новостям одновременно копируя содержимое окна Internet Explorer_Server (собственно содержимое новости), однако через некоторое время подпрограммка зацикливается и после её принудительного снятия начинает вылетать с ошибкой функция _IEAttach
Код:
->
C:\Program Files\AutoIt3\Include\IE.au3 (3633) : ==> The requested action with this object has failed.:
Return $oIE.Document.parentwindow
Return $oIE.Document^ ERROR

собственно подпрограмка вытаскивания текста в основе своей подсмотрена на этом же форуме (частота вызова - примерно 2 раза в секунду, чаще шарпридер не успевает обновить окно новости)

Код:
Func _InternetExplorerServer_ReadTextEx()
    Local $s_BodyTextIE, $iTimeStart
	Local $i_MaxTimeWait = 30000
	Local $sTitle = 'SharpReader'
;	Opt("WinTitleMatchMode", 2)
;	$sTitle = WinGetTitle ( $sTitle )
ConsoleWrite("->" & @crlf)
	$oIE = _IEAttach ($sTitle, 'Embedded')
	If Not IsObj($oIE) Then
ConsoleWrite("-->" & @crlf)
		$oIE = _IEAttach ($sTitle, 'Embedded')
	EndIf
    If Not IsObj($oIEErrorHandler) Then _IEErrorHandlerRegister()
    $iTimeStart = TimerInit()
ConsoleWrite("--->" & @crlf)
    While 1
        $s_BodyTextIE = _IEBodyReadText($oIE)
        If $s_BodyTextIE Then ExitLoop
        If TimerDiff($iTimeStart) > $i_MaxTimeWait Then ExitLoop
        Sleep(8)
    WEnd
    If $s_BodyTextIE Then Return $s_BodyTextIE
    Return SetError(1, 0, '')
EndFunc


Как бороться/не допустить эту ошибку? Что она означает?
 

mef-t

Осваивающий
Сообщения
306
Репутация
30
А у Вас вообще файл "C:\Program Files\AutoIt3\Include\IE.au3" есть?
 
Автор
N

Naisho

Знающий
Сообщения
86
Репутация
12
Конечно есть, 187 килобайт живого веса...


Добавлено:
Сообщение автоматически объединено:

Уточнение - всё нормально работает, пока не происходит следующее:
Код:
->
--> COM Error Encountered in test_AM.au3
----> $IEComErrorScriptline = 3633
----> $IEComErrorNumberHex = 80020009
----> $IEComErrorNumber = -2147352567
----> $IEComErrorWinDescription = Отказано в доступе.
----> $IEComErrorDescription = Отказано в доступе.
----> $IEComErrorSource = 
----> $IEComErrorHelpFile = C:\WINDOWS\System32\mshtml.hlp
----> $IEComErrorHelpContext = 0
----> $IEComErrorLastDllError = 0

--> IE.au3 V2.4-0 Warning from function _IEAttach, $_IEStatus_NoMatch
--> IE.au3 V2.4-0 Error from function _IELoadWait, $_IEStatus_InvalidDataType
--->
--> IE.au3 V2.4-0 Error from function _IEBodyReadText, $_IEStatus_InvalidDataType
--> IE.au3 V2.4-0 Error from function _IEBodyReadText, $_IEStatus_InvalidDataType
--> IE.au3 V2.4-0 Error from function _IEBodyReadText, $_IEStatus_InvalidDataType
..............
--> IE.au3 V2.4-0 Error from function _IEBodyReadText, $_IEStatus_InvalidDataType
--> IE.au3 V2.4-0 Error from function _IEBodyReadText, $_IEStatus_InvalidDataType

>Process failed to respond; forcing abrupt termination...
>Exit code: 1    Time: 977.925

а после завершения - _IEAttach просто не работает - ни в одном скрипте
Код:
->
C:\Program Files\AutoIt3\Include\IE.au3 (3633) : ==> The requested action with this object has failed.:
Return $oIE.Document.parentwindow
Return $oIE.Document^ ERROR
->16:29:30 AutoIT3.exe ended.rc:1
>Exit code: 1    Time: 10.014

Что ж это за ошибка такая?
 

tech-gs

Знающий
Сообщения
54
Репутация
5
Столкнулся с этой же проблемой.
Все дело в том, что при использовании _IECreate(..., 1) или _IEAttach(...) в <IE.au3> происходит проверка свойств объекта, а именно:

Код:
		; Check conditions to verify that the object is a browser
		If $f_isBrowser Then
			$s_tmp = $o_window.type ; Is .type a valid property?
			If @error Then $f_isBrowser = False
		EndIf
		If $f_isBrowser Then
			$s_tmp = $o_window.document.title ; Does object have a .document and .title property?
			If @error Then $f_isBrowser = False
		EndIf

В строке "$s_tmp = $o_window.type" и "$s_tmp = $o_window.document.title" в некоторых случаях происходит ошибка 0x80020009. Если в вашем скрипте включена обработка COM-ошибок (например, $oError = ObjEvent('AutoIt.Error', 'AutoIt_ErrFunc')), она и вызывает вылет программы.
Как решение, добавить конкретный код ошибки в список игнорируемых ошибок. При этом, ваша программа продолжит нормальный ход выполнения:

Код:
Global $oError = ObjEvent('AutoIt.Error', 'AutoIt_ErrFunc')
; ...
Func AutoIt_ErrFunc()
	Switch $oError.Number
		Case 0x80020009 ; При вызове функции _IECreate(..., 1) или _IEAttach(...) проверка на ошибку свойства в <IE.au3> стр.343 - $s_tmp = $o_window.type,
			Return
		Case Else
			ConsoleWrite("! COM Error !  Number: 0x" & Hex($oError.Number, 8) & "   ScriptLine: " & $oError.Scriptline & " - " & $oError.WinDescription & @CRLF)
			MsgBox	(0+16+8192+262144, 'Error Handler', 'An error occurred in the application! '	& @CR	& @CR & _
						'Description   '	& @TAB & ':  ' & @TAB & $oError.Description						& @CR & _
						'WinDescription'	& @TAB & ':  ' & @TAB & $oError.WinDescription					& @CR & _
						'Number        '	& @TAB & ':  ' & @TAB & '0x' & Hex($oError.Number, 8)			& @CR & _
						'LastDLLError  '	& @TAB & ':  ' & @TAB & $oError.lastDllError					& @CR & _
						'ErrLine       '	& @TAB & ':  ' & @TAB & $oError.Scriptline						& @CR & _
						'Source        '	& @TAB & ':  ' & @TAB & $oError.Source							& @CR & _
						'HelpFile      '	& @TAB & ':  ' & @TAB & $oError.HelpFile						& @CR & _
						'HelpContext   '	& @TAB & ':  ' & @TAB & $oError.HelpContext _
					)
			SetError($oError.Number)
			Exit ($oError.Number)
	EndSwitch
Endfunc
 
Верх