Задача: есть блок памяти в 7кб (или более), выделенный с помощью GlobalAlloc. Есть функция API, принимающая хендл этого блока. Кроме той же самой величины, что вернул Alloc, она ничего не принимает. Т.е. если ей скормить нечто похожее на [хендл]±М, М != 0, она отказывается работать. А блок надо ей передавать кусками, причём каков размер каждого из кусков, можно узнать только прочитав весь блок целиком. Так вот, внимание вопрос: как можно (и можно ли в принципе) сделать идентификатор [хендл]±М "верным" для функции CreateStreamOnHGlobal?
О, похоже IStream:Seek и IStream:SetSize это и правда то что доктор прописал! Щас будем попробовать =)
Фух. ОНО РАБОТАЕТ!!! аааа урряяя!!! %) leo Респектище за совет! Завтра доделаю - выложу сырцы! Это будет самый простой из мне известных загрузчик GIF... Правда, пока не совсем ясно как быть с прозрачностью, ну да разберёмся. Скорее всего нужно сначала построить маску на основе флага TF, потом затереть (в режиме AND) 1-ое изображение по инвертированной маске, 2-ое - по обычной, и сводить эту красотищу в режиме OR.
Хм... однако не распознаёт больше половины кадров! Как выяснилось, дело в том, что IStream::SetSize и OLELoadPicture меняют случайное количество байт, расположенных за концевой меткой, на "мусор". Причём вычислить, сколько именно они изменят (чтобы хотя б зарезервировать этот блок для дальнейшей перезаписи на место мусора), я не могу - видимо, это делается рандомно, ибо в одинаковых условиях может записаться и 4 байта, и 12, и все 128. Как запретить им это делать? Или на крайняк, как узнать, где и сколько после них появится мусора? IStream::LockRegion был бы идеальным вариантом, но как гласит МСДН, в OLE-реализации он не работает. Равно как и IStream::Commit. Что посоветуете? [+]: Если не юзать SetSize - то всё работает. Однако работает это настолько тормозно, что лучше бы вообще не работало =( Ибо для извлечения каждого кадра LoadPicture читает весь поток целиком. Самое смешное, что в том же МСДН сказано, что читаться будет не больше байт, чем указано во втором к ней параметре. Я туда пробовал даже цифры от 1 до 9 проставлять - всё равно читает целиком... зарррраза %(