Russian Qt Forum
Апрель 25, 2024, 22:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Запилить иконку в exe  (Прочитано 10529 раз)
OKTA
Гость
« : Сентябрь 09, 2014, 17:52 »

Товарищи, пытаюсь засунуть иконку в exe-шник, но ничего не выходит. Ресурс пишется, но не полностью почему-то. Если у кого-то есть опыт, был бы рад услышать советы!
« Последнее редактирование: Сентябрь 10, 2014, 15:17 от OKTA » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Сентябрь 09, 2014, 20:33 »

зачем столько сложностей? http://qt-project.org/doc/qt-4.8/appicon.html
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
OKTA
Гость
« Ответ #2 : Сентябрь 10, 2014, 09:18 »

Мне надо уже в готовое приложение запиливать  Грустный
Записан
Bepec
Гость
« Ответ #3 : Сентябрь 10, 2014, 11:06 »

Как в готовое? В смысле стороннее приложение?
Записан
OKTA
Гость
« Ответ #4 : Сентябрь 10, 2014, 11:26 »

Да не обязательно стороннее, можно и мной скомпилированное. Так-то по факту, WinApi поволяет в любом exe-шнике менять, добавлять и удалять.
Записан
OKTA
Гость
« Ответ #5 : Сентябрь 10, 2014, 12:00 »

хм, с моим кодом работает?  Непонимающий
Не думаю, что косяк в правах, т.к. ресурс создается в целевом экзешнике - просто вместо данных картинки пишутся непонятные 6 байт непонятно чего. И это только в случае, если тип ресурса RT_GROUP_ICON. Если тип RT_ICON запись происходит нормально, но как я понял, нужен именно RT_GROUP_ICON.
Записан
Bepec
Гость
« Ответ #6 : Сентябрь 10, 2014, 12:08 »

Того, неправильное у меня сообщение было Улыбающийся Я попытался установить иконку такую же, как и имеющаяся. Так что сорри.
Записан
OKTA
Гость
« Ответ #7 : Сентябрь 10, 2014, 12:09 »

 Смеющийся ну вот, а я уже обрадовался  Смеющийся
Записан
Bepec
Гость
« Ответ #8 : Сентябрь 10, 2014, 12:18 »

Судя по всему тут проблема в мааленьком уточнении в описании updateResource - все добавляемые ресурсы должны быть выровнены определённым образом.

Удаление ресурсов происходит нормально. Т.е. проблема всё же в картинке и/или image.

update: беглый поиск показал - iconGroup это группа иконок различных размеров. Попытка туда записать одну иконку окончится печально Веселый
« Последнее редактирование: Сентябрь 10, 2014, 12:23 от Bepec » Записан
OKTA
Гость
« Ответ #9 : Сентябрь 10, 2014, 12:39 »

Проверял - содержимое картинки один в один - в моем случае и в случае, если эта картинка устанавливается какой-нибудь утилиткой сторонней.
Очередной раз убеждаюсь, что WinApi - это полное недоразумение ..
Записан
Bepec
Гость
« Ответ #10 : Сентябрь 10, 2014, 12:42 »

Неа, всё правильно.

Посмотрите утилиту PEview  - она разложит по полочкам. GroupIcon это можно сказать указатели на иконки. Формата пока не нашёл, но там хранится 50-60 байт, указывающих количество/размеры иконок и их номера. А сами иконки должны быть загружены как иконки.

А вы туда херачите саму картинку.

PS WinApi страшная штука. Добавляем недокументированные возможности, запутанную документацию и ~ 50% устаревших функций Веселый

update а вот и структурка
Код:
#pragma pack( push )
#pragma pack( 2 )
typedef struct
{
   WORD            idReserved;   // Reserved (must be 0)
   WORD            idType;       // Resource type (1 for icons)
   WORD            idCount;      // How many images?
   GRPICONDIRENTRY   idEntries[1]; // The entries for each image
} GRPICONDIR, *LPGRPICONDIR;
#pragma pack( pop )

The idCount member indicates how many images are present in the icon resource. The size of the idEntries array is determined by idCount. There exists one GRPICONDIRENTRY for each icon image in the resource, providing details about its size and color depth. The GRPICONDIRENTRY structure is defined as:
Код:
#pragma pack( push )
#pragma pack( 2 )
typedef struct
{
   BYTE   bWidth;               // Width, in pixels, of the image
   BYTE   bHeight;              // Height, in pixels, of the image
   BYTE   bColorCount;          // Number of colors in image (0 if >=8bpp)
   BYTE   bReserved;            // Reserved
   WORD   wPlanes;              // Color Planes
   WORD   wBitCount;            // Bits per pixel
   DWORD   dwBytesInRes;         // how many bytes in this resource?
   WORD   nID;                  // the ID
} GRPICONDIRENTRY, *LPGRPICONDIRENTRY;
#pragma pack( pop )

The dwBytesInRes member indicates the total size of the RT_ICON resource referenced by the nID member. nID is the RT_ICON identifier that can be passed to FindResource, LoadResource and LockResource to obtain a pointer to the ICONIMAGE structure (defined above) for this image.
The following is an incomplete code fragment for reading icons from a .DLL or .EXE file:
Код:
// Load the DLL/EXE without executing its code
hLib = LoadLibraryEx( szFileName, NULL, LOAD_LIBRARY_AS_DATAFILE );
// Find the group resource which lists its images
hRsrc = FindResource( hLib, MAKEINTRESOURCE( nId ), RT_GROUP_ICON );
// Load and Lock to get a pointer to a GRPICONDIR
hGlobal = LoadResource( hLib, hRsrc );
lpGrpIconDir = LockResource( hGlobal );
// Using an ID from the group, Find, Load and Lock the RT_ICON
hRsrc = FindResource( hLib, MAKEINTRESOURCE( lpGrpIconDir->idEntries[0].nID ),
                      RT_ICON );
hGlobal = LoadResource( hLib, hRsrc );
lpIconImage = LockResource( hGlobal );
// Here, lpIconImage points to an ICONIMAGE structure
« Последнее редактирование: Сентябрь 10, 2014, 12:47 от Bepec » Записан
OKTA
Гость
« Ответ #11 : Сентябрь 10, 2014, 12:47 »

Да, до GroupIcon я тоже уже дошел, нашел что писать туда надо, но все равно пишутся те же дурацкие 6 байт вместо структуры с данными Смеющийся
Записан
Bepec
Гость
« Ответ #12 : Сентябрь 10, 2014, 12:48 »

А где вы 6 байт видели? Я лично вижу в вашем примере ~72кб данных, что равно моей картинке Веселый
Записан
OKTA
Гость
« Ответ #13 : Сентябрь 10, 2014, 12:52 »

А я открываю exe-шник программулиной ResEdit и смотрю, что записано в ресурсах просто. А там 6 байт в поле данных валяется для GroupIcon Грустный
Записан
Bepec
Гость
« Ответ #14 : Сентябрь 10, 2014, 12:56 »

Мб ваша программулина рассчитана на работу с "фиксированным полем"? скачайте PEview. Очень рекомендую. Пусть и не очень навороченная, но помогает всегда.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 22.