проблема с QueryInterface для IHTMLSelectElement

Тема в разделе "WASM.WIN32", создана пользователем asmic, 19 июл 2007.

  1. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Добрый вечер. У меня такая проблемма. Вызываю метод call dword ptr (IHTMLFormElementVtbl ptr [eax]).item. Все ок. Потом вызываю метод call dword ptr (IDispatchVtbl ptr [eax]).QueryInterface для того чтобы получить pHITE ( IHTMLInputTextElement ). Все отлично. Но когда я вызываю метод call dword ptr (IDispatchVtbl ptr [eax]).QueryInterface, и пытаюсь получить pHSE ( IHTMLSelectElement ). То возвращаемое значение S_FALSE.
    Почему я могу получить IHTMLInputTextElement, а IHTMLSelectElement нет? В чем может быть проблемма? У кого какие мысли по этому поводу.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Зависит от того, какой элемент. из input type="text" нельзя получить input type="select".
     
  3. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    --------------------
    lea eax, pITEDisp
    push eax
    push 0
    push jCount
    push 0
    push VT_I4
    push 0
    push jCount
    push 0
    push VT_I4
    mov eax, pHFE
    push eax
    mov eax, [eax]
    call dword ptr (IHTMLFormElementVtbl ptr [eax]).item

    lea eax, pHITE
    push eax
    push offset IID_IHTMLInputTextElement
    mov eax, pITEDisp
    push eax
    mov eax, [eax]
    call dword ptr (IDispatchVtbl ptr [eax]).QueryInterface - так S_OK
    . . . . .
    lea eax, pHSE
    push eax
    push offset IID_IHTMLSelectElement
    mov eax, pITEDisp
    push eax
    mov eax, [eax]
    call dword ptr (IDispatchVtbl ptr [eax]).QueryInterface - а так S_FALSE
    ----------------

    Как думаете в чем дело?
     
  4. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    Получать указатель на IHTMLElement, а из него уже действовать в зависимости от tagName, если это select, то тогда уже получать указатель на IHTMLSelectElement.
     
  5. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Дело в том что я не хочу получить указатель на IHTMLInputElement. Я его заменил IHTMLInputTextElement. Мне нужно получить указатель на IHTMLSelectElement. Но почему то я не могу его получить. Я не понимаю почему указатель на IHTMLInputTextElement получаю. А указатель на IHTMLSelectElement я получить не могу. Из кода видно что получить то я его должен успешно. А в реале, немогу. В чем дело? Может указатель на IHTMLSelectElement, можно получить другим способом?
     
  6. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    Точно, что-то я невнимательно прочитал ;).
    Как уже сказал выше IceStudent, элемент под данным item'ом не обязан быть Select'ом (в твоем случае видимо он как раз является InputText'ом), потому тебе и возвращается FALSE.
     
  7. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Спасибо. Но как мне получить указатель на IHTMLSelectElement? Ведь с помощью item я получаю IDispatch на IHTMLFormElement ( т.е. на все элементы формы, включая input и select ). А уж потом через этот IDispatch, я могу получить указатели на IHTMLInputTextElement и на IHTMLSelectElement ( потому что они находятся в одной форме ). Или я не прав? Если я не прав, то как мне другим путем получить указатель на IHTMLSelectElement? Другого пути я не вижу. Как?
     
  8. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Читать доку. Разбавлять ноотропами.
     
  9. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Извини, но я не понял что ты имеешь ввиду.
     
  10. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    asmic
    Я делал так - сначало получаем у IWebBrowser2 IDispatch, который представляем весь документ. Потом у IDispatch вызываем метод get_all получая IHtmlElementCollection, потом вызывая метод item, получаем IHtmlElement. Уже после этого можно пытаться с помощью QueryInterface получить IHTMLSelectElement или IHTMLInputTextElement и т.д. Если в этом вызове QueryInterface вызов заканчивается неудачей, значит данный элемент селектом/инпутом/и т.д. не является, поэтому и не поддерживает соответствующий интерфейс.
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    А не проще, как был сказано выше, действовать в зависимости от tagName. Тем более, это и верный путь, чем перебирать все интерфейсы.
     
  12. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Спасибо. Я вместо метода get_all, вызывал get_forms. Буду пробовать по твоему совету. Вызову get_all. Потом отпишу о результатах.
     
  13. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Всем спасибо. Во всем разобрался.
     
  14. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    IceStudent
    Можно и tagName, я просто показал один из способов.
     
  15. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Я разобрался как получить указатель на интерфейс IHTMLSelectElement. Но я все равно не могу его получить, если в форме кроме Select есть еще и Input элементы. В этом моя проблема осталась. Но я постараюсь разобратся в этом.
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Перебирай все элементы, пока tagName не будет равно "select".
     
  17. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141
  18. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Спасибо. Буду разбиратся.
     
  19. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Я так понял что в этом коде ищются элементы по всему документу ( с помощью IHTMLElement::get_tagName ). А можно ли сделать тоже самое, только не по всему документу а внутри формы? Я предполагаю это можно сделать с помощью IHTMLFormElement::tags. Я прав? Если нет, то как?
     
  20. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    IHTMLFormElement::elements, IHTMLElement::children - у тебя что, справки нет?