|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
Как работать с потоками IStream в Visual Basic 616.11.2024, 18:08. Показов 13188. Ответов 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
|
|||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|||
| 17.11.2024, 20:55 [ТС] | |||
|
Добавлено через 11 минут The trick, вот ты называешь функции для работы со стримами "костылём", хотя сам же и используешь апи-функцию для создания стрима (так как такого метода просто нет). Так что апи-функции никакой это не костыль, а просто другой способ и всё. Добавлено через 16 минут У вас же нету метода IStream::Create поэтому вы и создаёте только через функцию API Добавлено через 3 минуты Добавлено через 49 секунд Значит безымянных функций в DLL нету???? я ошибался?
0
|
|||
|
Модератор
|
||||
| 17.11.2024, 21:01 | ||||
|
1
|
||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 17.11.2024, 21:10 [ТС] | |
|
Это метод IStorage но не IStream но спасибо за информацию, думаю дискуссию можно прекращать уже по этому поводу. Всё равно каждый остаётся при своём мнении.
0
|
|
|
Модератор
|
||
| 17.11.2024, 21:15 | ||
|
1
|
||
|
Модератор
|
||
| 17.11.2024, 21:17 | ||
|
1
|
||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|||
| 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
|
||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 17.11.2024, 23:46 [ТС] | |
|
The trick, мне тут понадобилось. как узнать текущее положение указателя Seek? На каком оно сейчас месте находится, на каком смещении?
Добавлено через 4 минуты А точнее мне нужно, как узнать новую позицию указателя после выполнения функции Seek?
0
|
|
|
|
|
| 17.11.2024, 23:58 | |
|
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||||||
| 18.11.2024, 00:18 [ТС] | ||||||
|
Я думаю что так будет возвращать новую позицию:
Я тут для себя увидел что API мне не предоставляет возвращаемого значения фактического количество байтов, считанных из потокового объекта, поэтому скорее всего придётся юзать ISequentialStream::Read Добавлено через 31 секунду Ну то есть через DispCallByVtbl конечно же, я же не дурак TLB с собой таскать.
0
|
||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||||||
| 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
|
|||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 19.11.2024, 12:46 [ТС] | |
|
Нет, там всё правильно у меня написано, последний код, что я скинул работает как надо. Всё именно так как надо. И возвращает необходимое мне значение. Это правильный код уже окончательный. Read, Write As Long надо, а вот Seek уже As Currency надо там почему-то, как мы видим, за то всё работает теперь.
Я же говорил про API там вообще к shlwapi.dll там вообще не возвращает то что мне надо, дурацкие функции, трюк был прав.
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 12.01.2025, 04:57 [ТС] | |
|
У меня вопрос. А создавать поток можно через CreateObject("ADODB.Stream") ???
Добавлено через 36 минут Может, DispCallByVtbl вообще не нужен? Если можно работать через объект?
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 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
|
||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 12.01.2025, 18:00 [ТС] | |
|
The Trick это делал через vbaCastObj но vbaCastObj вызывает фатальный крах в Твин Бейсике поэтому этот способ мне не подходит.
Добавлено через 2 минуты Сейчас просто когда мы пишем новые коды, мы так же думаем и о том, чтобы код был совместим с Твин Бейсиком. А раньше пофиг было, когда было одно VB6.
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 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
Как работать с потоками? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы
Всем привет! Хочу поделиться свежим (и довольно. . .
|
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
|
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения:
- добавлена многоязычность
- добавлено снятие скриншотов
- добавлено поддержание бафов хождения по воде (для жреца, дк и шамана)
- и так, по. . .
|