Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла
Здравствуйте, Multix, Вы писали:
M>Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла
Здравствуйте, Multix & okman, Вы писали:
M>>Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла
O>CreateIcon посмотрите в MSDN.
Из потока можно получить IPicture через OleLoadPicture, из IPicture можно получить или битовые данные, или можно отрендериться в DC и получить битмап. С битовыми данными в CreateBitmpaIndirect и снова получить битмап.
Здравствуйте, Multix, Вы писали:
M>Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла
А что за файл-то!?!
Если нужна ассоциированная иконка то SHGetFileInfo, иначе стоит посмотреть в сторону ExtractIcon
Здравствуйте, Carc, Вы писали:
C>Здравствуйте, Multix, Вы писали:
M>>Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла C>А что за файл-то!?! C>Если нужна ассоциированная иконка то SHGetFileInfo, иначе стоит посмотреть в сторону ExtractIcon
Моя собственная структура. Содержит различные файлы внутри себя в виде бинарных данных.
Здравствуйте, CEMb, Вы писали:
CEM>Здравствуйте, Multix & okman, Вы писали:
M>>>Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла
O>>CreateIcon посмотрите в MSDN.
CEM>Из потока можно получить IPicture через OleLoadPicture, из IPicture можно получить или битовые данные, или можно отрендериться в DC и получить битмап. С битовыми данными в CreateBitmpaIndirect и снова получить битмап.
Как я понял то, что вы мне советуете есть отрисовка данной картинки? Я же бы хотел получить hIcon от этих двоичных данных
Здравствуйте, Multix, Вы писали:
M>Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла
Как-то так:
#ifndef __gool_impl_icon_h__
#define __gool_impl_icon_h__
#include <windows.h>
//////////////////////////////////////////////////////////////////////////
//Format in ico file#pragma pack( push, 2 )
struct icondirentry
{
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 ( must be 0)
WORD wplanes; // color planes
WORD wbitcount; // bits per pixel
DWORD dwbytesinres; // how many bytes in this resource?
DWORD dwimageoffset; // where in the file is this image?
};
struct icondir
{
WORD idreserved; // reserved (must be 0)
WORD idtype; // resource type (1 for icons)
WORD idcount; // how many images?
icondirentry identries[1]; // an entry for each image (idcount of 'em)
};
#pragma pack( pop )
namespace gool
{
namespace ms_icon
{
inline bool draw(HDC hdc, rect where, size min_size, bytes data, bool stretch = false)
{
int offset = 0;
int small_offset = 0;
icondir* idir = (icondir*)data.start;
size place_sz = where.size();
int best_wbitcount = 0;
size best_sz;
uint nbytes = 0;
int small_wbitcount = 0;
int i;
for(i = 0; i < idir->idcount; i++)
{
int w = idir->identries[i].bwidth;
int h = idir->identries[i].bheight;
if( !w )
w = 256;
if( !h )
h = 256;
int bits = idir->identries[i].wbitcount;
if( w <= place_sz.x && h <= place_sz.y)
{
if( w >= best_sz.x && h >= best_sz.y )
{
if( bits >= best_wbitcount )
{
best_wbitcount = bits;
offset = idir->identries[i].dwimageoffset;
nbytes = idir->identries[i].dwbytesinres;
}
best_sz.x = w;
best_sz.y = h;
}
}
if( w == min_size.x && h == min_size.y )
{
if( bits >= small_wbitcount )
{
small_wbitcount = bits;
small_offset = idir->identries[i].dwimageoffset;
}
}
}
if(!offset)
{
if(!small_offset)
return false;
offset = small_offset;
stretch = true;
best_sz = min_size;
best_wbitcount = small_wbitcount;
}
HICON hicon = CreateIconFromResourceEx(
const_cast<byte*>( data.start ) + offset, nbytes, TRUE, 0x00030000,
best_sz.x, best_sz.y, LR_DEFAULTCOLOR);
if( hicon )
{
if(stretch)
DrawIconEx(hdc, where.left(), where.top(), hicon, where.width(), where.height(),0,NULL,DI_NORMAL);
else
{
int x = where.left() + (where.width() - best_sz.x) / 2;
int y = where.top() + (where.height() - best_sz.y) / 2;
DrawIconEx(hdc, x, y, hicon, best_sz.x, best_sz.y,0,0,DI_MASK);
}
DestroyIcon(hicon);
}
else
{
DWORD dwerr = GetLastError();
dwerr = dwerr;
return false;
}
return best_wbitcount == 32;
}
Здравствуйте, Multix, Вы писали:
M>Здравствуйте, Carc, Вы писали:
C>>Здравствуйте, Multix, Вы писали:
M>>>Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла C>>А что за файл-то!?! C>>Если нужна ассоциированная иконка то SHGetFileInfo, иначе стоит посмотреть в сторону ExtractIcon
M>Моя собственная структура. Содержит различные файлы внутри себя в виде бинарных данных.
Ну если своя собственная структура, то разобрать на части и вперед!?! CreatIcon, CreateIconIndirect, EnumResources если там какие-то бинарники лежат!?! Например так...
Здравствуйте, Aniskin, Вы писали:
A>Здравствуйте, Multix, Вы писали:
M>>Я же бы хотел получить hIcon от этих двоичных данных
A>Я думаю, что CreateIconIndirect будет лучшим/наипростейшим решением.
Я уже тоже ее на примету взял. Только она мне всегда ноль почему то возвращает
Может кто подскажет что не так сделал
Пример кода:
Здравствуйте, Aniskin, Вы писали:
A>Здравствуйте, Multix, Вы писали:
M>>Может кто подскажет что не так сделал
A>Не определил icnf.hbmMask.
Я через GDI+ смог добрать до картинки=). Теперь встал другой вопрос. Есть ли возможность загрузить иконку из .icl, если содержимое icl находится в потоке
Здравствуйте, Multix, Вы писали:
M>Здравствуйте, Aniskin, Вы писали:
A>>Здравствуйте, Multix, Вы писали:
M>>>Может кто подскажет что не так сделал
A>>Не определил icnf.hbmMask.
M>Я через GDI+ смог добрать до картинки=). Теперь встал другой вопрос. Есть ли возможность загрузить иконку из .icl, если содержимое icl находится в потоке
Хороший вопрос! А действительно если спроецировать содержимое *.icl на Memory Mapped File, а потом подсунуть все это дело достославной функции ExtractIcon(Ex)!?! Ведь таскает же она иконки из загруженных .exe и .dll? Почему бы и в этом случае ей не отработать корректно?
Сам не пробовал, но по идее должно сработать.
Здравствуйте, Carc, Вы писали:
C>Здравствуйте, Multix, Вы писали:
M>>Здравствуйте, Aniskin, Вы писали:
A>>>Здравствуйте, Multix, Вы писали:
M>>>>Может кто подскажет что не так сделал
A>>>Не определил icnf.hbmMask.
M>>Я через GDI+ смог добрать до картинки=). Теперь встал другой вопрос. Есть ли возможность загрузить иконку из .icl, если содержимое icl находится в потоке C>Хороший вопрос! А действительно если спроецировать содержимое *.icl на Memory Mapped File, а потом подсунуть все это дело достославной функции ExtractIcon(Ex)!?! Ведь таскает же она иконки из загруженных .exe и .dll? Почему бы и в этом случае ей не отработать корректно? C>Сам не пробовал, но по идее должно сработать.
Идея и вправду хорошая. Только ( если я не ошибаюсь ) мы должны знать hInstance файла из которого извлекать иконку. А для MMF можно получать только handle. Я понимаю что в итоге это оба void*, но все таки. Вот код. Может что не так, кто подскажет:
TCHAR szName[]=TEXT("ICL_FILE");
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, szName); //size - размер потокаif (hMapFile != NULL)
{
pBuf = (LPTSTR) MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, size);
CopyMemory((PVOID)pBuf, buff, (_tcslen(buff) * sizeof(TCHAR))); // buff - буффер с данными из потокаconst char* s = strchr( iconName, '#' ); // в iconName приходит #0 , #1 и тд. - идентификатор иконки
hIcon = (HICON)LoadIcon( (HINSTANCE)hMapFile, MAKEINTRESOURCE(s+1) ); // здесь он мне фигу показывает - hIcon == nullptr
CloseHandle(hMapFile);
UnmapViewOfFile(pBuf);
}
Здравствуйте, Multix, Вы писали:
M>Здравствуйте, Carc, Вы писали:
C>>Здравствуйте, Multix, Вы писали:
M>>>Здравствуйте, Aniskin, Вы писали:
A>>>>Здравствуйте, Multix, Вы писали:
M>>>>>Может кто подскажет что не так сделал
A>>>>Не определил icnf.hbmMask.
M>>>Я через GDI+ смог добрать до картинки=). Теперь встал другой вопрос. Есть ли возможность загрузить иконку из .icl, если содержимое icl находится в потоке C>>Хороший вопрос! А действительно если спроецировать содержимое *.icl на Memory Mapped File, а потом подсунуть все это дело достославной функции ExtractIcon(Ex)!?! Ведь таскает же она иконки из загруженных .exe и .dll? Почему бы и в этом случае ей не отработать корректно? C>>Сам не пробовал, но по идее должно сработать.
M>Идея и вправду хорошая. Только ( если я не ошибаюсь ) мы должны знать hInstance файла из которого извлекать иконку. А для MMF можно получать только handle. Я понимаю что в итоге это оба void*, но все таки. Вот код. Может что не так, кто подскажет:
M>
M> TCHAR szName[]=TEXT("ICL_FILE");
M> HANDLE hMapFile;
M> LPCTSTR pBuf;
M> hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, szName); //size - размер потока
M> if (hMapFile != NULL)
M> {
M> pBuf = (LPTSTR) MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, size);
M> CopyMemory((PVOID)pBuf, buff, (_tcslen(buff) * sizeof(TCHAR))); // buff - буффер с данными из потока
M> const char* s = strchr( iconName, '#' ); // в iconName приходит #0 , #1 и тд. - идентификатор иконки
M> hIcon = (HICON)LoadIcon( (HINSTANCE)hMapFile, MAKEINTRESOURCE(s+1) ); // здесь он мне фигу показывает - hIcon == nullptr
M> CloseHandle(hMapFile);
M> UnmapViewOfFile(pBuf);
M> }
M>
Собственно hIcon = (HICON)ExtractIcon( (HINSTANCE)hMapFile, NULL, atol(s+1) ) вместо LoadIcon результата ожидаемого не дало
Здравствуйте, Multix, Вы писали:
M>Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла
Если кто умельцы найдутся, подскажите плиз как добраться до файла , хранящегося в
icl
( dll, exe ), если я знаю структуру IMAGE_NT_HEADERS, IMAGE_DOS_HEADER. Нет толкового описания того, как по заголовку структуры IMAGE_NT_HEADERS добраться до файлов из секций IMAGE_SECTION_HEADER( его я тоже прочитал ).
Дальше стопор. Задача в итоге сводится как разобрать исполняемый файл формата PE на содержимое. Вот=)
Здравствуйте, Multix, Вы писали:
M>Здравствуйте, Multix, Вы писали:
M>>Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла
M>Если кто умельцы найдутся, подскажите плиз как добраться до файла , хранящегося в
icl
( dll, exe ), если я знаю структуру IMAGE_NT_HEADERS, IMAGE_DOS_HEADER. Нет толкового описания того, как по заголовку структуры IMAGE_NT_HEADERS добраться до файлов из секций IMAGE_SECTION_HEADER( его я тоже прочитал ). M>Дальше стопор. Задача в итоге сводится как разобрать исполняемый файл формата PE на содержимое. Вот=)
Может быть использовать ShGetFileInfo("точка.расширение_файла")? Если конечно речь идет об ассоциированной с расширением иконки. Хотя этот вопрос уже неделю обсуждается, и чем дальше обсуждаем то все меньше становится понятным, и где такая трава годная продается Все смешалось: кони, люди, PE-формат, icl-файлы, HICON незнамо чего загруженного в поток...
По моему все-таки стоит уделить внимание статье "Как задавать вопросы", ибо уже вообще не понять о чем идет речь, даже и примерно...
Здравствуйте, Carc, Вы писали:
C>Здравствуйте, Multix, Вы писали:
M>>Здравствуйте, Multix, Вы писали:
M>>>Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла
M>>Если кто умельцы найдутся, подскажите плиз как добраться до файла , хранящегося в
icl
( dll, exe ), если я знаю структуру IMAGE_NT_HEADERS, IMAGE_DOS_HEADER. Нет толкового описания того, как по заголовку структуры IMAGE_NT_HEADERS добраться до файлов из секций IMAGE_SECTION_HEADER( его я тоже прочитал ). M>>Дальше стопор. Задача в итоге сводится как разобрать исполняемый файл формата PE на содержимое. Вот=) C>Может быть использовать ShGetFileInfo("точка.расширение_файла")? Если конечно речь идет об ассоциированной с расширением иконки. Хотя этот вопрос уже неделю обсуждается, и чем дальше обсуждаем то все меньше становится понятным, и где такая трава годная продается Все смешалось: кони, люди, PE-формат, icl-файлы, HICON незнамо чего загруженного в поток...
C>По моему все-таки стоит уделить внимание статье "Как задавать вопросы", ибо уже вообще не понять о чем идет речь, даже и примерно...
Думаю Вы правы. Переборщил в 1 теме с количеством вопросов. . Думаю для данной темы я уже выяснил то, что хотел.
Здравствуйте, Multix, Вы писали:
M>Здравствуйте, Carc, Вы писали:
C>>Здравствуйте, Multix, Вы писали:
M>>>Здравствуйте, Aniskin, Вы писали:
A>>>>Здравствуйте, Multix, Вы писали:
M>>>>>Может кто подскажет что не так сделал
A>>>>Не определил icnf.hbmMask.
M>>>Я через GDI+ смог добрать до картинки=). Теперь встал другой вопрос. Есть ли возможность загрузить иконку из .icl, если содержимое icl находится в потоке C>>Хороший вопрос! А действительно если спроецировать содержимое *.icl на Memory Mapped File, а потом подсунуть все это дело достославной функции ExtractIcon(Ex)!?! Ведь таскает же она иконки из загруженных .exe и .dll? Почему бы и в этом случае ей не отработать корректно? C>>Сам не пробовал, но по идее должно сработать.
M>Идея и вправду хорошая. Только ( если я не ошибаюсь ) мы должны знать hInstance файла из которого извлекать иконку. А для MMF можно получать только handle. Я понимаю что в итоге это оба void*, но все таки. Вот код. Может что не так, кто подскажет:
M>
M> TCHAR szName[]=TEXT("ICL_FILE");
M> HANDLE hMapFile;
M> LPCTSTR pBuf;
M> hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, szName); //size - размер потока
M> if (hMapFile != NULL)
M> {
M> pBuf = (LPTSTR) MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, size);
M> CopyMemory((PVOID)pBuf, buff, (_tcslen(buff) * sizeof(TCHAR))); // buff - буффер с данными из потока
M> const char* s = strchr( iconName, '#' ); // в iconName приходит #0 , #1 и тд. - идентификатор иконки
M> hIcon = (HICON)LoadIcon( (HINSTANCE)hMapFile, MAKEINTRESOURCE(s+1) ); // здесь он мне фигу показывает - hIcon == nullptr
M> CloseHandle(hMapFile);
M> UnmapViewOfFile(pBuf);
M> }
M>
Для ExtractIcon(Ex) нужно имя файла, а не handle. Так что никакие HANDLE или HINSTANCE в этом случае не нужны.
Здравствуйте, Carc, Вы писали:
C>Хороший вопрос! А действительно если спроецировать содержимое *.icl на Memory Mapped File, а потом подсунуть все это дело достославной функции ExtractIcon(Ex)!?! Ведь таскает же она иконки из загруженных .exe и .dll? Почему бы и в этом случае ей не отработать корректно? C>Сам не пробовал, но по идее должно сработать.
Про чтение иконок из файлов, т.е. самих данных, есть в msdn'e оба случая, из ico и dll/exe. Про формат icl не знаю, поэтому ничего не скажу.