Посоветуйте компонент аналог WebBrowser

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ahilesul
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.02.2011 (Пт) 11:03

Посоветуйте компонент аналог WebBrowser

Сообщение ahilesul » 11.08.2012 (Сб) 15:23

Есть необходимость заходить на опр. сайт для получения инфы. На сайте стоит ограничение - в сутки с одного IP один только заход можно. Счас автоматизировал на базе WebBrowser - юзаю прокси (программно меняю настройки соединения) для смены IP. Но не устраивает скорость - нельзя одновременно открыть 10 браузеров с разными проксями для каждого, в один момент времени идет один прокси для всех - так как берется из сист. настроек соединения. Есть ли компонент-аналог у которого настр. соединения не глобальные? чтобы можно было за раз сделать запрос с нескольких прокси

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

Re: Посоветуйте компонент аналог WebBrowser

Сообщение Хакер » 11.08.2012 (Сб) 18:56

—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 11.08.2012 (Сб) 20:18

А ahilesul не говорил, что отображаь не надо :)

ahilesul писал(а):нельзя одновременно открыть 10 браузеров с разными проксями для каждого

Если постараться, то можно ;)

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

Re: Посоветуйте компонент аналог WebBrowser

Сообщение Хакер » 11.08.2012 (Сб) 20:52

Qwertiy писал(а):А ahilesul не говорил, что отображаь не надо :)

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

ahilesul
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.02.2011 (Пт) 11:03

Re: Посоветуйте компонент аналог WebBrowser

Сообщение ahilesul » 12.08.2012 (Вс) 7:07

Qwertiy писал(а):А ahilesul не говорил, что отображаь не надо :)

ahilesul писал(а):нельзя одновременно открыть 10 браузеров с разными проксями для каждого

Если постараться, то можно ;)

подскажи как сделать именно для Webbrowser (IE) ?

Хакер писал(а)::evil:
viewtopic.php?f=56&t=40300
:evil:

:) ну проблема только в одновременном открытии с разными проксями для каждого экземпляра компонента-браузера

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Re: Посоветуйте компонент аналог WebBrowser

Сообщение Алексей К. » 12.08.2012 (Вс) 7:40

И снова здравствуйте! перелогинился с ahilesul - вспомнил старый логин и пароль :), вновь пришлось обратиться сюда, давно не был. Просто по быстрому решил задачу по старой памяти с webbrowser, счас вот покурю WinHTTPRequest

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.08.2012 (Вс) 10:09

ahilesul писал(а):подскажи как сделать именно для Webbrowser (IE) ?

Если по-хорошему, то, думаю, примерно так же, как с отключением картинок (поищи по форуму).
Если кое-как по-быстрому и без гарантий - ставить соответствующий прокси и слать контролу сообщение об изменении параметров. Хотя, не знаю, будет ли это вообще работать.

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Re:

Сообщение Алексей К. » 12.08.2012 (Вс) 12:29

Qwertiy писал(а):
ahilesul писал(а):подскажи как сделать именно для Webbrowser (IE) ?

Если кое-как по-быстрому и без гарантий - ставить соответствующий прокси и слать контролу сообщение об изменении параметров. Хотя, не знаю, будет ли это вообще работать.

не будет, пробывал, мы же меняем настройки дефолтного соединения - они соотв. едины в один срез времени для всех экземпляров браузера.

программная смена прокси (настройка интернет соединения):
Код: Выделить всё
Private Type INTERNET_PER_CONN_OPTION
    dwOption As Long
    dwValue1 As Long
    dwValue2 As Long
End Type
Private Type INTERNET_PER_CONN_OPTION_LIST
    dwSize As Long
    pszConnection As Long
    dwOptionCount As Long
    dwOptionError As Long
    pOptions As Long
End Type
Private Const INTERNET_PER_CONN_FLAGS As Long = 1
Private Const INTERNET_PER_CONN_PROXY_SERVER As Long = 2
Private Const INTERNET_PER_CONN_PROXY_BYPASS As Long = 3
Private Const PROXY_TYPE_DIRECT As Long = &H1
Private Const PROXY_TYPE_PROXY As Long = &H2
Private Const INTERNET_OPTION_REFRESH As Long = 37
Private Const INTERNET_OPTION_SETTINGS_CHANGED As Long = 39
Private Const INTERNET_OPTION_PER_CONNECTION_OPTION As Long = 75
Private Declare Function InternetSetOption _
        Lib "wininet.dll" Alias "InternetSetOptionA" ( _
        ByVal hInternet As Long, ByVal dwOption As Long, _
        lpBuffer As Any, ByVal dwBufferLength As Long) As Long
' Set Proxy
Public Function SetConnectionOptions (ByVal conn_name As String, ByVal proxy_full_addr As String) As Boolean
' conn_name: active connection name. (LAN = "")
' proxy_full_addr : eg "193.28.73.241:8080"
Dim list As INTERNET_PER_CONN_OPTION_LIST
Dim bReturn As Boolean
Dim dwBufSize As Long
Dim options(0 To 2) As INTERNET_PER_CONN_OPTION
Dim abConnName() As Byte
Dim abProxyServer() As Byte
Dim abProxyBypass() As Byte
   
    dwBufSize = Len(list)
   
    ' Fill out list struct.
    list.dwSize = Len(list)
   
    ' NULL == LAN, otherwise connection name.
    abConnName() = StrConv(conn_name & vbNullChar, vbFromUnicode)
    list.pszConnection = VarPtr(abConnName(0))
   
    ' Set three options.
    list.dwOptionCount = 3
    ' Set flags.
    options(0).dwOption = INTERNET_PER_CONN_FLAGS
    options(0).dwValue1 = PROXY_TYPE_DIRECT Or PROXY_TYPE_PROXY
    ' Set proxy name.
    options(1).dwOption = INTERNET_PER_CONN_PROXY_SERVER
    abProxyServer() = StrConv(proxy_full_addr & vbNullChar, vbFromUnicode)
    options(1).dwValue1 = VarPtr(abProxyServer(0))  '//"http://proxy:80"
    ' Set proxy override.
    options(2).dwOption = INTERNET_PER_CONN_PROXY_BYPASS
    abProxyBypass() = StrConv("local" & vbNullChar, vbFromUnicode)
    options(2).dwValue1 = VarPtr(abProxyBypass(0))
    list.pOptions = VarPtr(options(0))
    ' Make sure the memory was allocated.
    If (0& = list.pOptions) Then
        ' Return FALSE if the memory wasn't allocated.
        Debug.Print "Failed to allocate memory in SetConnectionOptions()"
        SetConnectionOptions = 0
    End If
    ' Set the options on the connection.
    bReturn = InternetSetOption(0, INTERNET_OPTION_PER_CONNECTION_OPTION, list, dwBufSize)
    ' Free the allocated memory.
    Erase options
    Erase abConnName
    Erase abProxyServer
    Erase abProxyBypass
    dwBufSize = 0
    list.dwOptionCount = 0
    list.dwSize = 0
    list.pOptions = 0
    list.pszConnection = 0
    Call InternetSetOption(0, INTERNET_OPTION_SETTINGS_CHANGED, ByVal 0&, 0)
    Call InternetSetOption(0, INTERNET_OPTION_REFRESH, ByVal 0&, 0)
    SetConnectionOptions = bReturn
End Function
' Disable Proxy
Public Function DisableConnectionProxy (ByVal conn_name As String) As Boolean
' conn_name: active connection name. (LAN = "")
Dim list As INTERNET_PER_CONN_OPTION_LIST
Dim bReturn As Boolean
Dim dwBufSize As Long
Dim options(0) As INTERNET_PER_CONN_OPTION
Dim abConnName() As Byte
   
    dwBufSize = Len(list)
   
    ' Fill out list struct.
    list.dwSize = Len(list)
   
    ' NULL == LAN, otherwise connectoid name.
    abConnName() = StrConv(conn_name & vbNullChar, vbFromUnicode)
    list.pszConnection = VarPtr(abConnName(0))
   
    ' Set three options.
    list.dwOptionCount = 1
    ' Set flags.
    options(0).dwOption = INTERNET_PER_CONN_FLAGS
    options(0).dwValue1 = PROXY_TYPE_DIRECT
    list.pOptions = VarPtr(options(0))
    ' Make sure the memory was allocated.
    If (0 = list.pOptions) Then
        ' Return FALSE if the memory wasn't allocated.
        Debug.Print "Failed to allocate memory in DisableConnectionProxy()"
        DisableConnectionProxy = 0
    End If
    ' Set the options on the connection.
    bReturn = InternetSetOption(0, INTERNET_OPTION_PER_CONNECTION_OPTION, list, dwBufSize)
   
    ' Free the allocated memory.
    Erase options
    Erase abConnName
    dwBufSize = 0
    list.dwOptionCount = 0
    list.dwSize = 0
    list.pOptions = 0
    list.pszConnection = 0
    Call InternetSetOption(0, INTERNET_OPTION_SETTINGS_CHANGED, ByVal 0&, 0)
    Call InternetSetOption(0, INTERNET_OPTION_REFRESH, ByVal 0&, 0)
    DisableConnectionProxy = bReturn
End Function

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.08.2012 (Вс) 20:54

Алексей К. писал(а):мы же меняем настройки дефолтного соединения - они соотв. едины в один срез времени для всех экземпляров браузера

При условии, что все эти экземпляры узнают об этом.

Алексей К. писал(а):программная смена прокси (настройка интернет соединения):

А если менять непосредственно нужный ключ в реестре?

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Re:

Сообщение Алексей К. » 13.08.2012 (Пн) 6:53

Qwertiy писал(а):А если менять непосредственно нужный ключ в реестре?


пока что не пробывал, но чисто логически:
Код: Выделить всё
"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyServer, прокся"
"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyEnable", 1, "REG_DWORD"


опять же у нас один ключ на все экз. браузера будет для тек. пользователя. если только как-то запускать кажд. экземпляр браузера под другим пользователем + наделать кучу пользователей :)

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.08.2012 (Пн) 7:33

Алексей К. писал(а):опять же у нас один ключ на все экз. браузера будет для тек. пользователя

Да. Но как запущенный браузер узнает о том, что значение поменялось? Если только ты сам не пошлёшь ему SendMessage(Hwnd, WM_SETTINGCHANGE, 0, 0)? Система ведь это рассылать не будет на изменение ключа реестра. Вопрос только, не проверяет ли он эти данные по таймеру или (что совсем плохо) перед открытием страницы.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Посоветуйте компонент аналог WebBrowser

Сообщение iGrok » 13.08.2012 (Пн) 10:04

Вам что, заняться нечем?
Сказали же, используйте WinHTTPRequest. Там и прокси спокойно ставится, и в целом это более правильное решение.

Вопрос же с установкой прокси для разных экземпляров IE решается простым чтением документации (MSDN), а никак не пережёвывнием одной и той же информации...

INTERNET_OPTION_PER_CONNECTION_OPTION
75

Sets or retrieves an INTERNET_PER_CONN_OPTION_LIST structure that specifies a list of options for a particular connection. This is used by InternetQueryOption and InternetSetOption. This option is only valid in Internet Explorer 5 and later.

Note INTERNET_OPTION_PER_CONNECTION_OPTION causes the settings to be changed on a system-wide basis when a NULL handle is used in the call to InternetSetOption. To refresh the global proxy settings, you must call InternetSetOption with the INTERNET_OPTION_REFRESH option flag.

Note To change proxy information for the entire process without affecting the global settings in Internet Explorer 5 and later, use this option on the handle that is returned from InternetOpen. The following code example changes the proxy for the whole process even though the HINTERNET handle is closed and is not used by any requests.

For more information and code examples, see KB article 226473.


При этом меняться настройки всё равно будут для всего процесса целиком, т.е. для всех запущенных в нём экземпляров WB.
label:
cli
jmp label

Santa
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 101
Зарегистрирован: 07.05.2004 (Пт) 1:34
Откуда: KZ

Re: Посоветуйте компонент аналог WebBrowser

Сообщение Santa » 13.08.2012 (Пн) 11:21

Хакер писал(а)::evil:
viewtopic.php?f=56&t=40300
:evil:

Может и не совсем по теме, но спрошу. После загрузки кода без отображения, как выдёргивать содержимое тегов с помощью getElementsByTagName или getElementByID, есть ли такая возможность у WinHTTPRequest?
SIVIS PACEM PARA BELLUM

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Посоветуйте компонент аналог WebBrowser

Сообщение iGrok » 13.08.2012 (Пн) 11:49

Santa писал(а):После загрузки кода без отображения, как выдёргивать содержимое тегов с помощью getElementsByTagName или getElementByID, есть ли такая возможность у WinHTTPRequest?

Нету. WHR только отдаст результат запроса в виде текста. Дальше его нужно разбирать уже самому. Для того, чтобы получить из текста ответа DOM, существуют html-парсеры, например MSHTML. А дальше уже можно и getElementsByTagName, и getElementByID, и всё остальное, что умеет webbrowser, кроме отображения.
label:
cli
jmp label

Santa
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 101
Зарегистрирован: 07.05.2004 (Пт) 1:34
Откуда: KZ

Re: Посоветуйте компонент аналог WebBrowser

Сообщение Santa » 13.08.2012 (Пн) 12:17

iGrok писал(а):WHR только отдаст результат запроса в виде текста.

Но и это не всегда возможно. Последний раз столкнулся с этим Изображение
решить так и не смог.
SIVIS PACEM PARA BELLUM

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.08.2012 (Пн) 13:17

Santa писал(а):Изображение

VB6 или более ранний?

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Re: Посоветуйте компонент аналог WebBrowser

Сообщение Алексей К. » 13.08.2012 (Пн) 16:02

iGrok писал(а):Вам что, заняться нечем?
Сказали же, используйте WinHTTPRequest. Там и прокси спокойно ставится, и в целом это более правильное решение.


уже заюзал, вроде робит, отлаживаю :)

Santa
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 101
Зарегистрирован: 07.05.2004 (Пт) 1:34
Откуда: KZ

Re:

Сообщение Santa » 13.08.2012 (Пн) 16:20

Qwertiy писал(а):VB6 или более ранний?

VB5
SIVIS PACEM PARA BELLUM

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.08.2012 (Пн) 16:45

Santa писал(а):
Qwertiy писал(а):VB6 или более ранний?

VB5

Если не ошибаюсь, шестой первый поддерживает юникод. Так что, в нём с этим не должно быть проблем.

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

Re: Посоветуйте компонент аналог WebBrowser

Сообщение Хакер » 13.08.2012 (Пн) 16:53

Qwertiy писал(а):Если не ошибаюсь, шестой первый поддерживает юникод. Так что, в нём с этим не должно быть проблем.

Ошибаешься. 5-ый первый. 4-ый не поддерживал.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Посоветуйте компонент аналог WebBrowser

Сообщение iGrok » 13.08.2012 (Пн) 19:59

Santa писал(а):решить так и не смог

Возможно, кривой (битый) ответ от сервера приходит. Помимо ResponseText есть ещё ResponseBody, через который можно получить массив байт, и посмотреть, что же в нём не так.
label:
cli
jmp label

Santa
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 101
Зарегистрирован: 07.05.2004 (Пт) 1:34
Откуда: KZ

Re: Посоветуйте компонент аналог WebBrowser

Сообщение Santa » 14.08.2012 (Вт) 3:19

iGrok писал(а):Возможно, кривой (битый) ответ от сервера приходит. Помимо ResponseText есть ещё ResponseBody, через который можно получить массив байт, и посмотреть, что же в нём не так.

Получил, сохранил, не меняя данных в файле залил его к себе на сайт и обратился к нему, так самое, что интересное, ни каких проблем, всё работает как часы. Возможно в полученном массиве уже и нет ошибки?

Так же выкачивал код страницы винсоком и качалкой tyomitch'а, код приходит без искажений и всегда один и тотже.
SIVIS PACEM PARA BELLUM

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Посоветуйте компонент аналог WebBrowser

Сообщение iGrok » 14.08.2012 (Вт) 14:09

О как. Тогда возможно дело в том, что кодировка, возвращаемая сервером в заголовках, не соответствует реальной кодировке возвращаемых данных.
Последний раз редактировалось iGrok 14.08.2012 (Вт) 14:20, всего редактировалось 1 раз.
label:
cli
jmp label

Santa
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 101
Зарегистрирован: 07.05.2004 (Пт) 1:34
Откуда: KZ

Re: Посоветуйте компонент аналог WebBrowser

Сообщение Santa » 14.08.2012 (Вт) 19:02

iGrok писал(а):О как. Тогда возможно дело в том, что кодировка, возвращаемая сервером в заголовках, не соответствует реальной кодировке возвращаемых данных.

А как можно проверить соответствие? StatusText и в заголовках одинаково
Изображение
ResponseBody, как я понимаю, тож всё нормально, кодировка ANSI.
SIVIS PACEM PARA BELLUM

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Посоветуйте компонент аналог WebBrowser

Сообщение iGrok » 14.08.2012 (Вт) 23:36

Тогда чёрт его знает. Надо в отладчик лезть, и смотреть, где и на чём он спотыкается.
Вот такая конструкция с 13-e.ru (я ведь правильно нашёл?) отработала корректно:
Код: Выделить всё
    Dim b() As Byte
    b = wr.ResponseBody
    MsgBox StrConv(b, vbUnicode)
label:
cli
jmp label

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

Re: Посоветуйте компонент аналог WebBrowser

Сообщение Хакер » 15.08.2012 (Ср) 0:32

iGrok писал(а):
Код: Выделить всё
    Dim b() As Byte
    b = wr.ResponseBody
    MsgBox StrConv(b, vbUnicode)

Очень плохой код! Заклад на то, что (1) сайт выдаёт данные в ANSI и (2) кодировкой является та же кодировка, что и установлена в системе в данный момент в качестве кодировки по-умолчанию для неюникодных приложений. Надо использовать MultiByteTWideChar и только.

К тому же.
В соответствии с RFC, значением поля «charset» заголовка «Content-Type» должен являться один из токенов, определённый в реестре кодировок IANA (IANA Character Set registry)

В соответствие с IANA Character Set registry нет такой кодировки cp1251, есть только кодировка windows-1251 и её псевдонимом токен cp1251 не является.
Пруфлинк: http://www.iana.org/assignments/character-sets

Так что сайт кривой, веб-мастер должен быть бит по морде :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Посоветуйте компонент аналог WebBrowser

Сообщение iGrok » 15.08.2012 (Ср) 0:50

Я и не предлагаю его использовать. Речь только о том, что сами данные winhttp с этого сайта получает корректно, и их таки можно увидеть.
label:
cli
jmp label

Santa
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 101
Зарегистрирован: 07.05.2004 (Пт) 1:34
Откуда: KZ

Re: Посоветуйте компонент аналог WebBrowser

Сообщение Santa » 15.08.2012 (Ср) 5:46

Хакер писал(а):веб-мастер должен быть бит по морде :)

Я не против, только это будет дороговато потом стоить :)
Так как же всё таки быть с кодом на стороне клиента? Хотя, вопрос наверное уже риторический. Код страницы можно просто сохранить в файл, только вот как быть дальше? Как выдёргивать содержимое тегов с помощью getElementsByTagName или getElementByID!? Вот код, вот MSHTML, а что с ними делать? Если не сложно, ткните пальцем в нужное место(только не в глаз), узреть рабочий код очень хочется.
SIVIS PACEM PARA BELLUM

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Re: Посоветуйте компонент аналог WebBrowser

Сообщение Алексей К. » 15.08.2012 (Ср) 7:57

добил свою задачу - тож ковырялся долго с responsetext с русским языком - кракозяблами, в итоге выдернул из responsebody и заюзал Хакерный MultiByteTWideChar
Код: Выделить всё
Private Const CP_UTF8 = 65001
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, lpMultiByteStr As Any, ByVal cchMultiByte As Long, lpWideCharStr As Any, ByVal cchWideChar As Long) As Long
Public Function Utf8ToUcs2(ByRef sInput As String) As String
    Dim ret As Long
    If Len(sInput) = 0 Then Exit Function Else Utf8ToUcs2 = Space(Len(sInput))
    ret = MultiByteToWideChar(CP_UTF8, 0, _
                              ByVal StrPtr(sInput), Len(sInput), _
                              ByVal StrPtr(Utf8ToUcs2), LenB(Utf8ToUcs2))
    If ret = 0 Then Error 51 Else Utf8ToUcs2 = Left$(Utf8ToUcs2, ret)
End Function
Public Function Utf8AsIsToUcs2(ByRef sAsIsBytes As String) As String
    Dim ret As Long
    Dim nInpLength As Long: nInpLength = LenB(sAsIsBytes)
    If nInpLength = 0 Then Exit Function Else Utf8AsIsToUcs2 = Space(nInpLength)
    ret = MultiByteToWideChar(CP_UTF8, 0, _
                              ByVal StrPtr(sAsIsBytes), nInpLength, _
                              ByVal StrPtr(Utf8AsIsToUcs2), nInpLength)
    If ret = 0 Then Error 51 Else Utf8AsIsToUcs2 = Left$(Utf8AsIsToUcs2, ret)
End Function

в который раз этот форум помогает и так оперативно, всем респект :)

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

Re: Посоветуйте компонент аналог WebBrowser

Сообщение Хакер » 15.08.2012 (Ср) 8:03

Santa писал(а):Код страницы можно просто сохранить в файл, только вот как быть дальше? Как выдёргивать содержимое тегов с помощью getElementsByTagName или getElementByID!? Вот код, вот MSHTML, а что с ними делать? Если не сложно, ткните пальцем в нужное место(только не в глаз), узреть рабочий код очень хочется.

Зачем в файл сохранять?

Всё очень просто.
  1. Создать объект класса HTMLDocument (с помощью New / CreateObject / CoCreateInstance или как-то ещё — все способы равнозначны, но лучше первый). Примерно вот так:
    Код: Выделить всё
    Dim RootDoc As IHTMLDocument3
    Set RootDoc = New HTMLDocument
  2. Запросить у этого объекта интерфейс IPersistStreamInit. Объект обязан его предоставить. Примерно вот так:
    Код: Выделить всё
    Dim psi As IPersistStreamInit
    Set psi = RootDoc
  3. Вызвать у этого интерфейса метод InitNew.
  4. Запросить у этого объекта интерфейс IMarkupServices. Примерно вот так:
    Код: Выделить всё
    Dim MarkupSvcAs IMarkupServices
    Set MarkupSvc = RootDoc
  5. Попросить у маркап-сервис-интерфейса инициализировать два (предварительно объёвлыннх) маркап-указателя:
    Код: Выделить всё
    Dim MrkupBegin As IMarkupPointer
    Dim MrkupEnd As IMarkupPointer
    MarkupSvc.CreateMarkupPointer MrkupBegin
    MarkupSvc.CreateMarkupPointer MrkupEnd
  6. Вызвать у интерфейса IMarkupServices метод ParseString, передав ей фрагмент HTML-кода. Он взамен отдаст ссылку на новый IMarkupContainer. Примерно вот так:
    Код: Выделить всё
    Dim MrkupContainer as IMarkupContainer
    MarkupSvc.ParseString strHtmlCode, 0, MrkupContainer, MrkupBegin, MrkupEnd
  7. По желанию у MrkupContainer можно запросить IHtmlDocument3, там обещают сущности, характерные только для скормленного в этот раз фрагмента.

Как видно из механики работы, поддерживает разбор по фрагментам. Получили фрагмент: скормили парсеру. Дополучили ещё — скормили ещё. Однако ничего не мешает скормить сразу все даные.

Сюрприз же заключается в том, что в родной TLB-ке, вшитой в mshtml.dll, описание метода ParseString кривое и использовать этот метод из VB не получится. Лечится это переобъявлением интерфейса ручками.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

След.

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

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 62

    TopList