Что нового

Не работает _IENavigate()/$oIE.Navigate()

The Dream

Новичок
Сообщения
393
Репутация
3
Я пытаюсь получить управление IE COM в другом процессе, собственно он:

Код:
$iWidth = @DesktopWidth - 20
$iHeight = @DesktopHeight - 80

$hGUI = GUICreate(StringTrimRight(@ScriptName, 4), $iWidth, $iHeight,-1,-1, BitOR(0x00020000, 0x00C00000, 0x80000000))

$sObj = 'Shell.Explorer'
$oIE = ObjCreate($sObj)

GUICtrlCreateObj($oIE, 0, 0, $iWidth, $iHeight)
GUISetState(@SW_SHOW, $hGUI)
$oIE.navigate('about:' & $sObj)

While 1
	Sleep(1000)
WEnd


Вот код, в котором обьект как-то нестабильно работает, а если быть точнее, то просто не загружает следующую указанную страницу, хотя если бы обьект IE был создан в одном скрипте - то все было бы нормально (пробовал очень много вариантов):

Код:
#include <ie.au3>


Local $iPID = Run('Shell.Explorer.exe')
Local $hWnd, $hControlIE, $oIE = 0

Do
	Sleep(50)
	$hWnd = __WinGetHWND($iPID, 'Shell.Explorer')
	If $hWnd <> 0 Then
		$hControlIE = ControlGetHandle($hWnd, "", "Internet Explorer_Server1")
		If $hControlIE <> 0 Then $oIE = __IEControlGetObjFromHWND($hControlIE)
	EndIf
Until IsObj($oIE)

If IsObj($oIE) Then
	$RTR = TimerInit()

	_IENavigate($oIE, 'http://fishki.net', 0)
	MsgBox(16, '', 'Страница загружается..')
	_IENavigate($oIE, 'http://2ip.ru', 0)
	MsgBox(16, '', '2IP уже не загружается, но есл бы все было в одном скрипте - то загружалась бы теперь она!')


	While 1
		;$hWnd = __WinGetHWND($iPID, 'Shell.Explorer')
		;If $hWnd <> 0 Then
		;$hControlIE = ControlGetHandle($hWnd, "", "Internet Explorer_Server1")
		$oIE = __IEControlGetObjFromHWND($hControlIE)
		;EndIf
		ConsoleWrite('readyState: ' & $oIE.document.readystate & @CRLF)
		Sleep(1000)
	WEnd
	ConsoleWrite('Время затраченное: ' & (TimerDiff($RTR) / 1000) & @CRLF)
EndIf

ProcessClose($iPID)




Func __WinGetHWND($iPID, $sTitle)
	If IsString($iPID) Then $iPID = ProcessExists($iPID)
	Local $aList = WinList(), $i
	For $i = 1 To $aList[0][0]
		If StringInStr($aList[$i][0], $sTitle) Then
			If WinGetProcess($aList[$i][1]) = $iPID Then
				Return $aList[$i][1]
			EndIf
		EndIf
	Next
	Return 0
EndFunc   ;==>__WinGetHWND
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Кажется вы переизобретаете _IEAttach.


А следующую страницу он может не загружать потому, что $oIE - уже не ссылаться на первоначальный объект. Такое может происходить, если IE решит переключить совместимость, он создает новый объект, и перезагружает контент, для пользователя это выглядит незаметно, но для скрипта - теряется связь со старым объектом. После _IENavigate($oIE, 'http://fishki.net', 0) сделайте заново _IEAttach
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
inververs, да нет, не так все просто :smile:

Код:
$hWnd = __WinGetHWND($iPID, 'Shell.Explorer')
= это кстати просто название окна, по нему происходит извлечение HWND, все просто, это я так, к стати.

В общем я пробовал уже не один раз "пере-аттачить", но увы, бестолку. И ф-цие _IEAttach тоже пробовал, эффект тот же.

Блок который извлекает указатель COM:

Код:
Do
    Sleep(50)
    $hWnd = __WinGetHWND($iPID, 'Shell.Explorer')
    If $hWnd <> 0 Then
        $hControlIE = ControlGetHandle($hWnd, "", "Internet Explorer_Server1")
        If $hControlIE <> 0 Then $oIE = __IEControlGetObjFromHWND($hControlIE)
    EndIf
Until IsObj($oIE)


Так как в основном я работаю в этом направлении, то именно интересно, в чем это может быть дело? О том, что document.readystate также не работает стабильно, я уже молчу :smile: Но все это и при использовании _IEAttach..
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
На сколько я помню, бы появился document, вам нужно сперва перейти на about:blank, функция __WinGetHWND - спорная, вы же можете установить уникальный заголовок окна и в ControlGetHandle указать его. или если нужнен hwnd то есть WinGetHandle.
__IEControlGetObjFromHWND - возвращает не объект IE, а window. тоже обратите на это внимание.
Почему второй раз не работает навигация и не помогает _IEAttach я не знаю 8)
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
inververs, ну спасибо что хотя бы отозвались) А вы кстати запускали скрипт?
Может еще кто-то что-то знает???
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Zalman1980 [?]
А вы кстати запускали скрипт
да запускал, второй скрипт никуда не смог перейти.

А что вы хотите сделать в итоге, может есть проще вариант?
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
inververs, нет, увы по другому никак. Я всю ночь пытался все это "победить", вместо того чтобы обратится на форум, в итоге время потратил все зря. Все дело в том, что мне кажется, что я не могу второй раз "грамотно" извлечь указатель на обьект. Или это просто невозможно, потому что он "занят" (сайт специально подобрал), и так как "занят", то не может ответить на мой "запрос". В общем как-то может так.. ;D


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

Garrett, спасибо что заглянули - сейчас разберусь с вашей ф-цией.
Если не трудно, напишите, в чем ошибка у меня. Это важно для меня просто.



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

Garrett, увы, эффект тот же. Я понимаю, что все дело в том, что сайт слишком "тяжелый" - но эта проблема не возникает, если я использую все в одном скрипте. Ваша ф-ция также работает, все нормально, но второй раз я в примере снова не могу перейти на другую страницу (неважно что предыдущая еще загружается).
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Zalman1980
Вы загружаете в Shell.Explorer современный сайт, использующий новые HTML тихнологии, так чего же вы хотите от несчастной Shell? :smile:
Shell.Explorer это оболочка, она непонимает и половины того, что вы её подсовываете!
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Garrett [?]
Shell.Explorer это оболочка, она непонимает и половины того, что вы её подсовываете!

Но я пытаюсь понять только то, что было проверено мной в одном скрипте.


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

Если вместо "тяжелого сайта" поставить легкий, например autoit-script.ru, то все работает нормально..
 
Верх