HTML Object Library: отлов событий

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

HTML Object Library: отлов событий

Сообщение GSerg » 07.05.2005 (Сб) 10:37

Всё, надоело, задаю вопрос официально :)

Имеем основную задачу: отловить события, создаваемые объектом HTMLDocument. Подключаем библиотеку MS HTML Object Library и пытаемся поймать означенные события.
События, по документации, ловятся двумя способами.
Весь приведённый код на Visual Basic 6. Задача – иметь его работающий вариант на .NET. У меня это не получилось :)


Способ первый
Отлов собственных событий документа

Подходит для тех, кто создаёт документы методом createDocumentFromUrl (предварительно создайте файл "c:\1.htm" и напишите в него "<html><body>Гы!</body></html>").

Код: Выделить всё
Option Explicit

Private Creator As IHTMLDocument4
Private WithEvents doc As HTMLDocument

Private Sub Form_Load()
  Me.AutoRedraw = True
  Set Creator = New HTMLDocument
  Set doc = Creator.createDocumentFromUrl("c:\1.htm", "null")
End Sub

Private Sub doc_onreadystatechange()
  Me.Print doc.readyState
End Sub


При выполнении этого кода на форму выводится сначала interactive, потом complete.
Примечание: я попытался пропустить этот код через Upgrade Wizard. Эти несчастные 11 строчек подвесили его на 10 минут (Pentium-M 1400). Результирующий код не работал.


Способ второй
Использование обработчиков

Для тех, кто берёт откуда-то HTML в виде plain text (например, с сокета), а потом хочет его парсить. Преимущество в том, что в этом случае можно скачать только текст, тогда как createDocumentFromUrl скачает всё, со всеми картинками и флэшками.

Замечания по этому коду:
Во-первых, имеется класс по имени DocWaiter. В нём метод (его имя не имеет значения, главное, чтобы это была SUB без параметров). Через Tools :arrow: Procedure Attributes этому методу установлен Procedure ID: (Default). Тогда HTMLDocument понимает, что нужно вызвать именно его.
Во-вторых, CallByName используется потому, что прямой вызов метода write не получится, т.к. он описан в библиотеке типов таким образом, что VB с ним работать не может. А при вызове через IDispatch всё прокатывает (вместо CallByName можно использовать каст к Object – но это кому что нравится). В .NET делать этого не нужно, поскольку он сможет вызвать write и напрямую.

В форму:
Код: Выделить всё
Option Explicit

Private WithEvents doc As HTMLDocument
Private watcher As DocWaiter

Private Sub Form_Load()
  Dim t As IHTMLDocument2
 
  Me.AutoRedraw = True
 
  Set doc = New HTMLDocument
  Set watcher = New DocWaiter
 
  doc.onreadystatechange = watcher
 
  Set t = doc   'cast to IHTMLDocument2
  CallByName t, "write", VbMethod, "<html><body>Гы!</body></html>"
  t.Close
End Sub


В класс по имени DocWaiter:
Код: Выделить всё
Option Explicit

Public Sub AnyName() 'Procedure ID: (Default)
  MsgBox "!"
End Sub




Любой из этих методов (лучше второй) (а желательно оба) хочу видеть в .NET :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.05.2005 (Вс) 0:51

При попытке реализовать второй метод встретил
An unhandled exception of type 'System.NotImplementedException' occurred in mscorlib.dll

Additional information: Not implemented


Будем ждать VS2005?
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.05.2005 (Вс) 4:33

Не :)
Это грабли из разряда того, что в классе DocWaiter не найден метод с DISPID=0 :)

Главное, ставлю атрибут DISPID - хавает, но ни фига :)
Ставлю классу атрибут ComClass - и тут студия говорит, что нельзя юзать DISPID = 0, потому что это дело зарезервировано под ключевое слово Default. Ставлю методу Default - "Нельзя ставить Default методу, только параметрическому свойству" :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.05.2005 (Вс) 11:16

Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.05.2005 (Вс) 11:59

Ну и чё? :)

Не знаю, кто такой этот Шон, но он накопал точно то же, что и я :)
Ну не работает установка DispId(0), я проверял :) и сигнатуры менял - и без параметров, и с одним объектным тоже :)
Разве что совсем уж специфичная сигнатура должна быть? У тебя-то получилось? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.05.2005 (Вс) 13:47

GSerg писал(а):Не знаю, кто такой этот Шон, но он накопал точно то же, что и я :)
Ну не работает установка DispId(0), я проверял :) и сигнатуры менял - и без параметров, и с одним объектным тоже :)
Разве что совсем уж специфичная сигнатура должна быть? У тебя-то получилось? :)

Как кто - это же кто-то внутри MS? Значит, правду говорит?

А я тоже проверял, и тоже не достиг успеха :-(
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.05.2005 (Вс) 15:41

Почему-то мне кажется, что мы либо опять упёрлись в 1 (одну) сосну, либо, в полном противоречии с http://www.sysadmins.ru/rtfm/ask_howto.htm, нашли ошибку в системном компоненте :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.05.2005 (Вс) 20:03

Да насколько я знаю, взаимодействие с COM - одна из самых слабых сторон дотнета... Вспомни Retracer - он у меня так и не заработал ведь, пока я не поставил VS2003.

Честно говорю, я все шальные идеи, которые могли придти в мою голову, испробовал - и ни одна не заставила этот код работать.

А расскажи лучше, зачем это тебе надо? ;-)
В FW же есть какой-то свой класс-HTTP-тыритель?
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.05.2005 (Пн) 3:45

Тыритель - это одна часть :)
Вслед за тыреньем идёт парсинг, вот для этого :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.05.2005 (Пн) 15:05

А вот есть на http://msdn.microsoft.com/library/en-us ... bpages.asp нечто "HTML parsing by XML Web services", не то?
Последний раз редактировалось tyomitch 10.05.2005 (Вт) 9:08, всего редактировалось 1 раз.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.05.2005 (Пн) 16:26

Мда, ссылка супер :)
У меня такого MSDN нет, а переводить в web-вариант совсем неохота :)

Короче, я подолбился ещё с .NET, события вызвать так и не смог, зато параллельно писал на VB6. За два дня получился очень приличный бот, который хоть и однопоточный, но полностью event-driven, а потому спокойно тырит несколькими сокетами сразу. Очередь заданий, выполнение оных по мере освобождения сокетов, логи, парсинг HTML, абстрагированный механизм ввода-вывода... Харошая получилась весчь :) Ещё больше склоняюсь к мнению о том, что .NET - это пока очень, очень сыро :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 82

    TopList