Загрузка иконки из файла
От: Multix  
Дата: 01.02.11 14:14
Оценка:
Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла

02.02.11 03:06: Перенесено из 'C/C++'
Re: Загрузка иконки из файла
От: okman Беларусь https://searchinform.ru/
Дата: 01.02.11 18:36
Оценка:
Здравствуйте, Multix, Вы писали:

M>Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла


CreateIcon посмотрите в MSDN.
Re[2]: Загрузка иконки из файла
От: CEMb  
Дата: 02.02.11 03:21
Оценка:
Здравствуйте, Multix & okman, Вы писали:

M>>Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла


O>CreateIcon посмотрите в MSDN.


Из потока можно получить IPicture через OleLoadPicture, из IPicture можно получить или битовые данные, или можно отрендериться в DC и получить битмап. С битовыми данными в CreateBitmpaIndirect и снова получить битмап.
Re: Загрузка иконки из файла
От: Carc Россия https://vk.com/gosha_mazov
Дата: 02.02.11 17:14
Оценка:
Здравствуйте, Multix, Вы писали:

M>Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла

А что за файл-то!?!
Если нужна ассоциированная иконка то SHGetFileInfo, иначе стоит посмотреть в сторону ExtractIcon
Aml Pages Home
Re[2]: Загрузка иконки из файла
От: Multix  
Дата: 03.02.11 06:33
Оценка:
Здравствуйте, Carc, Вы писали:

C>Здравствуйте, Multix, Вы писали:


M>>Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла

C>А что за файл-то!?!
C>Если нужна ассоциированная иконка то SHGetFileInfo, иначе стоит посмотреть в сторону ExtractIcon

Моя собственная структура. Содержит различные файлы внутри себя в виде бинарных данных.
Re[3]: Загрузка иконки из файла
От: Multix  
Дата: 03.02.11 06:38
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Здравствуйте, Multix & okman, Вы писали:


M>>>Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла


O>>CreateIcon посмотрите в MSDN.


CEM>Из потока можно получить IPicture через OleLoadPicture, из IPicture можно получить или битовые данные, или можно отрендериться в DC и получить битмап. С битовыми данными в CreateBitmpaIndirect и снова получить битмап.


Как я понял то, что вы мне советуете есть отрисовка данной картинки? Я же бы хотел получить hIcon от этих двоичных данных
Re: Загрузка иконки из файла
От: c-smile Канада http://terrainformatica.com
Дата: 03.02.11 07:05
Оценка:
Здравствуйте, 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;
 }
Re[4]: Загрузка иконки из файла
От: Aniskin  
Дата: 03.02.11 07:58
Оценка:
Здравствуйте, Multix, Вы писали:

M>Я же бы хотел получить hIcon от этих двоичных данных


Я думаю, что CreateIconIndirect будет лучшим/наипростейшим решением.
Re[3]: Загрузка иконки из файла
От: Carc Россия https://vk.com/gosha_mazov
Дата: 03.02.11 08:24
Оценка:
Здравствуйте, Multix, Вы писали:

M>Здравствуйте, Carc, Вы писали:


C>>Здравствуйте, Multix, Вы писали:


M>>>Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла

C>>А что за файл-то!?!
C>>Если нужна ассоциированная иконка то SHGetFileInfo, иначе стоит посмотреть в сторону ExtractIcon

M>Моя собственная структура. Содержит различные файлы внутри себя в виде бинарных данных.

Ну если своя собственная структура, то разобрать на части и вперед!?! CreatIcon, CreateIconIndirect, EnumResources если там какие-то бинарники лежат!?! Например так...
Aml Pages Home
Re[5]: Загрузка иконки из файла
От: Multix  
Дата: 03.02.11 09:03
Оценка:
Здравствуйте, Aniskin, Вы писали:

A>Здравствуйте, Multix, Вы писали:


M>>Я же бы хотел получить hIcon от этих двоичных данных


A>Я думаю, что CreateIconIndirect будет лучшим/наипростейшим решением.


Я уже тоже ее на примету взял. Только она мне всегда ноль почему то возвращает
Может кто подскажет что не так сделал
Пример кода:


      PHGlobal hGlobal = GlobalAlloc( GMEM_MOVEABLE|GMEM_NODISCARD, file.Size() ); // мой класс, который  в диструкторе освобождает память 
      if( HGLOBAL(hGlobal) )
      {
         char* buffer = (char*)GlobalLock( hGlobal );
         if( buffer )
         {
            file.Seek( 0 ); 
            file.Read( buffer, file.Size() ); // прочитал данные из потока
            GlobalUnlock( hGlobal );
            file.Close();

            IStream* strm;
            IPicture* picture;
            ICONINFO icnf = {0};
            icnf.fIcon = TRUE;
            HBITMAP hBitmap=NULL;
            if( CreateStreamOnHGlobal( hGlobal, FALSE, &strm ) == S_OK )
               if( strm )
                  if( OleLoadPicture( strm, size, FALSE, IID_IPicture, (LPVOID*)&picture ) == S_OK )
                  {
                     picture->get_Handle((OLE_HANDLE*)(UINT*)&hBitmap);
                     icnf.hbmColor = hBitmap;
                     hIcon = ::CreateIconIndirect(&icnf); // здесь получаю NULL.  :(  :(  :(
                  }
         }      
      }
Re[6]: Загрузка иконки из файла
От: Aniskin  
Дата: 03.02.11 16:52
Оценка:
Здравствуйте, Multix, Вы писали:

M>Может кто подскажет что не так сделал


Не определил icnf.hbmMask.
Re[7]: Загрузка иконки из файла
От: Multix  
Дата: 04.02.11 12:34
Оценка:
Здравствуйте, Aniskin, Вы писали:

A>Здравствуйте, Multix, Вы писали:


M>>Может кто подскажет что не так сделал


A>Не определил icnf.hbmMask.


Я через GDI+ смог добрать до картинки=). Теперь встал другой вопрос. Есть ли возможность загрузить иконку из .icl, если содержимое icl находится в потоке
Re[8]: Загрузка иконки из файла
От: Carc Россия https://vk.com/gosha_mazov
Дата: 04.02.11 14:47
Оценка:
Здравствуйте, Multix, Вы писали:

M>Здравствуйте, Aniskin, Вы писали:


A>>Здравствуйте, Multix, Вы писали:


M>>>Может кто подскажет что не так сделал


A>>Не определил icnf.hbmMask.


M>Я через GDI+ смог добрать до картинки=). Теперь встал другой вопрос. Есть ли возможность загрузить иконку из .icl, если содержимое icl находится в потоке

Хороший вопрос! А действительно если спроецировать содержимое *.icl на Memory Mapped File, а потом подсунуть все это дело достославной функции ExtractIcon(Ex)!?! Ведь таскает же она иконки из загруженных .exe и .dll? Почему бы и в этом случае ей не отработать корректно?
Сам не пробовал, но по идее должно сработать.
Aml Pages Home
Re[9]: Загрузка иконки из файла
От: Multix  
Дата: 07.02.11 06:30
Оценка:
Здравствуйте, 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);
                        }
Re[10]: Загрузка иконки из файла
От: Multix  
Дата: 07.02.11 06:50
Оценка:
Здравствуйте, 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 результата ожидаемого не дало
Re: Загрузка иконки из файла
От: Multix  
Дата: 08.02.11 12:08
Оценка: :)
Здравствуйте, Multix, Вы писали:

M>Всем добрый день. Программирую на чистом C++ ( не .Net). Возникла проблема — требуется загрузить иконку из некоторого файла. Этот файл не dll не exe и не ico. Файл с иконкой я могу загрузить в поток. Как получить hIcon для такого файла


Если кто умельцы найдутся, подскажите плиз как добраться до файла , хранящегося в
icl
( dll, exe ), если я знаю структуру IMAGE_NT_HEADERS, IMAGE_DOS_HEADER. Нет толкового описания того, как по заголовку структуры IMAGE_NT_HEADERS добраться до файлов из секций IMAGE_SECTION_HEADER( его я тоже прочитал ).
Дальше стопор. Задача в итоге сводится как разобрать исполняемый файл формата PE на содержимое. Вот=)
Re[2]: Загрузка иконки из файла
От: Carc Россия https://vk.com/gosha_mazov
Дата: 08.02.11 12:26
Оценка:
Здравствуйте, 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 незнамо чего загруженного в поток...

По моему все-таки стоит уделить внимание статье "Как задавать вопросы", ибо уже вообще не понять о чем идет речь, даже и примерно...
Aml Pages Home
Re[3]: Загрузка иконки из файла
От: Multix  
Дата: 08.02.11 13:27
Оценка:
Здравствуйте, 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 теме с количеством вопросов. . Думаю для данной темы я уже выяснил то, что хотел.
Re[10]: Загрузка иконки из файла
От: Carc Россия https://vk.com/gosha_mazov
Дата: 08.02.11 13:49
Оценка:
Здравствуйте, 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 в этом случае не нужны.
Aml Pages Home
Re[9]: Загрузка иконки из файла
От: CEMb  
Дата: 08.02.11 16:05
Оценка:
Здравствуйте, Carc, Вы писали:

C>Хороший вопрос! А действительно если спроецировать содержимое *.icl на Memory Mapped File, а потом подсунуть все это дело достославной функции ExtractIcon(Ex)!?! Ведь таскает же она иконки из загруженных .exe и .dll? Почему бы и в этом случае ей не отработать корректно?

C>Сам не пробовал, но по идее должно сработать.

Про чтение иконок из файлов, т.е. самих данных, есть в msdn'e оба случая, из ico и dll/exe. Про формат icl не знаю, поэтому ничего не скажу.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.