Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Comanche

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

12.01.2011, 16:37. Показов 1905. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сабж: сделать это несложно, но вот как быть, если тип файла не определён? винды в этом случае отображают некую зарезервированную иконку... где она хранится?

М.б. я неясно выразился... короче, у расширения ZIP (к примеру) иконка есть, когда какой-нить архиватор установлен, и - соотв-но - в HKEY_CLASSES_ROOT в соотв. месте есть запись 'DefaultIcon '. А вот если расширению не сопоставлено никакого файла - то и иконка будет 'особая'.
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.01.2011, 16:37
Ответы с готовыми решениями:

Получение иконки файла
Пытаюсь получить иконку файла (например .exe или .lnk ) с помощью метода sun.awt.shell.ShellFolder.getShellFolder(file) . Однако...

Получение иконки файла из Windows
Доброго времени суток. Тут возник вопрос, можно ли как нибуть получить иконку типа файла которая заданна в Windows по типу: у MP3 иконка...

Получение иконки исполняемого файла процесса
Доброго времени суток, форумчане. Иногда, в силу моего кривого кода, мне необходимо срочно завершить зависший процесс. Для этого была...

5
Comanche
12.01.2011, 17:53
Это я погорячился, что 'сабж - это несложно'. Вот вам ситуация - и по сути мой другой вопрос:

Для определения иконки, сопоставленной типу (расширению) файла, пользуюсь вот таким кодом:
[CODE]
Option Explicit

Private Type PICTDESC
cbSize As Long
pictType As Long
hIcon As Long
hPal As Long
End Type

Private Declare Function OleCreatePictureIndirect Lib 'olepro32.dll' _
(lpPictDesc As PICTDESC, riid As Any, ByVal fOwn As Long, _
ipic As IPicture) As Long
Private Declare Function RegCloseKey Lib 'advapi32.dll' (ByVal hKey As Long) As Long
Private Declare Function RegEnumKey Lib 'advapi32.dll' Alias 'RegEnumKeyA' (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long
Private Declare Function RegOpenKey Lib 'advapi32.dll' Alias 'RegOpenKeyA' (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib 'advapi32.dll' Alias 'RegQueryValueExA' (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function ExtractIcon Lib 'shell32.dll' Alias 'ExtractIconA' (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long

Private Const HKEY_CLASSES_ROOT = &H80000000

Private Sub Command1_Click()
Set Picture1.Picture = GetFileTypeIcon(Text1.Text)
End Sub

Function GetFileTypeIcon(ByVal fileExtension As String) As StdPicture
Dim lRegKey As Long
Dim sName As String
Dim sOld As String
Dim sFileAndIndex As String
Dim sFile As String
Dim iIndex As Integer
Dim lIcon As Long

Set GetFileTypeIcon = Nothing
If Left$(fileExtension, 1) <> '.' Then fileExtension = '.' & fileExtension

If RegOpenKey(HKEY_CLASSES_ROOT, ByVal fileExtension, lRegKey) = 0 Then

sName = Space$(255)
Call RegQueryValueEx(lRegKey, ByVal '', 0&, 1, ByVal sName, 255)
If InStr(sName, Chr$(0)) Then sName = Left$(sName, InStr(sName, Chr$(0)) - 1)
Log sName

Call RegCloseKey(lRegKey)

If Len(Trim$(sName)) > 0 Then
If RegOpenKey(HKEY_CLASSES_ROOT, sName & 'DefaultIcon ', lRegKey) = 0 Then
sFileAndIndex = Space$(255)
Call RegQueryValueEx(lRegKey, ByVal '', 0&, 1, ByVal sFileAndIndex, 255)
If InStr(sFileAndIndex, Chr$(0)) Then sFileAndIndex = Left$(sFileAndIndex, InStr(sFileAndIndex, Chr$(0)) - 1)
Call RegCloseKey(lRegKey)
Log sFileAndIndex
sFile = Left$(sFileAndIndex, InStr(sFileAndIndex, ',') - 1)
iIndex = Val(Mid$(sFileAndIndex, InStr(sFileAndIndex, ',') + 1))
lIcon = ExtractIcon(App.hInstance, sFile, iIndex)
Set GetFileTypeIcon = IconToPicture(lIcon)
End If
End If

End If
End Function

Private Function IconToPicture(ByVal hIcon As Long) As Picture
Dim pic As PICTDESC
Dim guid(0 To 3) As Long

pic.cbSize = Len(pic)
pic.pictType = vbPicTypeIcon
pic.hIcon = hIcon
' IPicture GUID {7BF80980-BF32-101A-8BBB-00AA00300CAB}
guid(0) = &H7BF80980
guid(1) = &H101ABF32
guid(2) = &HAA00BB8B
guid(3) = &HAB0C3000
OleCreatePictureIndirect pic, guid(0), True, IconToPicture<
Messir
12.01.2011, 22:19
Ну, это кажется немного 'извращенский' способ определения связанной иконы... Чем тебе SHGetFileInfo не угодил, а?
Comanche
13.01.2011, 00:42
Да, теперь и я ей пользуюсь ) Просто эта функция требует в качестве аргумента имя РЕАЛЬНОГО файла - а мне-то надо определять иконку, связанную не с ФАЙЛОМ, а просто с РАСШИРЕНИЕМ. Однако, в другом форуме меня надоумили: если тебе нужно определить иконку для файлов с расширеним 'BMP' (к примеру), то создай пустой временный файл с расширением 'BMP' и скорми его функции SHGetFileInfo (а потом - просто удали файл к чёртовой матери). В общем, я удивляюсь, как сам до этого не допетрил ) Сейчас всё получилось. И этот способ, конечно, гораздо проще способа с анализом реестра...
Comanche
13.01.2011, 00:44
И всё-таки - возвращусь тогда к первоначальному вопросу: где хранится 'безликая' иконка для файлов с незарегистрированным типом?
Messir
13.01.2011, 03:12
в system image list'e, наверное... ) ну, а физически - в библиотеке shell32
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.01.2011, 03:12
Помогаю со студенческими работами здесь

Получение изображения иконки файла по пути
Есть полный путь к файлу, например .exe как по нему получить изображение(ассоциированное с ним) его иконки допустим что бы потом его...

Получение информации связанной с безопасностью
Всем доброго время суток, возникла такая проблема бьюсь уже 2 день. Нужно написать программу (которая используя пространство имен...

получение иконки
Как можно узнать какая иконка у файла?Например я ищу среди файлов , файл со стандартным значком приложения....

Получение экземпляра класса с наследуемым универсальным типом
Доброго времени суток, господа. Хочу добиться следующего функционала: /// &lt;summary&gt; /// Есть некоторый...

Получение иконки с сайта
Прошу простить, если вопрос задаю не там, но возможно кто-нибудь сможет помочь с проблемой, и поможет перевести код на vb.net? Сам я с С#...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru