Компоненты COM неожиданно работают в .NET :)

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Компоненты COM неожиданно работают в .NET :)

Сообщение GSerg » 30.04.2005 (Сб) 18:22

Волею судеб :), я сейчас занимаюсь написанием одного тырительного механизма на .NET. Оный тырит инфу с одного сайта и анализирует её. Ессно, подключил HTML Object Library и начал переводить следующий dummy с VB6 на .NET:

Код: Выделить всё
Dim Creator As New HTMLDocument, doc as IHTMLDocument2

Set doc = Creator.createDocumentFromUrl("c:\1.htm", "null")

(этот код прекрасно работал).


Написал в .NET:
Код: Выделить всё

Dim Creator As New mshtml.HTMLDocumentClass, doc as mshtml.IHTMLDocument2

doc = Creator.createDocumentFromUrl("c:\1.htm", "null")


На последней строке вывалилось NullExceprion. Это которое в VB6 называется "Object reference not set". Проверил Creator - совсем не нафинг. Проверил его проперти - есть проперти. createDocumentFromUrl - NullException.

Копался в файловой системе. Перепроверял разрешения. Бился башкой об стенку.
Потом на одном маленьком форуме нашёл: методом write впишите в объект хоть что-нибудь (минимальное "<html></html>"), и он заработает.
Вписал.
Код: Выделить всё

Dim Creator As New mshtml.HTMLDocumentClass, doc as mshtml.IHTMLDocument2

CType(Creator, mshtml.IHTMLDocument2).write("<html></html>")
Creator.Close()
doc = Creator.createDocumentFromUrl("c:\1.htm", "null")


Заработало.


Спрашивается - ну какого фига происходят такие отклонения в работе компонентов через Interop? И как кодить что-то хоть чуточку менее тривиальное, чем "Hello, world", если это натуральное минное поле?
Последний раз редактировалось GSerg 01.05.2005 (Вс) 16:52, всего редактировалось 1 раз.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 01.05.2005 (Вс) 13:56

Пишите, батенька, на обычной шестерке, и счастье вас не минет :)

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 01.05.2005 (Вс) 14:08

Кстати, GSerg, там в папку с EXE-шником копируется копия COM DLL. Причем если ее удаляешь, то прога перестает работать :?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение GSerg » 01.05.2005 (Вс) 14:37

Да знаю я, что на обычной шестёрке :)
И пишу я на ней, пишу, не сомневайтесь :) И никуда я с неё не уйду :)

Просто захотел сделать злостного многопоточного бота, потому и остановился на .NET.



Вот вам, кстати, ещё один фичебаг - на сей раз я пока не смог найти объяснения :)

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

Private a As IHTMLDocument4, WithEvents b As HTMLDocument

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

Private Sub b_onreadystatechange()
  Me.Print b.readyState
End Sub


Запускаем, ловим события спокойно. На форме рисуется текущий статус документа.

То же самое пишем на .NET и обнаруживаем, что событие onreadystatechange не возникает :) Очень по-всякому объявлял переменную документа (перебрал все варианты с событиями, в том числе непосредственно событийный интерфейс), но событие так и не словилось, хотя документ успешно создаётся.
Я могу, конечно, делать doevents, пока readyState не станет "complete", но хочу событиями. А вот ни фига :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 01.05.2005 (Вс) 14:56

Если бы многопоточность была угодна Создателю, то она бы некриво работала в VB6 :) А пользование неугодными Создателю технологиями чревато...

:roll:

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

Сообщение GSerg » 01.05.2005 (Вс) 14:59

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

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 03.05.2005 (Вт) 10:35

Я думаю, это недетерминированное завершение играет роль, что неизбежно при работе НЕТ+СОМ .
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

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

Сообщение GSerg » 03.05.2005 (Вт) 10:56

Ну и где здесь роль недетерминированного завершения? Обе переменные - создателя и документа - на уровне формы. Инициализируются при form_load. Потом живут. А событий нет.
Имхо, это ещё одна лажа FW.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 03.05.2005 (Вт) 13:35

GSerg писал(а):Ну и где здесь роль недетерминированного завершения? Обе переменные - создателя и документа - на уровне формы. Инициализируются при form_load. Потом живут. А событий нет.
Имхо, это ещё одна лажа FW.



Откуда ты знаешь что внутри происходит? А по коду явно видно...(по работающему)
Ято же столкунлся с такой проблемой в БД... после создания базы пытался её открыть))))) Тогда тоже всех подряд клял..
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

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

Сообщение GSerg » 03.05.2005 (Вт) 13:44

Sebas писал(а):Откуда ты знаешь что внутри происходит?

Дык суть виртуальной машины именно в том, что можно не знать, что происходит внутри! Вернее, это суть ООП вообще. Каждый объект - чёрный ящик.

Sebas писал(а):А по коду явно видно...(по работающему)

Короче. Вот код. Заставь его работать :)
Код: Выделить всё
  Private WithEvents doc As HTMLDocumentClass
  Private a As IHTMLDocument4

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    a = CType(New HTMLDocument, IHTMLDocument4)
    With CType(a, mshtml.IHTMLDocument2)
      .write("<HMTL></HTML>")
      .close()
    End With

    doc = CType(a.createDocumentFromUrl("C:\1.htm", "null"), mshtml.HTMLDocumentClass)
  End Sub

  Private Sub Form1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.DoubleClick
    With Me.CreateGraphics
      .Clear(Me.BackColor)
      .DrawString(CType(doc, IHTMLDocument2).readyState, Me.Font, New SolidBrush(Me.ForeColor), 0, 0)
    End With
  End Sub

  Private Sub doc_HTMLDocumentEvents2_Event_onreadystatechange(ByVal pEvtObj As mshtml.IHTMLEventObj) Handles doc.HTMLDocumentEvents2_Event_onreadystatechange
    MsgBox(doc.readyState)
  End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 03.05.2005 (Вт) 14:11

1. Так то так, но я ещё раз говорю, в процессе КОНСТРУКТОРА могли создаваться ресурсо-держащие элементы, которые уничтожаются.

В случае NET они не уничтожаются. Соответственно, либо руками, либо ждать. Вот и всё.


2. И чё? Знаешь у меня скока таких проблем? Я ж не выкладываю тут... Я буду больше проект собирать, нежели думать что к чему...

Надо? Мыль проект, тока выкинь всё не нужное и пиши чё надо.
ЗЫ: Кстати, а аналогом в FW не пользовались? (или он тока в 2.0 появился, незнаю)))
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru


Вернуться в Народный треп

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

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

    TopList