Что нового

Функция ObjName возвращает разные имена одного и того же интерфейса

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Версия AutoIt 3.3.8.0

Обнаружил баг в функции ObjName. Дело в том, что по каким-то соображением, (непонятно каким) имена интерфейсов при компиляции меняются. Отсюда, к примеру, в UDF IE.au3 возникают ошибки при проверке интерфейса. В частности во внутренней функции __IEIsObjType. Это так же может сыграть злую шутку и в любом скрипте, где понадобится проверка имени возвращаемого интерфейса.

Для наглядности запустите пример не скомпилированный и поле компиляции.

Пример:
Код:
#include <IE.au3>
Global $sURL = 'http://ya.ru'

$oIE = _IECreate($sURL) ; Не меняется
If ObjName($oIE) = 'IWebBrowser2' Then
	MsgBox(64, 'IWebBrowser2', ObjName($oIE))
Else
	MsgBox(16, 'IWebBrowser2', ObjName($oIE))
EndIf

$oHTML = _IEDocGetObj($oIE) ; Прификс 'Disp'
If ObjName($oHTML) = 'DispHTMLDocument' Then
	MsgBox(64, 'DispHTMLDocument', ObjName($oHTML))
Else
	MsgBox(16, 'DispHTMLDocument', ObjName($oHTML))
EndIf

$oForm = _IEFormGetCollection($oIE,0) ; Прификс 'Disp'
If ObjName($oForm) = 'DispHTMLFormElement' Then
	MsgBox(64, 'DispHTMLFormElement', ObjName($oForm))
Else
	MsgBox(16, 'DispHTMLFormElement', ObjName($oForm))
EndIf

$oImg = _IEImgGetCollection ($oIE,0) ; Прификс 'Disp'
If ObjName($oImg) = 'DispHTMLImg' Then
	MsgBox(64, 'DispHTMLImg', ObjName($oImg))
Else
	MsgBox(16, 'DispHTMLImg', ObjName($oImg))
EndIf

$oLink = _IELinkGetCollection ($oIE,0) ; Прификс 'Disp'
If ObjName($oLink) = 'DispHTMLAnchorElement' Then
	MsgBox(64, 'DispHTMLAnchorElement', ObjName($oLink))
Else
	MsgBox(16, 'DispHTMLAnchorElement', ObjName($oLink))
EndIf

$oInput = _IETagNameGetCollection ($oIE, "input",0) ; Прификс 'Disp'
If ObjName($oInput) = 'DispHTMLInputElement' Then
	MsgBox(64, 'DispHTMLInputElement', ObjName($oInput))
Else
	MsgBox(16, 'DispHTMLInputElement', ObjName($oInput))
EndIf

$oTable = _IETableGetCollection($oIE,0) ; Прификс 'Disp'
If ObjName($oTable) = 'DispHTMLTable' Then
	MsgBox(64, 'DispHTMLTable', ObjName($oTable))
Else
	MsgBox(16, 'DispHTMLTable', ObjName($oTable))
EndIf

$oFlash = ObjCreate("ShockwaveFlash.ShockwaveFlash") ; Прификс 'I'
If ObjName($oFlash) = 'IShockwaveFlash' Then
	MsgBox(64, 'IShockwaveFlash', ObjName($oFlash))
Else
	MsgBox(16, 'IShockwaveFlash', ObjName($oFlash))
EndIf

$oWMPlayer = ObjCreate("WMPlayer.OCX") ; Полностью меняет название интерфейса
If ObjName($oWMPlayer) = 'IWMPPlayer4' Then
	MsgBox(64, 'WMPPlayer4', ObjName($oWMPlayer))
Else
	MsgBox(16, 'WMPPlayer4', ObjName($oWMPlayer))
EndIf

_IEQuit($oIE)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett,
У меня (3.6.6.1 3.3.6.1) на IE8 возвращаются одинаковые имена что в скомпилированном скрипте, что в запущенном из SciTE. Только IWebBrowser2, остальные то, что у Вас в скрипте ошибки.
 
Автор
Garrett

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Извиняюсь, я не указал версию.
Версия AutoIt 3.3.8.0

madmasles [?]
Странно, должно быть наоборот. Нет, всё верно, это я немного напутал. Поправил пример. Правильное имя интерфейса, к примеру, у коллекции ссылок DispHTMLAnchorElement. Однако, в не скомпилированном примере оно не соответствует истинному.
Но, так или иначе
возвращаются одинаковые имена что в скомпилированном скрипте, что в запущенном из SciTE.
так и должно быть.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett,
Теперь понял. Ваш исправленный пример на 3.3.6.1 - нет ошибок, 3.3.8.0 - только IWebBrowser2, остальные ошибки. Мне трудно понять, зачем это сделано, может быть, это как-то связано с IE9?
 
Автор
Garrett

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles [?]
может быть, это как-то связано с IE9?
Нет, это проблема в AutoIt3.exe
Чем это чревато? Запустите пример из SciTE, а потом скомпилируйте и Вы увидите разницу, а это в свою очередь тема на форуме по типу "Не работает функция _IETableWriteToArray" :smile:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <IE.au3>
#include <Array.au3>

Global $sTitle = 'Первая десятка разделов'
Global $sURL = 'http://autoit-script.ru/index.php?action=stats'

ProgressOn($sTitle, "Загрузка...")

$oIE = ObjCreate("InternetExplorer.Application")
ObjEvent($oIE,"IEEvent_","DWebBrowserEvents2")
$oIE.Visible = 0
$oIE.Navigate($sURL)
_IELoadWait($oIE)
$oTable = _IETableGetCollection($oIE,8)
$aTable = _IETableWriteToArray($oTable,1)
_IEQuit($oIE)
ProgressOff()
_ArrayDisplay($aTable,$sTitle)

Func IEEvent_ProgressChange($i_Progress,$i_ProgressMax)
 
	$i_Percent = Int(($i_Progress * 100) / $i_ProgressMax)
	If $i_Percent >= 0 And $i_Percent <= 100 Then
		ProgressSet($i_Percent , $i_Percent & "%" , "Загрузка...")
	EndIf
EndFunc ;==>IEEvent_ProgressChange
 
Верх