Сместить на М байт блок HGLOBAL

Тема в разделе "WASM.BEGINNERS", создана пользователем DEEP, 21 июл 2008.

  1. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Задача: есть блок памяти в 7кб (или более), выделенный с помощью GlobalAlloc. Есть функция API, принимающая хендл этого блока. Кроме той же самой величины, что вернул Alloc, она ничего не принимает. Т.е. если ей скормить нечто похожее на [хендл]±М, М != 0, она отказывается работать. А блок надо ей передавать кусками, причём каков размер каждого из кусков, можно узнать только прочитав весь блок целиком. Так вот, внимание вопрос:

    как можно (и можно ли в принципе) сделать идентификатор [хендл]±М "верным" для функции CreateStreamOnHGlobal?
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    И нельзя и не нужно, т.к. после создания стрима можно изменить его размер через IStream::SetSize
     
  3. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    О, похоже IStream:Seek и IStream:SetSize это и правда то что доктор прописал! Щас будем попробовать =)
     
  4. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Фух. ОНО РАБОТАЕТ!!! аааа урряяя!!! %)
    leo
    Респектище за совет! Завтра доделаю - выложу сырцы!
    Это будет самый простой из мне известных загрузчик GIF...
    Правда, пока не совсем ясно как быть с прозрачностью, ну да разберёмся. Скорее всего нужно сначала построить маску на основе флага TF, потом затереть (в режиме AND) 1-ое изображение по инвертированной маске, 2-ое - по обычной, и сводить эту красотищу в режиме OR.
     
  5. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Хм... однако не распознаёт больше половины кадров! Как выяснилось, дело в том, что IStream::SetSize и OLELoadPicture меняют случайное количество байт, расположенных за концевой меткой, на "мусор". Причём вычислить, сколько именно они изменят (чтобы хотя б зарезервировать этот блок для дальнейшей перезаписи на место мусора), я не могу - видимо, это делается рандомно, ибо в одинаковых условиях может записаться и 4 байта, и 12, и все 128.

    Как запретить им это делать?
    Или на крайняк, как узнать, где и сколько после них появится мусора?

    IStream::LockRegion был бы идеальным вариантом, но как гласит МСДН, в OLE-реализации он не работает. Равно как и IStream::Commit.
    Что посоветуете?

    [+]: Если не юзать SetSize - то всё работает. Однако работает это настолько тормозно, что лучше бы вообще не работало =( Ибо для извлечения каждого кадра LoadPicture читает весь поток целиком. Самое смешное, что в том же МСДН сказано, что читаться будет не больше байт, чем указано во втором к ней параметре. Я туда пробовал даже цифры от 1 до 9 проставлять - всё равно читает целиком... зарррраза %(