Как вытащить иконку из файла и скопировать в файл Ico.

Тема в разделе "WASM.BEGINNERS", создана пользователем assch, 18 апр 2011.

  1. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    208
    Код (Text):
    1. TDIB STRUCT  ;  ( sizeof=0x54, 54h, standard type - 84 byte )
    2.   bmType             DWORD ?
    3.   bmWidth            DWORD ?
    4.   bmHeight           DWORD ?
    5.   bmWidthBytes    DWORD ?
    6.   bmPlanes           WORD  ?
    7.   bmBitsPixel         WORD  ?
    8.   bmBits               DWORD ?
    9.   biSize                DWORD ?
    10.   biWidth              DWORD ?
    11.   biHeight             DWORD ?
    12.   biPlanes             WORD  ?
    13.   biBitCount          WORD  ?
    14.   biCompression     DWORD ?
    15.   biSizeImage        DWORD ?
    16.   biXPelsPerMeter   DWORD ?
    17.   biYPelsPerMeter   DWORD ?
    18.   biClrUsed            DWORD ?
    19.   biClrImportant     DWORD ?
    20.   dsBitfields          DWORD 3 dup (?)
    21.   dshSection         DWORD ?
    22.   dsOffset            DWORD ?
    23. TDIB ENDS
    24.  
    25. TInfo STRUCT  ;  ( sizeof=0x14, 14h, standard type - 20 byte )
    26. fIcon        DWORD ?
    27. xHotspot   DWORD ?
    28. yHotspot   DWORD ?
    29. hbmMask   DWORD ?
    30. hbmColor   DWORD ?
    31. TInfo ENDS
    32.  
    33. .data
    34.  
    35. FileName   db "C:\WINDOWS\system32\shell32.dll",0
    36. Index      dd 130
    37. hInstance  dd ?
    38. HandIco    dd ?
    39. HandRes    dd ?
    40. PInfo      TInfo  <0>
    41. PDIB       TDIB  <0>
    42.  
    43. .code
    44.  
    45. invoke ExtractIcon,hInstance,addr FileName,Index
    46. mov HandIco,eax
    Этой функцией ExtractIcon (как пример) можно извлечь дескриптор значка который находится в системной
    библиотеке shell32.dll с индексом 130 и например с помощью связки функций CreateWindowEx (Static) и
    SendMessage отобразить эту иконку в окне приложения. Но вот если стоит задача ещё и вытащить эту
    иконку, то есть скопировать её в файл в формате Ico. то что для этого нужно сделать.
    Например в утилитке написаной мной на языке Autoit этот алгоритм происходит так.
    Если перевести на синтаксис асемблера то код наверное должен выглядеть так:

    Код (Text):
    1. invoke  GetIconInfo,HandIco, addr pInfo
    Где функция GetIconInfo заполняет структуру PInfo в частности адресное поле PInfo.hbmColor
    где будет находится Хендл для функции CopyImage

    Код (Text):
    1. invoke  CopyImage, PInfo.hbmColor, 0, 0, 0, 2008h
    2. mov HandRes,eax
    На выходе CopyImage будет значение которое нужно как Хендл поставить в функцию GetObject

    Код (Text):
    1. invoke  GetObject, HandRes, sizeof PDIB, addr PDIB
    Функция GetObject в свою очередь (должна) заполнять структуру PDIB. И вот здесь у меня облом,
    так как функция GetObject (в регистре eax) должна возвратить число отличное от нуля,
    а конкректно она возращает число заполненных байтов, то есть число равное sizeof PDIB.
    А у меня возвращается "0" тоесть функция сработала не правильно и структуру PDIB не заполнила.
    Не пойму где может быть ошибка или в CopyImage я что то не то сделал или в GetObject.
    Знаю только что функция GetIconInfo отработала нормально так как заполнила структуру pInfo правильно.
    Кто нибудь в курсе этих алгоритмов на асемблере. Не подскажете в чём проблема (где я что напутал)?
    Может быть ещё есть какой нибудь способ?

    В качестве обьяснения зачем мне это нужно имея готовую прогу.
    Просто хочется перегнать свою прогу на асемблер (просто так для души).

    PS
    Этот алгоритм не полный там ещё должны работать функции CreateFile и WriteFile.
    Просто ошибка пока на этом этапе.