Что нового

ObjEvent, обработка событий (winhttp.winhttprequest.5.1)

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Всем доброго времени суток...
Полностью прочитал и переварил описание функции ObjEvent, проникся моделью COM,
но в данном случае развожу руками :scratch:

Вот скрипт который шлет запрос на сервер... все отлично, замечательно работает (сервак реально поднят, можете проверить)
Код:
Dim $sServerURL = 'http://94.233.79.242:8000'
Dim $oHTTP = ObjCreate('winhttp.winhttprequest.5.1')

	$oHTTP.Open("POST", $sServerURL, True)
	$oHTTP.Send('test')
	$oHTTP.WaitForResponse()

MsgBox(0, $sServerURL & '--Response', $oHTTP.ResponseText())

Шлем сообщение на сервер... сервак должен ответить 'Request is received, but this server could not handle it'
(Запрос получен, но обработать его не удалось) ;D Так и должно быть.
Далее...
Согласно спецификации экземпляр COM-объекта winhttp.winhttprequest.5.1
генерирует события... передавая их в интерфейс 'IWinHttpRequestEvents'
RTFM :shok: и собственно вот он обработчик событий в AutoIT:
ObjEvent ( $ObjectVar, "functionprefix" [, "interface name"] )
ObjEvent ( "AutoIt.Error" [, "function name"] )
Два конструктора у него есть... ; второй для обработки "фэйлов" самого AutoIt (работает, юзаем - всё ОК)
Но нам интересен первый ; что-же у него там с параметрами... а с параметрами у него вот что:
$ObjectVar - переменная которая хранит хендл экз. COM-объекта который планируем слушать
functionprefix - перефикс к пользоватеьским функциям (типо обработчикам, хотя по сути эмитер получается один, смотрит он в интерфейс, и определяет его состояние)
interface name - говорит сам за себя... это имя интерфейса...
Ну что-ж пробуем:
Код:
Dim $sServerURL = 'http://94.233.79.242:8000'
Dim $oHTTP = ObjCreate('winhttp.winhttprequest.5.1')
Dim $oEventEmitter = ObjEvent($oHTTP, 'Evt_', 'IWinHttpRequestEvents')
	$oHTTP.Open("POST", $sServerURL, True)
	$oHTTP.Send('test')
	$oHTTP.WaitForResponse()
MsgBox(0, $sServerURL & '--Response', $oHTTP.ResponseText())

Func Evt_OnResponseFinished()
	MsgBox(0,'Event Emitter', 'произошло событие OnResponseFinished')
EndFunc

Func Evt_OnError()
	MsgBox(0,'Event Emitter', 'произошло событие OnError')
EndFunc

лично у меня падает все время, причем "стоп машина!" орет система, а интерпритатор покорно складывается показывая
... AutoIT3.exe ended.rc:-1073741819
Где я не прав ?
PS: "метод повсеместного втыкания CosoleWrite"... помог определить что ошибка возникает на этапе
Код:
...
$oHTTP.Send('test')
...

когда собственно и происходит первое его событие ; "OnResponseStart" видимо ?
 
Автор
R

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
87.212.151.61:****
:beer:
твой запрос приходит... но ты не сообщаешь о получении ответа :smile: стало быть та-же ошибка :smile:
 
Автор
R

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
на офф.форуме пользователь trancexx дал мне развернутый ответ на мой вопрос...

Re: первым делом меня отправили к WinHTTP.au3...
но она не удовлетворяла моим потребностям, хотя в ней и реализован определенный механизм контроля состояния запроса функцией _WinHttpSetStatusCallback
(для ее использования надо еще потанцевать с бубном - передав ей аргументом объект-метод dll, благо все есть в справке по UDF, и все равно это не то...)
Я-же акцентировал внимание на том, что WinHTTP UDF базируется на API экспортируемого библиотекой "winhttp.dll" (конструктор COM-объектов 'winhttp.winhttprequest.5.1' так-же дело рук этой либы)
но для "нативного" доступа к ней используется своя спецификация, а для работы с COM-объектами - своя...
Согласно справки по AutoIt функция ObjEvent, собственно этим и занимается. и вот собственно разъяснения по этому поводу:
Несмотря на то, что так или иначе используется
"winhttp.dll", использовать экспортируемый ей интерфейс
IWinHttpRequestEvents невозможно, так как он является специфическим типом интерфейсов наследуемыми от IUnknown (базового типа безымянных интерфейсов)... и не поддерживается в стабильных версиях AutoIt3
PS: Правда некоторые способы для достижения таки поставленной цели предоставлены в beta-версии,
однако из-за специфики конкретной темы (асинхронного соединения), видимо все-же возникнут проблемы с семантикой.
вот так...



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

Существует другой способ...
использовать не 'winhttp.winhttprequest.5.1', а 'Msxml2.XMLHTTP.6.0'
Данный объект имеет индикатор состояния который возвращается методом .readyState
вот такой код выполняет то что требовалось, т.е. контролирует состояние
Код:
Dim $sServerURL = 'http://94.233.79.242:8000'
Dim $oHTTP = ObjCreate('Msxml2.XMLHTTP.6.0')

	$oHTTP.Open("POST", $sServerURL, True)
	$oHTTP.Send('test')
	While $oHTTP.readyState <> 4
                       ; Здесь выполняем код ожидая ответа от сервера, например рисуем индикацию
	WEnd

MsgBox(0, $sServerURL & '--Response', $oHTTP.ResponseText())

Здесь спецификация
 

VladUs

Скриптер
Сообщения
621
Репутация
180
Автор
R

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
OffTopic:

madmasles, Вы правы... я удалил это сообщение.

VladUs, что вы имеете в виду ?

будем друг за другом орфографические "фэйлы" искать ? ;
VladUs [?]
разница лишь в количестве итеракций.
 
Верх