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);
                        }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.