Получение иконки сайта без использования временного файла

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

Получение иконки сайта без использования временного файла

Сообщение Diamock » 16.01.2010 (Сб) 19:16

Здравствуйте Уважаемые!
Поздравляю всех с наступившим 2010 годом!
К сути вопроса.
Для получения иконки сайта (favicon.ico) использую следующий код:

Код: Выделить всё
Public Sub GetIcon(IC As PictureBox, ByVal sURL As String)

On Error GoTo ErIc                              'Подключение обработчика ошибок


Dim ff As Integer                               'Переменная для доступа к файлу
Dim tmpFolder As String                         'Переменная для определения пути к системной папке для временных файлов
Dim tmpIName As String                          'Переменная для хранения имени временной иконки
Dim tmpIPath As String                          'Полный путь к временной иконке

IC.Picture = Nothing

ff = FreeFile                                   'Получение номера свободного канала
tmpFolder = GetTempFolder                       'Определение системной папки Temp
tmpIName = "temp.ico"                           'Получение имени временной иконки
tmpIPath = tmpFolder & tmpIName                 'Получение полного пути к временной иконке

Open tmpIPath For Output As #ff                 'Создаём временную иконку
    Print #ff, OpenURL(sURL & "/favicon.ico")   'Записывае в файл полученные данные
Close #ff                                       'Закрываем свободный канал

IC.Picture = LoadPicture(tmpIPath)              'Загружаем иконку в PictureBox
Kill tmpIPath                                   'Чистим временную папку

Exit Sub                                        'Выходим из процедуры

ErIc: IC.Picture = Nothing                      'Пустой рисунок

End Sub


Можно ли поместить иконку в PictureBox, без предварительной записи данных на винчестер?
In der Beschrankung zeigt sich erst der Meister
Графоманю...

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

Re: Получение иконки сайта без использования временного файла

Сообщение Хакер » 16.01.2010 (Сб) 19:17

Можно и даже нужно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Re: Получение иконки сайта без использования временного файла

Сообщение Diamock » 16.01.2010 (Сб) 19:20

Хакер писал(а):Можно и даже нужно.


Уважаемый Хакер, намекните в каком направлении рыть...
In der Beschrankung zeigt sich erst der Meister
Графоманю...

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

Re: Получение иконки сайта без использования временного файла

Сообщение Хакер » 16.01.2010 (Сб) 19:22

Да в том же, в котором и сейчас: достаточно присвоить свойству Picture ссылку на объект, поддерживающий IPictureDisp, который и будет рендерить иконку. Вот уже где взять этот объект: другой вопрос.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Re: Получение иконки сайта без использования временного файла

Сообщение Diamock » 16.01.2010 (Сб) 19:24

Хакер писал(а):Да в том же, в котором и сейчас: достаточно присвоить свойству Picture ссылку на объект, поддерживающий IPictureDisp, который и будет рендерить иконку. Вот уже где взять этот объект: другой вопрос.

Общее направление понял, буду разбираться. Большое спасибо!
In der Beschrankung zeigt sich erst der Meister
Графоманю...

Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Re: Получение иконки сайта без использования временного файл

Сообщение Diamock » 29.05.2011 (Вс) 6:50

Поднимаю старую тему, потому что найдено решение.

Код модуля:
Код: Выделить всё
Option Explicit

Private Type TGUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
End Type

Private Declare Function OleLoadPicturePath Lib "oleaut32.dll" ( _
                ByVal szURLorPath As Long, _
                ByVal punkCaller As Long, _
                ByVal dwReserved As Long, _
                ByVal clrReserved As OLE_COLOR, _
                ByRef riid As TGUID, _
                ByRef ppvRet As IPicture _
                ) As Long

Public Function GetIconFromURL(ByVal URL As String) As Picture
Dim IID  As TGUID
    With IID
        .Data1 = &H7BF80980
        .Data2 = &HBF32
        .Data3 = &H101A
        .Data4(0) = &H8B
        .Data4(1) = &HBB
        .Data4(2) = &H0
        .Data4(3) = &HAA
        .Data4(4) = &H0
        .Data4(5) = &H30
        .Data4(6) = &HC
        .Data4(7) = &HAB
    End With
   
Dim PathIcon As String
PathIcon = URL & "/favicon.ico"

On Error GoTo ERR_LINE
    OleLoadPicturePath StrPtr(PathIcon), 0&, 0&, 0&, IID, GetIconFromURL
    Exit Function
ERR_LINE:
    Set GetIconFromURL = VB.LoadPicture(PathIcon)
End Function

Комментарии, более чем уместны :D .
Вложения
Version 3.1.zip
Пример
(5.92 Кб) Скачиваний: 41
In der Beschrankung zeigt sich erst der Meister
Графоманю...

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

Re: Получение иконки сайта без использования временного файл

Сообщение Хакер » 29.05.2011 (Вс) 17:54

Diamock писал(а):Комментарии, более чем уместны :D .


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

Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Re: Получение иконки сайта без использования временного файл

Сообщение Diamock » 29.05.2011 (Вс) 18:04

Хакер писал(а):Это решение плохо тем, что ты никак не следишь, не контролируешь и не можешь влиять на ход загрузки веб-ресурса.

Можно подробнее, почему плохо и для чего нужен контроль и влияние на ход загрузки, если требуется загрузить только иконку? :?:
In der Beschrankung zeigt sich erst der Meister
Графоманю...

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

Re: Получение иконки сайта без использования временного файл

Сообщение Хакер » 29.05.2011 (Вс) 18:41

Diamock писал(а):Можно подробнее, почему плохо и для чего нужен контроль и влияние на ход загрузки, если требуется загрузить только иконку? :?:

Почему плохо вообще можно почитать в статьях Джоэля (тут (пункт 3) и тут), там, где говорится, почему плохо работать с удалёнными файлами так, как если это локальные.

Какой требуется контроль? Ну например сервер возвращает редирект. Проследовать или нет? Если проследовать: проследовать в любом случае, или только если хост назначения соответствует текущему хосту? Как себя вести, если сервер не отвечает? Какой таймаут? В твоём случае поток застрянет в указанной функции, и, возникнет ситуация, которую нубы называют «зависанием». Что делать, если иконка пришла только наполовину, и соединение случайно разорвалось? Докачать или засчитать неудачу? Вряд ли OLE станет докачивать что-то. Что делать, если мы нарвались на ресурс бесконечной длины? Скорее всего OLE будет тупо качать его до посинения, которое никогда не наступит. Ну, в общем, куча таких моментов, которые неплохо бы контролировать, чтобы получить стабильную, «вкусную» программу.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Re: Получение иконки сайта без использования временного файл

Сообщение Diamock » 29.05.2011 (Вс) 18:47

Хакер, БОЛЬШОЕ СПАСИБО за разъяснение, буду изучать и пробовать. :D
In der Beschrankung zeigt sich erst der Meister
Графоманю...


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

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

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

    TopList