|
Вернулся
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
|
|
Как работать с потоками IStream в Visual Basic 616.11.2024, 18:08. Показов 13525. Ответов 206
Метки нет (Все метки)
Всем привет! Я недавно узнал о таком чуде как потоки IStream, это такие данные в оперативной памяти вашего процесса EXE типа байтовых массивов только круче. Как я это понял лично. Вот мне очень интересно стало поработать именно со стримами. Если у кого-то есть какие-то наработки в этом плане буду рад, если поделитесь.
Из того, что я пока узнал: Есть API для создания, чтения и записи стримов - это функции SHCreateMemStream, IStream_Write, IStream_Read и IStream_Size. Это конечно очень интересно всё, но я не нашёл функции для позиционирования IStream_Seek (её что не существует?). Есть возможность управлять стримами через объявления в TLB, однако мне эта тема не интересна, так как я не люблю подключать всякие там TLB. Есть возможность управлять потоками IStream через специальную функцию DispCallByVtbl Хотелось бы подробно разобрать эту тему и научиться: 1. Создавать поток IStream 2. Записывать 3. Считывать 4. Позиционировать
0
|
|
| 16.11.2024, 18:08 | |
|
Ответы с готовыми решениями:
206
Как работать с камерой в Visual Basic Как работать в Visual Basic'е с реестром? Как работать с таблицами Ecxel в Visual Basic? |
|
Вернулся
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
|
||
| 16.01.2025, 16:57 [ТС] | ||
|
Но без костылей ты никак не сохранишь картинку в файл с юникодным именем. Твой GDI Plus API с таким же самым успехом тоже можно назвать костылями) Добавлено через 46 секунд Хотя вариант через GDI Plus API будет лучше тем, что он так же будет работать и в XP, я уже думал об этом кстати, я про PNG Добавлено через 43 минуты Кстати функцию SHCreateStreamOnFileEx можно будет применить для своей самописной функции SavePicture и назвать её например SavePictureEx
0
|
||
|
Модератор
|
||
| 16.01.2025, 17:02 | ||
|
0
|
||
|
Вернулся
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
|
|||||||
| 16.01.2025, 18:49 [ТС] | |||||||
|
Добавлено через 42 минуты В общем я создал свою функцию для сохранения картинок в юникоде. Всё вроде хорошо, но происходит какое-то чудо. Файл появляется, и в нём вродебы сохраняется картинка, но он 0 байт! Почему-то 0 байт, пока не закроешь программу или пока не откроешь какой-нибудь просмотрщик изображений с этой картинкой. Просто чудеса да и только:
Как работают эти файловые потоки я не понимаю, может что-то надо почистить за собой где-то? Добавлено через 2 минуты Может надо как-то закрывать этот файловый поток за собой? Добавлено через 7 минут Поток не освобождается скорее всего в моём дурацком коде...
0
|
|||||||
|
Вернулся
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
|
||||||
| 16.01.2025, 18:59 [ТС] | ||||||
|
Всё! Я понял! И правда, объект должен освобождаться для того чтобы файл не висел как 0 байт! Вот такой вот код правильный и будет работать как надо. Тут реализована идея автоматического освобождения объекта IStream за собой, внутренними фишками VB6. Переписал код для этого на ориентацию объектную, а не как указатель. Вот так теперь пишу Dim fIStream As IUnknown и этот объект IUnknown сам за собой автоматически освобождается, даже без использования дополнительных усилий таких как Set fIStream = Nothing эта строчка кода уже была бы лишняя :-) Ура! Теперь всё работает как надо!
![]()
0
|
||||||
|
Вернулся
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
|
||||||||||||||||
| 16.01.2025, 22:06 [ТС] | ||||||||||||||||
|
Зато я нашёл применение функции SHCreateStreamOnFileEx а так я не знал, для чего она нужна вообще)))
Добавлено через 1 час 57 минут Я очень долго думал над технологией The Trick и очень долго ломал голову над этим вот кодом:
Итого я сейчас написал вот такой вот новый код:
Добавлено через 2 минуты Таким образом тут получилась очень интересная формула вычисления правильного смещения где pCast - ObjPtr(ADOStream) является тем самым заветным магическим числом, только эта магия уже будет срабатывать во всех версиях Windows))) Добавлено через 3 минуты Это профессиональный костыль уже)))) The trick будет в восторге))) Добавлено через 5 минут Или вот так вот ещё можно написать:
Утечки памяти быть не должно здесь) Добавлено через 6 минут vbaCastObj + IUnknown_AtomicRelease это очень интересный вариант, который теперь даже будет конкурировать с комбинацией функций SHWeakQueryInterface + SHWeakReleaseInterface, очень мало строк кода потому что получилось, благодаря моим стараниям) Добавлено через 1 минуту Мне этот вариант прям понравился, который я написал сейчас)))
0
|
||||||||||||||||
|
Модератор
|
|||||||||||
| 16.01.2025, 23:22 | |||||||||||
|
От такого кода точно в восторге не буду, тут даже не зная программирования, чисто логически можно понять что это все лишнее:
pCast - ObjPtr(ADOStream)В итоге все можно переписать в 1 строчку, а используя правильную типизацию вообще обойтись без ручного управления ссылками:
2
|
|||||||||||
|
Вернулся
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
|
|||||||
| 17.01.2025, 01:05 [ТС] | |||||||
|
Великолепно! Браво! А как же освобождение памяти? Как оно тут работает?
![]() Добавлено через 18 минут Мне кстати очень понравилось, что ты тут решил сэкономить одну строчку кода и преобразовал массив Long в Currency значения) Ну теперь это супер-профессиональный костыль! Ура! Найден супер код))) Добавлено через 4 минуты Добавлено через 3 минуты Я что-то такое как раз и хотел сделать компактное, сегодня весь день об этом мечтал, мучился, пробовал, почти получилось у меня и почти допёр но не смог а вот ты как раз сделал то что надо! Большое тебе спасибо огромное при огромное))))))) Добавлено через 1 минуту Вариант с PutMem4 и отдельной функцией мне кстати сразу не понравился а вот тут прям то что надо!!!!! Добавлено через 46 минут Код сохранения в PNG теперь получился такой вот компактный:
Хотя такой же код можно было бы сделать чтобы стрим сразу в файл сохранялся кстати и юникод тогда поддерживался бы в имени файла...
1
|
|||||||
|
Вернулся
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
|
||
| 17.01.2025, 02:58 [ТС] | ||
|
testuser2, да, ты всё правильно понял, ObjPtr обязателен да, я проверял в SaveAsFile нельзя напрямую передать объект, так что ByVal ObjPtr там обязателен
Добавлено через 3 минуты Добавлено через 34 секунды Этот GUID это постоянная константа, которая слава Богу, подходит для всех версий Windows Добавлено через 13 минут testuser2, самое главное, что этот код полностью совместим с твоим любимым VBA, в отличии от кодов раннего связывания с использованием TLB, для работы с потоками IStream
0
|
||
| 17.01.2025, 07:25 | |||||||
|
Насчет ObjPtr я имел в виду, что если объявить функцию
0
|
|||||||
|
Модератор
|
||||
| 17.01.2025, 10:08 | ||||
|
2
|
||||
|
787 / 308 / 17
Регистрация: 21.01.2023
Сообщений: 530
|
|
| 17.01.2025, 10:38 | |
|
2
|
|
| 17.01.2025, 12:11 | |||||||
|
Насчет "волшебства" еще не все.
0
|
|||||||
|
Модератор
|
|||
| 17.01.2025, 13:20 | |||
Set ADOStream = CreateObject("ADODB.Stream") у нас счетчик ссылок на объект образно становится в 1, указывая объекту что на него есть 1 ссылка в лице переменной ADOStream. Далее когда мы вызываем vbaCastObj то делаем ADODB.Stream::QueryInterface (IID_IStream, &pStm) соответственно счетчик ссылок объекта ADODB.Stream увеличивается и становится равным 2 и теперь мы ссылаемся на тот же самый объект 2-мя переменными ADOStream и pStm, где pStm - временная переменная создаваемая VB6 в качестве возвращаемого значения функции vbaCastObj. После выхода из функций VB6 автоматически очищает все нескалярные переменные (массивы, строки и объекты). Соответственно при выходе из метода автоматом вызываются ADOStream::Release и pStm::Release, обнуляя счетчик ссылок и удаляя объект. Сделав возвращаемое значение vbaCastObj As Long, мы соответственно не освобождаем ссылку на pStm, хотя можем это сделать вручную через vbaObjSet к примеру. Только это ни к чему если мы и так имеем механизм автоматического освобождения интерфейсных ссылок.ByVal Obj - VB6 передает ByRef и соответственно ничего не получится.
1
|
|||
| 17.01.2025, 13:25 | |||||||
|
Добавлено через 1 минуту Функция получения hex-маски
0
|
|||||||
|
Модератор
|
||||||
| 17.01.2025, 13:29 | ||||||
|
Вот пример проблемы:
2
|
||||||
| 17.01.2025, 14:13 | ||
|
0
|
||
| 17.01.2025, 14:13 | |
|
Можно ли научится работать ASP.NET на основе Visual Basic Где бесплатно скачать учебник по Visual Basic 6 и Visual Basic .Net ? Вычисление значений функции двух переменных в Visual Basic - Visual Basic
Как работать с потоками? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики
1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
|
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928
Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
|
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего
Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
|
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы
Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
|
|
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока
Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
|
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
|
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат»
Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
|
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
|