COM и MASM32

Тема в разделе "WASM.ASSEMBLER", создана пользователем psu, 12 янв 2007.

  1. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    Сделал реализацию IDispatch в отдельном обьекте. Все работает!!!
    Теперь нужна помощь с BSTR и VARIANT. Есть ли библиотеки? В масме есть bstrlib.inc и bstrlib.lib. Как пользовать?
    ..

    Пардон, поспешил с вопросом ( SysAllocString )
     
  2. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    застрял на IHTMLElementCollection::tags

    Код (Text):
    1. WSTR szMeta, "meta"
    2. ...
    3.  
    4. LOCAL meta : VARIANT
    5. LOCAL pHTMLMetaColl : DWORD
    6. LOCAL pHTMLColl : DWORD
    7. ...
    8.  
    9. invoke SysAllocString, offset szMeta
    10. lea edx, meta
    11. mov ( VARIANT ptr [ edx ] ).bstrVal, eax
    12. mov ( VARIANT ptr [ edx ] ).vt, VT_BSTR
    13.  
    14. ...
    15. coinvoke pHTMLColl, IHTMLElementCollection, tags, addr meta, addr pHTMLMetaColl
    Не работает. Сомневаюсь, что правильно передаю параметр meta в функцию. По описанию метода нужно передать структуру, а не указатель на нее. Как сделать?
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Правильно. Можешь посмотреть, как это делает си, а можешь просто скопировать её на стек (вариант вроде занимает 16 байт, сделай 4 раза пуш, например).
     
  4. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    проблема с IHTMLElement::getAttribute

    Код (Text):
    1. _vtIHTMLElement MACRO CastName
    2.     _vtIDispatch CastName
    3.  
    4.     &CastName&_setAttribute comethod4 ?
    5.     &CastName&_getAttribute comethod4 ?
    6.     ;...
    7. ENDM
    8.  
    9. IHTMLElement STRUC
    10.     _vtIHTMLElement IHTMLElement
    11. IHTMLElement ENDS
    12.  
    13. PUSH_VARIANT MACRO vt, val
    14.     sub esp, 10h
    15.     mov eax, esp
    16.  
    17.     m2m dword ptr [ eax + 8 ], val      ;VARIANT::__VARIANT_NAME_2
    18.     mov dword ptr [ eax ], vt           ;VARIANT::vt
    19. ENDM
    20.  
    21. ...
    22.  
    23. LOCAL pHTMLElement : DWORD
    24. LOCAL name_ : DWORD
    25. LOCAL attrvalue : VARIANT
    26.  
    27. invoke SysAllocString, offset szName
    28. mov name_, eax
    29.  
    30. lea eax, pHTMLElement
    31. push eax
    32. PUSH_VARIANT VT_I4, ecx
    33. PUSH_VARIANT VT_I4, ecx
    34. COCALL pHTMLMetaColl, IHTMLElementCollection, item
    35.  
    36. .IF_SUCCEEDED
    37. coinvoke pHTMLElement, IHTMLElement, getAttribute, name_, 0, addr attrvalue
    38. ...
    вылетает при getAttribute. Проганял в олли - идет обращение

    Код (Text):
    1. mov ecx, [ ebp + 8 ]
    2. cmp [ ecx + C ], 0
    в ecx - 0 :dntknw:

    в моем коде PUSH_VARIANT VT_I4, ecx - ecx счетчик циклов.
    значение pHTMLElement проверял.
    pHTMLMetaColl - указатель на интерфейс IHTMLElementCollection, с ним тоже все нормально, т.к.до этого вызов pHTMLMetaColl->get_length возвращает правильное значение.
     
  5. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    Все работает :)
    Продолжу спрашивать на тему COM здесь же.
    Как изменять документ до его отображения в окне браузера? Сейчас использую IDspatch::Invoke c dispid==DISPID_DOCUMENTCOMPLETE, но при появлении этого события документ уже отображен. Мне же нужно отфильтровать некоторые данные страницы ( например, тэги рисунков ) до отображения