Глубже в дебри HTML...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Глубже в дебри HTML...

Сообщение Antonariy » 28.04.2007 (Сб) 10:17

Понадобилась функция GetComputedStyle интерфейса IDisplayServices. MSDN объясняет как его получить:
You can obtain an IDisplayServices interface pointer by calling QueryInterface on an IHTMLDocument2 pointer. Use IID_IDisplayServices for the interface identifier (IID).
Нашел значение IID_IDisplayServices (кстати всем рекомендую сохранить эту страницу).
Пробую:
Код: Выделить всё
Private Type UUID
   Data1 As Long
   Data2 As Integer
   Data3 As Integer
   Data4(0 To 7) As Byte
End Type

Dim doc As IHTMLDocument2
Dim objdisp As IDisplayServices
Dim idisp As UUID
    Set doc = IE.document
    With idisp
        .Data1 = &H9DF65030
        .Data2 = &HB598
        .Data3 = &HCF11
        .Data4(0) = &HBB
        .Data4(1) = &H82
        .Data4(2) = &H0
        .Data4(3) = &HAA
        .Data4(4) = &H0
        .Data4(5) = &HBD
        .Data4(6) = &HCE
        .Data4(7) = &HB
    End With
    doc.QueryInterface idisp, objdisp
Говорит interface marked as restricted. Как все сделать правильно? Не нужна ли здесь случайно olelib? Если да, то каким боком?
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение GSerg » 28.04.2007 (Сб) 10:24

:roll:
Прямо захотелось даже сказать "раз".


QueryInterface'ом в VB занимается оператор Set.
Код: Выделить всё
Dim objdisp As IDisplayServices
Set objdisp = IE.document


Если не получается, значит в tlb интерфейс описан фигово. Опиши нормально.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.04.2007 (Сб) 10:33

Перемудрил... Работает. :oops:
Просто недавно обломался с похожим случаем в TAPI 3, где нужно было получить интерфейс из объекта входящего звонка. Нашел пример в MSDN (на vb!), где это делается точно так же банальным set'ом, но сколько не бился, получал type mismatch. MSDN'овский пример тупо не работал :?
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение GSerg » 28.04.2007 (Сб) 10:38

В MSDN немало бреда и ужаса в разделе "Примеры".
Поэтому использовать надо только теоретическую часть.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.04.2007 (Сб) 11:05

Собственно вот этот пример:
Код: Выделить всё
Dim WithEvents t3 As TAPI3Lib.TAPI

Private Sub t3_Event(ByVal TapiEvent As TAPI3Lib.TAPI_EVENT, ByVal pEvent As Object)
    ' pEvent is an IDispatch pointer for the ITCallNotificationEvent interface of the
    ' call object created by TAPI, and is passed into the event handler by TAPI.
    If TapiEvent = TE_CALLNOTIFICATION Then
        ' Get the ITCallNotification interface.
        Dim objCallNotificationEvent As ITCallNotificationEvent
        Set objCallNotificationEvent = pEvent
   
       'query ITCallInfo interface for the new call, and store it
        Dim gobjReceivedCallInfo As ITCallInfo
        Set gobjReceivedCallInfo = objCallNotificationEvent.Call
   
        ' Get the ITBasicCallControl interface.
        Dim objCallControl As ITBasicCallControl
        Set objCallControl = gobjReceivedCallInfo 'здесь происходит type mismatch!!!!!!!!!!!!!!!!!!!!!!!!
   
        ' Create the required terminals for this call.
        ' See the Select a Terminal code snippet.
       
        'Answer
        objCallControl.Answer
    End If
End Sub
Почему может происходить type mismatch, если объект этот интерфейс типа содержит? Если интерфейс не содержит данных (мало ли), не должно ли быть просто nothing без ошибки?
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение tyomitch » 28.04.2007 (Сб) 11:13

GSerg писал(а):В MSDN немало бреда и ужаса в разделе "Примеры".
Поэтому использовать надо только теоретическую часть.

К сожалению, и в теоретической части попадается бред.
Иногда его правят.
Поэтому я почти перестал юзать локальную версию MSDN.
Изображение


Вернуться в Visual Basic 1–6

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

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

    TopList