Как вставить ресурсы в .CODE

Тема в разделе "WASM.BEGINNERS", создана пользователем monrus, 17 июл 2005.

  1. monrus

    monrus New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2004
    Сообщения:
    6
    Скачал здесь исходник с ХМ музыкой. ТАм музу вставляют в секцию .CODE. А как можно вставлять например рисунки, иконки и др. файлы, а потом их извлекать. Т.е. все без использования RC-файлов. Если можно, то дайте исходники.

    mail: wwerwe@mail.ru
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Любой ресурс - это не более чем последовательность байт. Поэтому можно взять картинку, иконку и т.д., перегнать её в db-цепочки (утиль EFF, который поставляется вместе с вышеупомянутыми исходниками, умеет перегонять любые файлы в db), вставить результат в секцию .CODE или .DATA или куда вам больше нравится. НО API-функции типа LoadResource, LoadImage и т.п. с такими "ресурсами" работать уже не будут :dntknw: Поэтому ресурсы придётся загружать вручную. Лучше поступить несколько иначе:



    Для диалоговых шаблонов существует функция DialogBoxIndirect / DialogBoxIndirectParam, которая грузит диалог не из ресурсов, а из шаблона в памяти, т.е. шаблон можно поместить хоть в .DATA или .CODE и потом грузить его этой функцией. Для этого, правда, придётся изучить формат диалоговых шаблонов, но в MSDN он детально описан.



    В случае с иконками можно использовать функцию CreateIcon, а маски AND и XOR хранить в .DATA / .CODE. Пример использования этой функции тоже есть в MSDN.



    Аналогично можно поступить и с курсорами: ф-ция CreateCursor.



    С картинками чуть сложнее... Можно создавать их через SetDIBits, но сначала надо изучить формат BMP и немного поупражняться с GDI.



    Таким образом, практически любой ресурс можно так или иначе перетащить в секцию кода. Правда, иконка у экзешника уже не отобразиться в проводнике, о VERSIONINFO придётся забыть.
     
  3. monrus

    monrus New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2004
    Сообщения:
    6
    Спасибо за ответ, а где-нибудь можно взять исходник именно с рисунками в коде?
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine


    У меня такого под рукой нет, но принцип достаточно прост.



    1. Создать пустой HBITMAP нужных размеров:
    Код (Text):
    1. hDC = GetDC(hWnd);
    2. hBMP = CreateCompatibleBitmap(hDC,ширина,высота);


    2. Запихнуть в него картинку:
    Код (Text):
    1. SetDIBits(hDC,hBMP,0,высота,буфер_с_пикселями,&bitmapinfo,DIB_RGB_COLORS);


    Чтоб правильно заполнить структуру bitmapinfo нужно посмотреть её описание в MSDN (там и примеры должны быть). В буфере с пикселями нужно хранить картинку вверх ногами и соблюдая выравнивание, которое тоже нужно посчитать согласно описанию в MSDN.