Сделал реализацию IDispatch в отдельном обьекте. Все работает!!! Теперь нужна помощь с BSTR и VARIANT. Есть ли библиотеки? В масме есть bstrlib.inc и bstrlib.lib. Как пользовать? .. Пардон, поспешил с вопросом ( SysAllocString )
застрял на IHTMLElementCollection::tags Код (Text): WSTR szMeta, "meta" ... LOCAL meta : VARIANT LOCAL pHTMLMetaColl : DWORD LOCAL pHTMLColl : DWORD ... invoke SysAllocString, offset szMeta lea edx, meta mov ( VARIANT ptr [ edx ] ).bstrVal, eax mov ( VARIANT ptr [ edx ] ).vt, VT_BSTR ... coinvoke pHTMLColl, IHTMLElementCollection, tags, addr meta, addr pHTMLMetaColl Не работает. Сомневаюсь, что правильно передаю параметр meta в функцию. По описанию метода нужно передать структуру, а не указатель на нее. Как сделать?
Правильно. Можешь посмотреть, как это делает си, а можешь просто скопировать её на стек (вариант вроде занимает 16 байт, сделай 4 раза пуш, например).
проблема с IHTMLElement::getAttribute Код (Text): _vtIHTMLElement MACRO CastName _vtIDispatch CastName &CastName&_setAttribute comethod4 ? &CastName&_getAttribute comethod4 ? ;... ENDM IHTMLElement STRUC _vtIHTMLElement IHTMLElement IHTMLElement ENDS PUSH_VARIANT MACRO vt, val sub esp, 10h mov eax, esp m2m dword ptr [ eax + 8 ], val ;VARIANT::__VARIANT_NAME_2 mov dword ptr [ eax ], vt ;VARIANT::vt ENDM ... LOCAL pHTMLElement : DWORD LOCAL name_ : DWORD LOCAL attrvalue : VARIANT invoke SysAllocString, offset szName mov name_, eax lea eax, pHTMLElement push eax PUSH_VARIANT VT_I4, ecx PUSH_VARIANT VT_I4, ecx COCALL pHTMLMetaColl, IHTMLElementCollection, item .IF_SUCCEEDED coinvoke pHTMLElement, IHTMLElement, getAttribute, name_, 0, addr attrvalue ... вылетает при getAttribute. Проганял в олли - идет обращение Код (Text): mov ecx, [ ebp + 8 ] cmp [ ecx + C ], 0 в ecx - 0 в моем коде PUSH_VARIANT VT_I4, ecx - ecx счетчик циклов. значение pHTMLElement проверял. pHTMLMetaColl - указатель на интерфейс IHTMLElementCollection, с ним тоже все нормально, т.к.до этого вызов pHTMLMetaColl->get_length возвращает правильное значение.
Все работает Продолжу спрашивать на тему COM здесь же. Как изменять документ до его отображения в окне браузера? Сейчас использую IDspatch::Invoke c dispid==DISPID_DOCUMENTCOMPLETE, но при появлении этого события документ уже отображен. Мне же нужно отфильтровать некоторые данные страницы ( например, тэги рисунков ) до отображения