|
Вернулся
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
|
|
Как работать с потоками IStream в Visual Basic 616.11.2024, 18:08. Показов 13683. Ответов 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
Сообщений: 531
|
|
| 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
Как работать с потоками? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет
Новости компьютерного мира и их обсуждение (4)
Салют, шампанское, овации!
:drink:
|
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр.
Дословно, отклонённая. . .
|
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы
Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
|
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
|
|
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2.
Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
|
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
|
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
|
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
|