Получить иконки, назначеные типам файлов

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

Получить иконки, назначеные типам файлов

Сообщение Zenitchik » 21.12.2006 (Чт) 16:28

Коряво название написал... Но, полагаю, меня поняли.

Суть задачи: я хочу написать функцию, которая принимает один аргумент (расширение файла As строка) и возвращает IPictureDisp (не все ли равно в каком еще "родном" типе?) = иконку.
Размер иконки - вопрос отдельный.

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

Суть вопроса:
1. Дайте ссылку, где почитать про работу с реестром?
2. Расскажите, на какие ключи вообще стиот обратить внимание для решения этой задачи?
3. Как выковырить иконку, оттуда где она может оказаться сныкана (exe, dll и иже с ними)?

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Re: Получить иконки, назначеные типам файлов

Сообщение lister » 21.12.2006 (Чт) 18:09

Код: Выделить всё
Private Declare Function ExtractAssociatedIcon Lib "shell32.dll" Alias "ExtractAssociatedIconA" ( _
    ByVal hInst As Long, _
    ByVal lpIconPath As String, _
    ByRef lpiIcon As Long) As Long


Private Declare Function SHGetFileInfo Lib "shell32.dll" Alias "SHGetFileInfoA" ( _
   ByVal pszPath As String, _
   ByVal dwFileAttributes As Long, _
   ByRef psfi As SHFILEINFO, _
   ByVal cbFileInfo As Long, _
   ByVal uFlags As Long) As Long


и зачем тут реестр?

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 21.12.2006 (Чт) 18:58

Это всё хорошо при условии, что размер иконок не превышает 32х32.

А через реестр можно узнать так:

1 й этап: HKEY_CLASSES_ROOT\.txt - значение по умолчанию, в данном слчае, txtfile

2 й этап: HKEY_CLASSES_ROOT\txtfile\DefaultIcon - в данном случае, %SystemRoot%\system32\shell32.dll,-152

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 21.12.2006 (Чт) 20:11

Alexanbar писал(а):Это всё хорошо при условии, что размер иконок не превышает 32х32.

Это мы все уже обсуждали...
Кстати, как решилась проблема?

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 21.12.2006 (Чт) 20:44

Извлечение больших (и маленьких тоже) иконок. Предварительно задаётся путь к файлу Path_F с иконками и номер иконки IconNUmber:

Код: Выделить всё

.....

hInst = LoadLibraryEx(Path_F, _
                    0, LOAD_LIBRARY_AS_DATAFILE)
               
         
                If IconNUmber >= 0 Then
                    resName$ = FindResName(hInst, IconNUmber)
                Else
                    resName$ = "#" & Abs(IconNUmber)
                End If
                               
                iFlag = LR_DEFAULTCOLOR
               
                hIcon = LoadImage(hInst, resName, IMAGE_ICON, r, r, iFlag)
               
               
                FreeLibrary hInst

.......

Public Function FindResName(hInst As Long, _
    ByVal ResNumber As Long) As String
resName = ""
ResCounter = 0

Ret = EnumResourceNames(hInst, "#" & RT_GROUP_ICON, _
    AddressOf ResNamesCallBack, ResNumber)

FindResName = resName

End Function

Public Function ResNamesCallBack(ByVal hMod As Long, _
    ByVal ResType As Long, ByVal ResId As Long, _
    ByVal lParam As Long) As Long

ResCounter = ResCounter + 1

If (ResId And &HFFFF0000) <> 0 Then
   If ResCounter = lParam + 1 Then
        resName = StrFromPtrA(ResId)
       
   End If
Else
   If ResCounter = lParam + 1 Then
        resName = "#" & CStr(ResId)
   End If
End If

ResNamesCallBack = Not (ResCounter >= lParam + 1) 'True

   
End Function

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 21.12.2006 (Чт) 23:51

Спасибо. Поискал по именам функций - много нового узнал.


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

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

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

    TopList