|
Вернулся
1777 / 672 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
|
|
Как работать с потоками IStream в Visual Basic 616.11.2024, 18:08. Показов 14352. Ответов 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? |
|
Модератор
|
|||
| 17.11.2024, 20:01 | |||
|
Добавлено через 12 минут Добавлено через 4 минуты Самый правильный метод вызова методов IStream - вызывать через библиотеку типов. В VB6 - это нативный вариант из коробки, как раз для чего VB6 и создавался - для прозрачной работы с COM.
0
|
|||
|
Вернулся
1777 / 672 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
|
|||
| 17.11.2024, 20:55 [ТС] | |||
|
Добавлено через 11 минут The trick, вот ты называешь функции для работы со стримами "костылём", хотя сам же и используешь апи-функцию для создания стрима (так как такого метода просто нет). Так что апи-функции никакой это не костыль, а просто другой способ и всё. Добавлено через 16 минут У вас же нету метода IStream::Create поэтому вы и создаёте только через функцию API Добавлено через 3 минуты Добавлено через 49 секунд Значит безымянных функций в DLL нету???? я ошибался?
0
|
|||
|
Модератор
|
||||
| 17.11.2024, 21:01 | ||||
|
1
|
||||
|
Вернулся
1777 / 672 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
|
|
| 17.11.2024, 21:10 [ТС] | |
|
Это метод IStorage но не IStream но спасибо за информацию, думаю дискуссию можно прекращать уже по этому поводу. Всё равно каждый остаётся при своём мнении.
0
|
|
|
Модератор
|
||
| 17.11.2024, 21:15 | ||
|
1
|
||
|
Модератор
|
||
| 17.11.2024, 21:17 | ||
|
1
|
||
|
Вернулся
1777 / 672 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
|
|||
| 17.11.2024, 21:24 [ТС] | |||
|
Добавлено через 57 секунд Добавлено через 1 минуту The trick, но всё равно я не понимаю почему ты используешь апи-функцию в своём коде для создания стрима, если ты так очень сильно любишь методы, интерфейсы и TLB и ещё вопрос: почему в XP нету названий этих функций Добавлено через 2 минуты Вот почему ты используешь функцию SHCreateMemStream вместо того чтобы использовать свои интерфейсы и методы. SHCreateMemStream это же функция такая же как и другие мои функции значит эта функция тоже костыль. Всё. Такая логика.
0
|
|||
|
Модератор
|
||
| 17.11.2024, 21:33 | ||
|
TLB - это библиотека типов, в ней могут содержаться и интерфейсы и типы и константы и API функции - абсолютно все тоже что и в VB6 и даже больше (к примеру алиасы). Считай это аналогом h файлов в С/С++. Это просто описание, это не код и ни DLL. Также как к примеру ты объявляешь в коде Type/Declare Function и т.д. COM интерфейс - это контракт взаимодействия с COM объектами. В самом простом случае это таблица функций с определенным соглашением. Чтобы вызывать методы COM интерфейса, нужно просто вызывать методы COM интерфейса, также как ты в любом классе вызываешь Class1.Method. Чтобы создать COM объект можно либо создать его по ID, также как ты в VB6 создаешь его через New (CreateObject), а можно вызвать функцию/метод которая вернет нужный объект с нужной интерфейсной ссылкой (аналогично в стандартном модуле функция возвращающая объект). Чтобы вызывать методы - не нужны API функции - они просто лишнее звено.
1
|
||
|
Вернулся
1777 / 672 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
|
|
| 17.11.2024, 23:46 [ТС] | |
|
The trick, мне тут понадобилось. как узнать текущее положение указателя Seek? На каком оно сейчас месте находится, на каком смещении?
Добавлено через 4 минуты А точнее мне нужно, как узнать новую позицию указателя после выполнения функции Seek?
0
|
|
|
|
|
| 17.11.2024, 23:58 | |
|
0
|
|
|
Вернулся
1777 / 672 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
|
||||||
| 18.11.2024, 00:18 [ТС] | ||||||
|
Я думаю что так будет возвращать новую позицию:
Я тут для себя увидел что API мне не предоставляет возвращаемого значения фактического количество байтов, считанных из потокового объекта, поэтому скорее всего придётся юзать ISequentialStream::Read Добавлено через 31 секунду Ну то есть через DispCallByVtbl конечно же, я же не дурак TLB с собой таскать.
0
|
||||||
|
Вернулся
1777 / 672 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
|
||||||
| 18.11.2024, 22:41 [ТС] | ||||||
|
Мне всё же придётся отказать от API-функций, но не потому что "это костыль", а потому что API-функция IStream_Read имеет фундаментальный недостаток, а именно не возвращает необходимое мне значение фактического количества считанных байт, что является крайне важным для меня.
Добавлено через 2 минуты Мне нужна функция IStream_Read которая возвращает фактическое количество считанных байтов обязательно. А не просто S_OK или код ошибки. Добавлено через 9 минут Возвращать значение фактического количества прочитанных/записанных байт, это очень сильно важно для меня, чтобы не рухнула вся логика моей программы, поэтому API-функции к shlwapi.dll здесь бессильны и зря я вообще на них смотрел даже получается, раз они не умеют возвращать нормальное значение, которое мне очень надо. Добавлено через 1 час 46 минут Вот как будет правильно:
0
|
||||||
| 19.11.2024, 12:29 | |||
|
0
|
|||
|
Вернулся
1777 / 672 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
|
|
| 19.11.2024, 12:46 [ТС] | |
|
Нет, там всё правильно у меня написано, последний код, что я скинул работает как надо. Всё именно так как надо. И возвращает необходимое мне значение. Это правильный код уже окончательный. Read, Write As Long надо, а вот Seek уже As Currency надо там почему-то, как мы видим, за то всё работает теперь.
Я же говорил про API там вообще к shlwapi.dll там вообще не возвращает то что мне надо, дурацкие функции, трюк был прав.
0
|
|
|
Вернулся
1777 / 672 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
|
|
| 12.01.2025, 04:57 [ТС] | |
|
У меня вопрос. А создавать поток можно через CreateObject("ADODB.Stream") ???
Добавлено через 36 минут Может, DispCallByVtbl вообще не нужен? Если можно работать через объект?
0
|
|
|
Вернулся
1777 / 672 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
|
|
| 12.01.2025, 16:47 [ТС] | |
|
Пользователь VanGoghGaming в этом посте: https://www.vbforums.com/showt... ost5621680 явно утверждает, что это возможно.
Цитирую: "лучшая версия, которая вообще не использует «SHCreateMemStream», поскольку объект «IStream» может быть получен из объекта «ADODB.Stream»". Но скорее всего, это не так просто получить адрес на объект IStream из объекта «ADODB.Stream».
0
|
|
| 12.01.2025, 17:07 | ||
|
0
|
||
|
Вернулся
1777 / 672 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
|
|
| 12.01.2025, 18:00 [ТС] | |
|
The Trick это делал через vbaCastObj но vbaCastObj вызывает фатальный крах в Твин Бейсике поэтому этот способ мне не подходит.
Добавлено через 2 минуты Сейчас просто когда мы пишем новые коды, мы так же думаем и о том, чтобы код был совместим с Твин Бейсиком. А раньше пофиг было, когда было одно VB6.
0
|
|
|
Вернулся
1777 / 672 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
|
|
| 13.01.2025, 00:41 [ТС] | |
|
Итак, есть несколько способов как получить объект IStream из ADODB.Stream
1. Использование, так называемых, магических чисел, это прибавочный адрес смещения к ObjPtr(oStream), но этот способ не очень так как в разных версиях операционных систем будет разное "магическое число", в семёрке это будет 76, а в десятке, например, 68, поэтому этот вариант мы сразу отметаем 2. Использование технологии от The Trick с использованием функции vbaCastObj, но этот вариант мне не понравился тем что в ТвинБейсике не работает, а так очень хороший вариант кстати 3. Использование DispCallFunc вполне себе достойный вариант кстати, предложенный пользователем wqweto (всем известный болгар) 4. Использование недокументированных функций SHWeakQueryInterface и SHInterlockedCompareExchange описание которых ни в одном MSDN днём с огнём не найдёшь, но какой-то интересный новый юзер anycoder опубликовал этот код на иностранном форуме, чем меня очень заинтересовал, так как я очень люблю недокументированные функции
0
|
|
| 13.01.2025, 00:41 | |
|
Можно ли научится работать ASP.NET на основе Visual Basic Где бесплатно скачать учебник по Visual Basic 6 и Visual Basic .Net ? Вычисление значений функции двух переменных в Visual Basic - Visual Basic
Как работать с потоками? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки
Правым кликом по серверу -> отладочная информация -> edit
Заменить "net": "raw", на "net": "tcp",
Нажать кнопку reload.
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|