Что нового

Вызов AutoIt функций из JavaScript с передачей параметров

_dron_

Знающий
Сообщения
84
Репутация
8
как вызвать AutoIt функцию из JavaScript (IE) с передачей параметров во время вызова?
у меня пока только так -
есть функция AutoIt которая подписана на событие ondataavailable элемента document:
Код:
$oDoc = _IEDocGetObj($oIE)
ObjEvent($oDoc,"_oDoc_")

Func _oDoc_ondataavailable()
   $name = $oDoc.calling.name
   $retVal = 0
   if $oDoc.calling.attr = "" Then
	  $retVal = Call($name)
   Else
	  $attr = StringSplit($oDoc.calling.attr,"&")
	  $attr[0] = "CallArgArray"
	  $retVal = Call($name,$attr)
   EndIf
   $oDoc.calling.ready($retVal)
EndFunc


и есть JavaScript функция:
JavaScript:
<head>
<script>
document.calling = {"name":"","attr":"","ready":function(){}}
document.CallBack = function(name){
	var tmp = function(){
		var name = arguments.callee.name;
		var attr = "";
		if(arguments.length > 1){
			for(var i = 0;i<arguments.length;i++){
				attr += arguments[i].toString()
				if(i < arguments.length - 1) attr += "&";
			}
		}else if(arguments.length == 1){
			attr = arguments[0].toString();
		}
		document.calling.name = name
		document.calling.attr = attr
		document.fireEvent("ondataavailable");
		return document.calling
	}
	tmp.name = name
	document[name] = tmp
}
</script>
</head>

Работает эта "бодяга" так:
1)AutoIt регистрирует свою функцию вызовом $oDoc.CallBack("_title") или $oDoc.CallBack(StringLower(FuncName(_title)))
2)JavaScript создает функцию с этим именем и привязывает ее к document'у
3)Во время вызова JavaScript'ом этой функции (document._title("некий текст");) все параметры собираются в строку с разделителем '&' и записываются в document.calling.attr название функции передается в document.calling.name и вызывается событие ondataavailable
4)AutoIt получает событие обрабатывает параметры document.calling.attr и с ними методом Call вызывает функцию с именем document.calling.name

Вопрос есть другой способ? я уже 3 день ищу и не могу найти!!! на вашем форуме есть толь ветки типа "как нажать кнопку в IE"!!! если есть ссылки на стороние ресурсы где есть инфа скинте пожалуйста!!! Зарание благодарен!!!


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

Неужели не кто ни знает? :(
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Интересный метод у вас ;D

Как вариант - создать контейнер, который будет заполнен сразу функцией с необходимыми параметрами, которую затем можно выполнить через Execute, ну или распарсить и затем вызвать через Call, тут уже как пожелаете.

Вот пример. На странице я создаю input, в качестве value я присваиваю то что буду выполнять. Подписываюсь на событие ondataavailable, в котором определяю источник события, получаю значения и выполняю скрипт через execute.

Код:
Global $oContainer = $oIE.document.getElementById('_container')
If IsObj($oContainer) Then
;~ 	$oContainer.value = $sAns
Else
	$oContainer = $oIE.document.createElement("input")
	$oContainer.id = '_container'
;~ 	$oContainer.style.display = "none"
	$oIE.document.body.appendChild($oContainer)
EndIf

ObjEvent($oContainer,"_container_")

Func _container_ondataavailable()
	$this = @COM_EventObj
	Local $data = $this.value
	Execute($data)
EndFunc

HotKeySet('{F2}','_SET')
HotKeySet('{ESC}','_EXIT')
While 1
	Sleep(100)
WEnd

Func _EXIT()
	Exit
EndFunc

Func _SET()
	$oContainer.value = 'MyFunc("hello ' & Random(1,100,1)&'")'
	$oContainer.fireEvent("ondataavailable");
EndFunc

Func MyFunc($params)
	MsgBox(0,0,$params)
EndFunc   ;==>MyFunc
 
Автор
D

_dron_

Знающий
Сообщения
84
Репутация
8
Ну мой метод работает хорошо если нужно просто вызывать функции из Javascript'а, а мне нужно еще получить то что она возвращает! проблема в том что вызов получается асинхронным и результат выполнения AutoIt функции становится известен уже после 3-4 инструкций в Javascript!!!

Мне нужен способ или как заставить JavaScript подождать завершения выполнения функций или заставить AutoIt работать быстрее!!!

зы: в принципе вы мне говорите тоже самое что я написал в вопросе
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Я бы результат вписывал в другой input и уже в Javascripte подписался бы на ondataavailable.
 
Автор
D

_dron_

Знающий
Сообщения
84
Репутация
8
у меня вызов "прозрачен" и параметры при вызове функции являются объектами JavaScript'а например чтобы вызвать функцию в AutoIt нужно написать просто document[имя функции](параметры) или document.имя(параметры) и не нужно делать уязвимый код который выполняется в Execute и может поломать программу!!! А вопрос я задал потому что не знаю как нормально сделать вызов и получить результат вызова!




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

я немного не правильно выразился мне нужно чтобы запрос был "синхронный" то есть пишем на JavaScript'е
JavaScript:
var dir = document.GetCurrentDir();
в AutoIt
Код:
Func GetCurrentDir()
 Return @ScriptDir
EndFunc

и результат вызова был в переменной dir
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Я бы тоже хотел знать ответ ;D. Если найдете решение, отпишите. Кстати, обратный вопрос, как вызывать из AutoIt функцию яваскрипт, и поместить результат в переменную?
Код:
Local $ret = 'somejsfunc()'
 
Автор
D

_dron_

Знающий
Сообщения
84
Репутация
8
повесить JavaScript функцию на document а в AutoIt вызывать и результат нормально возвращается!
Код:
$oDoc = _IEDocGetObj($oIE)
$varI = $oDoc.fire(13)

JavaScript:
document.fire = function(a){
     return a * 2;
}

с этим вроде проблем нет!!! проблема вернуть результат из AutoIt'а синхронно - то есть сделать задержку в JavaScript'е например!
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
А вам не подойдет объект AutoItX3.Control?


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

_dron_ [?]
повесить JavaScript функцию на document а в AutoIt вызывать и результат нормально возвращается!
А если уже есть на странице какая то именная функция, ее по имени вызывать можно и передать ей параметры и получить результат?
 
Автор
D

_dron_

Знающий
Сообщения
84
Репутация
8
вроде да, только их нужно перевесить на "доступный" объект например document!

короче нужно эксперементировать!!!


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

Решение синхронного вызова не нашел :( . остается асинхронный, представленный в первом посте код будет работать если в JavaScript например написать:
JavaScript:
document._title("новый заголовок").ready = function(a){
      alert(a);
}
а в AutoIt
Код:
$oDoc.CallBack("_title")
Func _title($a)
     WinSetTitle($Gui,"",$a)
     return "ok"
EndFunc

ready будет вызван после завершения AutoIt функции. :smile: и появится сообшение с текстом "ok"
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Как запустить? У меня пишет что "Объект не поддерживает свойство или метод "_title""
 
Автор
D

_dron_

Знающий
Сообщения
84
Репутация
8
в теге <head></head> вставь JavaScript скрипт который в первом посте, в Autoit тоже с первого поста функцию вставь! это я не тестировал на внешнем IE то есть он создан через _IECreateEmbedded()

еще если например сделать страницу html с картинками и это все запихать в ресурсы программы через Restorator в папку html, предварительно переименовав все файлы например: index.html.html , img.png.html и т.п. то можно их грузить в IE указав путь с res:// в начали пути например так:
Код:
$oIE = _IECreateEmbedded()
_IENavigate($oIE, "res://" & @ScriptFullPath & "/index.html")
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
непонятно зачем тут autoit
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Отлично. А где про CallBack почитать. Первый раз такое вижу :smile:
 
Автор
D

_dron_

Знающий
Сообщения
84
Репутация
8
Отлично. А где про CallBack почитать. Первый раз такое вижу
ни где это я здесь сидю и пишу себе эту шнягу!

непонятно зачем тут autoit
не понятен вопрос!
зы: autoit - это программа, а IE (html) это оформление к ней например кнопочки окошко (IE встроенное)!!!

вот я и спрашиваю как нормально наладить объщение autoit и IE!
 
Верх