WebBrowser - отключить изображения

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

WebBrowser - отключить изображения

Сообщение djalex777 » 29.09.2010 (Ср) 23:50

Собственно вопрос - как сделать так, чтобы при использовании WebBrowser (к примеру при вызове Navigate) не загружались изображения, а всё остальное содержимое страниц загружалось? Читал про DLCTL_DLIMAGES, но там реализуется через имплементацию IDispatch, что в VB сделать довольно сложно, особенно без лишних dll. Может есть у кого какие-то мысли?

P.S. "Дерганье" реестра не рассматриваю

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

Re: WebBrowser - отключить изображения

Сообщение Antonariy » 30.09.2010 (Чт) 14:03

CoInternetSetFeatureEnabled
Лучший способ понять что-то самому — объяснить это другому.

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

Re: WebBrowser - отключить изображения

Сообщение Antonariy » 30.09.2010 (Чт) 14:07

А хотя там нет отключения картинок, только звуков.
Лучший способ понять что-то самому — объяснить это другому.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: WebBrowser - отключить изображения

Сообщение Vova_2581 » 30.09.2010 (Чт) 17:47

Дык WebBrowser реализуется на движке Internet Explorer а значит отключить картинки проще через реестр --
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main]
"Display Inline Images"="no" - откл. картинки.

Тока потом не забыть обратно включить --> "yes".

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: WebBrowser - отключить изображения

Сообщение Хакер » 30.09.2010 (Чт) 17:48

Vova_2581, умеешь ли ты читать?

djalex777 писал(а):P.S. "Дерганье" реестра не рассматриваю
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: WebBrowser - отключить изображения

Сообщение djalex777 » 01.10.2010 (Пт) 11:26

Вобщем переписываю я адрес функции Invoke интерфейса IDispatch в объекте WebBrowser.Application, на адрес своей функции.
Перехват
Код: Выделить всё
_declspec(dllexport) void _stdcall HookCOMTable(PDWORD pIntf, DWORD COMTableThunk, void* pNewFunc, PDWORD pOldMethodAddr)
{
PDWORD pTableThunk = (PDWORD)(*(PDWORD)(*pIntf)+COMTableThunk);
if(pOldMethodAddr!=NULL) *pOldMethodAddr = *pTableThunk;
DWORD op;
VirtualProtect(pTableThunk,4,PAGE_READWRITE,&op);
*pTableThunk = DWORD(pNewFunc);
...
}

Объявление в VB и использование
Код: Выделить всё
...
Public Declare Sub HookCOMTable Lib "iehelper.dll" (ByRef pIntObj As Long, ByVal COMTableThunk As Long, ByVal pNewFunc As Long, pOldMethodAddr As Long)
...
'Вызов
...
tableInc = 24
ptrInvoke = ObjPtr(WB.Application)
HookCOMTable ptrInvoke, tableInc, AddressOf Disp_Invoke, oldInvokeMethod
...
'Функция Disp_Invoke
...
Public Function Disp_Invoke( _
      ByVal This As Long, _
      ByVal dispIdMember As Long, _
      riid As olelib.UUID, _
      ByVal lcid As Long, _
      ByVal wFlags As Integer, _
      pDispParams As olelib.DISPPARAMS, _
      ByVal pVarResult As Long, _
      pExcepInfo As olelib.EXCEPINFO, _
      puArgErr As Long) As Long
Dim lw As Long
         
  On Error Resume Next
   
  lw = wFlags And DISPATCH_PROPERTYGET
   
  If (lw) <> 0& And pVarResult <> 0& Then
   Select Case dispIdMember
    Case DISPID_AMBIENT_DLCONTROL:
          'Вот тут я жду, что мне придет что-то
          ...
    Case Else:
          {INVOKE_ORIGINAL}
   End Select
  Else
          {INVOKE_ORIGINAL}
   End if
End Function
...



Всё нормально переадресуется в мою функцию, но Invoke с DISPID_AMBIENT_DLCONTROL не приходит. Насколько я понял, его должен вызывать WebBrowser для установки параметров загрузки документа. Ещё пробую вызвать OnAmbientPropertyChange с DISPID_AMBIENT_DLCONTROL через IOleControl
Код: Выделить всё
...
Dim iol As olelib.IOleControl
Set iol = WB.Application
iol.OnAmbientPropertyChange DISPID_AMBIENT_DLCONTROL
...

IOleControl взят из TLB Edanmo. Но опять ничего похожего на Invoke не приходит. Значит что-то я не так делаю, может не от того объекта IDispatch:Invoke перехватываю. Может кто знает от какого объекта перехватывать и может надо какой-то интерфейс имплиментить? Ещё вопрос - ObjPtr возвращает нам указатель на IUnknown?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: WebBrowser - отключить изображения

Сообщение Хакер » 01.10.2010 (Пт) 12:46

djalex777 писал(а):Перехват
Код: Выделить всё
_declspec(dllexport) void _stdcall HookCOMTable(PDWORD pIntf, DWORD COMTableThunk, void* pNewFunc, PDWORD pOldMethodAddr)
{
PDWORD pTableThunk = (PDWORD)(*(PDWORD)(*pIntf)+COMTableThunk);
if(pOldMethodAddr!=NULL) *pOldMethodAddr = *pTableThunk;
DWORD op;
VirtualProtect(pTableThunk,4,PAGE_READWRITE,&op);
*pTableThunk = DWORD(pNewFunc);
...
}


Буэ!!!

Код: Выделить всё
_declspec(dllexport) void _stdcall HookCOMTable(LPDWORD &pVTbl, UINT iVTblIndex, DWORD pNewFunc, LPDWORD pOldMethodAddr)
{
    DWORD op;
    VirtualProtect(&pVTbl[iVTblIndex], sizeof(DWORD), PAGE_READWRITE, &op);
    if(pOldMethodAddr != NULL) *pOldMethodAddr = pVTbl[iVTblIndex];
    pVTbl[iVTblIndex] = pNewFunc;
    ...
}


Код: Выделить всё
...
Public Declare Sub HookCOMTable Lib "iehelper.dll" (ByVal Obj As IUnknown, ByVal iVTableIndex As Long, ByVal pNewFunc As Long, pOldMethodAddr As Long)
...



Код: Выделить всё
...
'Вызов
...
tableInc = 6
HookCOMTable WB.Application, tableInc, AddressOf Disp_Invoke, oldInvokeMethod
...



djalex777 писал(а):Всё нормально переадресуется в мою функцию, но Invoke с DISPID_AMBIENT_DLCONTROL не приходит.

Сомнительно, что твой вариант работал, потому что у тебя было 24, а не 6. Соответственно, ты «перехватывал» какую-то чужую VTable.


Ещё вопрос - ObjPtr возвращает нам указатель на IUnknown?

ObjPtr это просто по-другому объявленная VarPtr. Возвращает она ровно то, что в неё передают. VB в процессе кастования приводит ссылку к интерфейному указателю типа IUnknown и его передаёт. Так что ObjPtr(она же VarPtr) его и возвращает, да.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: WebBrowser - отключить изображения

Сообщение djalex777 » 01.10.2010 (Пт) 12:52

Хакер писал(а):Сомнительно, что твой вариант работал, потому что у тебя было 24, а не 6. Соответственно, ты «перехватывал» какую-то чужую VTable.

ммм... 6 по счету будет Invoke, но в таблице каждый адрес занимает 4 байта, поэтому к началу таблицы прибавляю 24. Разве не так?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: WebBrowser - отключить изображения

Сообщение Хакер » 01.10.2010 (Пт) 12:56

djalex777 писал(а):6 по счету будет Invoke

Так.

djalex777 писал(а):но в таблице каждый адрес занимает 4 байта

Так.

djalex777 писал(а):поэтому к началу таблицы прибавляю 24

К численному значению адреса начала таблицы нужно прибавлять число 24. Но ты ведь работаешь не с численным значением, а с указателем.

Код: Выделить всё
DWORD *a;


a+1 — это указатель на следующий за *a DWORD, а не на DWORD, лежащий на 1 байт дальше, чем *a.

Расстояние в байтах между *(a+1) и *(a-1) составит 8 байт, а не два байта, как тебе кажется.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: WebBrowser - отключить изображения

Сообщение djalex777 » 01.10.2010 (Пт) 13:11

Я согласен с тобой, но это относится к твоему варианту функции. Посмотри на мой вариант ещё раз
Код: Выделить всё
function(PDWORD pIntf, DWORD COMTableThunk)
...
PDWORD pTableThunk = (PDWORD)(*(PDWORD)(*pIntf)+COMTableThunk)
...

Что будет в pTableThunk?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: WebBrowser - отключить изображения

Сообщение Хакер » 01.10.2010 (Пт) 13:12

Указатель на 24-ую (считая от нуля) ячейку таблицы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: WebBrowser - отключить изображения

Сообщение djalex777 » 01.10.2010 (Пт) 13:50

Тогда почему при передаче объекта WB (WebBrowser) в твою и мою функцию, они возвращают одинаковый адрес старой функции? Твой вариант не работает с WB.Application - не переадресует в мою функцию.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: WebBrowser - отключить изображения

Сообщение Хакер » 01.10.2010 (Пт) 14:26

djalex777 писал(а):Тогда почему при передаче объекта WB (WebBrowser) в твою и мою функцию, они возвращают одинаковый адрес старой функции?

Везёт. VTable-ы идут в образе подряд, +6 и +24 -ые ячейки указывают на одну и ту же реализацию (Invoke).

djalex777 писал(а):Твой вариант не работает с WB.Application - не переадресует в мою функцию.

Вообще?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: WebBrowser - отключить изображения

Сообщение djalex777 » 01.10.2010 (Пт) 14:35

Да. При WB.Application даже намека на вызов моей функции нет.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: WebBrowser - отключить изображения

Сообщение Хакер » 01.10.2010 (Пт) 15:02

А ты точно используешь мой вариант объявления с моим вариантом функции?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: WebBrowser - отключить изображения

Сообщение djalex777 » 01.10.2010 (Пт) 15:32

Да. Может ты имел ввиду
Код: Выделить всё
Public Declare Sub HookCOMTable Lib "iehelper.dll" (ByVal obj As Any, ByVal iVTableIndex As Long, ByVal pNewFunc As Long, pOldMethodAddr As Long)

А почему таким методом не получается перехватывать Invoke в VB-классах (которые мы сами создаем в IDE) в EXE?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: WebBrowser - отключить изображения

Сообщение Хакер » 01.10.2010 (Пт) 16:03

По-моему ты что-то сочиняшь.

Методу абсолютно всё равно, что и как перехватывать. Он должен работать, но я допускаю, что в моём коде есть незначительная ошибка, потому что я писал его сходу и, конечно, не тестировал.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: WebBrowser - отключить изображения

Сообщение djalex777 » 01.10.2010 (Пт) 16:40

Со свойствами (в частности - не загружать изображения) разобрался - нужно перехватывать Invoke на IOleClientSite из IOleObject объекта WB.Application

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: WebBrowser - отключить изображения

Сообщение Хакер » 01.10.2010 (Пт) 17:49

Как можно перехватить IOleClientSite::Invoke, не перехватив при этом IDispatch::Invoke (и наоборот)?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: WebBrowser - отключить изображения

Сообщение djalex777 » 01.10.2010 (Пт) 18:04

IOleClientSite получаем через IOleObject.GetClientSite

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: WebBrowser - отключить изображения

Сообщение Хакер » 01.10.2010 (Пт) 18:08

Ну ты понял, почему надо прибавлять 6, а не 24?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: WebBrowser - отключить изображения

Сообщение djalex777 » 01.10.2010 (Пт) 18:19

Да, спасибо за разъяснение.

pertov
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 20.12.2014 (Сб) 17:51

Re: WebBrowser - отключить изображения

Сообщение pertov » 07.12.2017 (Чт) 1:42

Ответ на вопрос без всяких dll:
Вложения
AMBIENT_DLCONTROL.rar
(9.7 Кб) Скачиваний: 203


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

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

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

    TopList