Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
 Аватар для VorteX
172 / 96 / 12
Регистрация: 29.05.2009
Сообщений: 341

Извлечь иконку

22.01.2010, 19:03. Показов 6717. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как извлеч иконку из выбранной программы. Т.е. над получить изображение.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.01.2010, 19:03
Ответы с готовыми решениями:

Извлечь иконку с ехе-шника
по-моему все перепутал =) подскажите пож, как правильно ... HMODULE hLib; void __fastcall TForm1::FormCreate(TObject *Sender) {...

Поменять иконку у программы
Возможно ли поменять иконку у программы?

Убрать иконку окна
Как убрать иконку окна, стиль bsDialog не подходит.

11
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
22.01.2010, 20:03
Попробуй программу Restorator.
0
 Аватар для VorteX
172 / 96 / 12
Регистрация: 29.05.2009
Сообщений: 341
22.01.2010, 20:55  [ТС]
Не, мне надож программно=) самому написать=)

Добавлено через 2 минуты
Вот чет нашел, но все везде на делфи:
Pascal
1
2
3
4
5
6
7
8
9
10
11
ar
MyIcon: TIcon;
begin
MyIcon := TIcon. Create;
try
MyIcon.Handle := ExtractIcon(hInstance, 'MYPROG.EXE', 0)
{Здесь можно что-нибудь сделать с иконкой}
finally
MyIcon.Free;
end;
end;
Добавлено через 23 секунды
и вот:
Pascal
1
2
3
4
5
6
7
8
9
10
11
uses ShellApi;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  IconIndex : word;
  h : hIcon;
begin
  IconIndex := 0;
  h := ExtractAssociatedIcon(hInstance, 'C:\WINDOWS\NOTEPAD.EXE', IconINdex);
  DrawIcon(Form1.Canvas.Handle, 10, 10, h);
end;
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
22.01.2010, 21:01
Лучший ответ Сообщение было отмечено как решение

Решение

C++
1
2
3
4
5
6
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    HICON h = ExtractIcon ( HInstance, Application->ExeName.c_str() , NULL );
    DrawIcon ( Image1->Canvas->Handle , 0, 0, h );
}
//---------------------------------------------------------------------------
4
 Аватар для Зоти Сергей
230 / 227 / 65
Регистрация: 18.12.2009
Сообщений: 316
23.01.2010, 02:57
Лучший ответ Сообщение было отмечено как решение

Решение

Мона и так:
C++
1
2
3
4
5
6
7
        #include <shellapi.hpp>
    TIcon * Ico = new TIcon;
        SHFILEINFO FileInfo;
        SHGetFileInfo("C:\\MyProgram.exe", 0, &FileInfo, sizeof(FileInfo), SHGFI_ICON);
        Ico->Handle=FileInfo.hIcon;
        Ico->SaveToFile("C:\\MyIcon.ico");
        delete Ico;
4
0 / 0 / 1
Регистрация: 18.07.2011
Сообщений: 51
04.08.2011, 11:36
столкнулся с аналогичной задачей, нашел множество примеров решения но при попытке реализации любого из них получаю одни и те же грабли, попробовал в свой рабочий код тупо вставить приведенный тут пример:
Code
1
2
3
4
5
6
TIcon * Ico = new TIcon;
        SHFILEINFO FileInfo;
        SHGetFileInfo("C:\\MyProgram.exe", 0, &FileInfo, sizeof(FileInfo), SHGFI_ICON);
        Ico->Handle=FileInfo.hIcon;
        Ico->SaveToFile("C:\\MyIcon.ico");
        delete Ico;
при компиляции получаю ошибку:
Code
1
2
3
E2034 Cannot convert 'char const[10]' to 'const wchar_t *'
  Full parser context
    Unit1.cpp(15): parsing:  _fastcall TForm1::TForm1(TComponent *)
переделал чуток приведенный пример:
Code
1
2
3
4
5
6
7
8
AnsiString r="C:\\MyProgram.exe";
wchar_t * readeditor = new wchar_t[r.WideCharBufSize()];
        TIcon * Ico = new TIcon;
        SHFILEINFO FileInfo;
        SHGetFileInfo(readeditor, 0, &FileInfo, sizeof(FileInfo), SHGFI_ICON);
        Ico->Handle=FileInfo.hIcon;
        Ico->SaveToFile("C:\\MyIcon.ico");
        delete Ico;
вроде все компилится иконка сохраняется, но иконка не нужного файла, а какаето "левая" точнее в зависимости от имени проги то иконка папки, то иконка в виде руки (сетевая шара) то вообще при запуске скомпиленой проги выскакивает ошибка о некоректности иконки. помогите разобраться в чем косяк.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
04.08.2011, 17:07
1. Если у вас билдер 2010-ХЕ, то он жаждет юникода:
C++
1
2
3
SHGetFileInfo(L"C:\\MyProgram.exe", 0, &FileInfo, sizeof(FileInfo), SHGFI_ICON);
// или
UnicodeString r="C:\\MyProgram.exe";
2. косяк может быть в индексе иконки, у вас он, я так понимаю, 0, попробуйте другие значения, и в разных приложениях под одним индексом, как правило, разные иконки, что естественно.

Еще можно посмотреть это:
Функция ExtractAssociatedIcon

Описание функций WinApi:
C++
1
2
function ExtractAssociatedIcon(hInst: HINST; lpIconPath: PChar;
var lpiIcon: Word): HICON;
Функция возвращает Хендл индексированной иконки находящейся в файле(включая .exe) связанной с типом файла.

Параметры:

hInst: Определяет Хендл приложения которое вызывало функцию.
lpIconPath: Указатель на строку определяющую путь к файлу для которого необходимо получить иконку. Это может быть как испольняемый файл, так и документ.

lpiIcon: Индекс иконки которую необходимо получить.

Возвращаемые значения

Если функция успешна, то возвращаемое значение -Хендл иконки, если нет - ноль.

Замечания

Функция ищет сначала иконку в файле определенном параметром lpIconPath, если не находит то ищет иконку в файле связанном с данным типом файлов.

Например для .txt будет искать в "Notepad.exe".

Если необходимо получить количество иконок в файле см. функцию ExtractIconEx.
См. также: ExtractIcon
Функция находится в файле shell32.dll

Описание:
C++
1
2
function ExtractIconEx(lpszFile: PChar; nIconIndex: Integer;
var phiconLarge, phiconSmall: HICON; nIcons: UINT): UINT; stdcall;
Извлекает Хендл иконки из .EXE, .DLL или .ICO файла.

Параметры

lpszFile:Строка содржащая путь к файлу.
nIconIndex:Индекс необходимой иконки в фале. Если параметр равен 0, то воздращается хендл первой иконки в файле, если параметр -1 и phiconLarge и phiconSmall равны NULL, то возрвращается количество иконок в файле.
phiconLarge:Возвращает хендл больших иконок. Может быть равен 0.
phiconSmall:Возвращает хендл маленьких иконок. Может быть равен 0.
nIcons: Определяет количество иконок для распаковки.

Возвpащаемое значение:

Если иконка обнаружена, то возращается ее хендл, если файл не был исполняемым(.EXE), динамической библиотекой(.DLL) или файлом иконки(.ICO), то возвращается -1. Если иконка не обнаружилась в файле то возвращается NULL.

См. также: ExtractIcon, ExtractAssociatedIcon

Функция находится в файле Shell32.dll

Описание:
C++
1
function LoadIcon(Instance: THandle; IconName: PChar): HIcon;
Загpужает поименованный pесуpс пиктогpаммы.

Паpаметpы:

Instance: Экземпляp модуля, исполнимый файл котоpого содеpжит пиктогpамму или 0 для пpедопpеделенной пиктогpаммы.
IconName: Стpока или имя целочисленного идентификатоpа или пpедопpеделенная пиктогpамма, опpеделенная одной из констант idi_.
Возвpащаемое значение:

В случае успешного завеpшения - идентификатоp пиктогpаммы; 0 - в пpотивном случае. Для получения расширенной информации об ошибке вызовите функцию GetLastError.

См. также: CreateIcon, LoadImage, MAKEINTRESOURCE.
Функция находится в файле user32.dll
0
0 / 0 / 1
Регистрация: 18.07.2011
Сообщений: 51
05.08.2011, 09:53
спасибо, действительно хотел юникода
C++
1
SHGetFileInfo(L"C:\\MyProgram.exe", 0, &FileInfo, sizeof(FileInfo), SHGFI_ICON);
, а вот с переменной.. её еще надо было в чар переделать
C++
1
2
UnicodeString r="C:\\MyProgram.exe";
SHGetFileInfo(r.c_str(), 0, &FileInfo, sizeof(FileInfo), SHGFI_ICON);
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.08.2011, 14:48
А как содрать програмно иконку с ярлыка? (именно с ярлыка, а не с exe на который ссылается).
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
05.08.2011, 14:56
а мысли не было, что ярлык просто подгружает иконку из экзешника ?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.08.2011, 15:32
Не всегда он может быть изменен.
На данный момент я так и делал находил exe на который ссылается ярлык.

Добавлено через 33 минуты
А также еще не розабрался с извлечением системных иконок
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
05.08.2011, 15:48
System ImageList
Display the same icons that Windows uses

This FAQ could also be called how to display the same icons that Windows uses. The icons for drives, folders, documents, explorer, the network neighborhood, and so on, are all located in a system ImageList. Most of the icons reside in SHELL32.DLL, but others are appended to the system ImageList by the operating system. To display the same icons that the system displays, all you need to do is get the handle of the system ImageList.

Step 1: Add a #include statement for the file SHELLAPI.H
C++
1
2
3
4
5
    #include <vcl\vcl.h>
    #pragma hdrstop
 
    #include "MAINFORM.h"
    #include <win32\shellapi.h>
Step 2: The API SHGetFileInfo function allows you to retrieve the system ImageList. Add an Image control and an ImageList control to the main form of your program. Don't add any icons to the ImageList. Add this code to your form's constructor to bind the ImageList to the system ImageList.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  // Argument description:
  // 1st arg -> ""           : filename, not needed
  // 2nd arg -> 0            : file attributes flag, not needed because the last
  //                           arg does not contain SHGFI_USEFILEATTRIBUTES
  // 3rd arg -> &info        : this argument is always the address of a
  //                           SHFILEINFO structure.
  // 4th arg -> sizeof(info) : this arg is always sizeof(SHFILEINFO)
  // 5th arg -> flags        : (see notes below)
  SHFILEINFO info;
  DWORD ImageHandle = SHGetFileInfo("",
                                    0,
                                    &info,
                                    sizeof(info),
                                    SHGFI_ICON |
                                    SHGFI_SHELLICONSIZE |
                                    SHGFI_SYSICONINDEX);
 
  // if the function succeeds, assign the returned handle to the TImageList
  // member. Note that the TImageList control appears to adjust its height
  // and width when you assign its handle. Also note that ShareImages is true to
  // prevent TImageList from attempting to deleting the underlying system
  // imagelist (although the shell blocks this attempt).
  if (ImageHandle != 0)
  {
    ImageList1->Handle = ImageHandle;
    ImageList1->ShareImages = true;
  }
 
  // If everything has gone according to plan,
  // display the first icon in an Image control
  if(ImageList1->Count > 0)
    ImageList1->GetIcon(0,Image1->Picture->Icon);  // 0 is the icon's index
Notes: The return value from SHGetFileInfo takes on a different meaning based on the last argument to the function. If the last arg contains either the SHGFI_ICON or the SHGFI_SYSICONINDEX flags, then the return value is the handle to the system imagelist.

Here is a description of th flags for the last argument to SHGetFileInfo:

SHGFI_ICON : specifies that the result will be the handle to the ystem imagelist (somewhat redundant). Also affects how the info structure will be filled in.
SHGFI_SHELLICONSIZE: tells the function to use the shell icon size instead of the system icon size. Recall that there are four classes of icons in win95 (system large, system small, shell large and shell small). This parameter isn't "necessary" but it makes sense to use the shell sizes since the imagelist will represent shell items.
SHGFI_SMALLICON: tells the function to return the handle of the small icon imagelist. Their are two system image lists; one for small icons and one for large icons. The two are not quite identical. The large icons are sometimes fancier. The large icons for the floppy drives contain little pictures of disks, but the small icons don't. To my knowledge, both the small and large imagelists contain the same number of icons. Omit this parameter to use large icons instead of small icons.
SHGFI_SYSICONINDEX: specifies that the return value is the handle of the system image list (redundant with SHGFI_ICON). Of greater importance, it also specifies that info.iIcon will contain the proper image list index for the file name. This is used later on for the drives.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.08.2011, 15:48
Помогаю со студенческими работами здесь

Создать прозрачную иконку TIcon
Требуется создать объект TIcon, который был бы заполнен прозрачным цветом. Сейчас я делаю так. Создаю файл *.ico нужного размера и заливаю...

Сделать анимированную иконку в трее?
Предварительная подготовка нескольких картинок не нравится. Моя идея такова: Сделал иконку 16х16 пикселей - это будет шаблон, получился...

Как выгрузить иконку из файла exe
Здравствуйте. Может кто знает как выгрузить иконку exe для другого проекта.

Показать иконку и имя выбранного файла
Есть кнопка, связанная с OpenDialog1. При выборе файла нужно вывести его иконку и имя на специальные поля. Как это сделать? Спасибо.

Как изменить иконку в консольном приложении?
как в C++ Builder изменить иконку в консольном приложении?


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru