Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/40: Рейтинг темы: голосов - 40, средняя оценка - 4.88
Вернулся
 Аватар для HackerVlad
1778 / 673 / 46
Регистрация: 10.09.2021
Сообщений: 2,820

Как работать с потоками IStream в Visual Basic 6

16.11.2024, 18:08. Показов 14402. Ответов 206
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Я недавно узнал о таком чуде как потоки IStream, это такие данные в оперативной памяти вашего процесса EXE типа байтовых массивов только круче. Как я это понял лично. Вот мне очень интересно стало поработать именно со стримами. Если у кого-то есть какие-то наработки в этом плане буду рад, если поделитесь.

Из того, что я пока узнал:

Есть API для создания, чтения и записи стримов - это функции SHCreateMemStream, IStream_Write, IStream_Read и IStream_Size. Это конечно очень интересно всё, но я не нашёл функции для позиционирования IStream_Seek (её что не существует?).

Есть возможность управлять стримами через объявления в TLB, однако мне эта тема не интересна, так как я не люблю подключать всякие там TLB.

Есть возможность управлять потоками IStream через специальную функцию DispCallByVtbl

Хотелось бы подробно разобрать эту тему и научиться:

1. Создавать поток IStream
2. Записывать
3. Считывать
4. Позиционировать
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.11.2024, 18:08
Ответы с готовыми решениями:

Как работать с камерой в Visual Basic
Как сделать прогу чтобы в ней отображалось то шо я снимаю и возможно было менять настройки камеры (яркость, гамма, контрасность,...

Как работать в Visual Basic'е с реестром?
Народ, может кто подскажет, как работать в Visual Basic'е с реестром?

Как работать с таблицами Ecxel в Visual Basic?
Как работать с таблицами Ecxel в Visual Basic?

206
1412 / 876 / 93
Регистрация: 08.02.2017
Сообщений: 3,728
Записей в блоге: 2
13.01.2025, 01:21
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от HackerVlad Посмотреть сообщение
функции vbaCastObj
В TB не реализована этой функция, я тоже это замечал, когда пытался перенести код Анатолия на Твин-бейсик.

Добавлено через 3 минуты
Цитата Сообщение от HackerVlad Посмотреть сообщение
так как я очень люблю недокументированные функции
А я не люблю недокументированость, лучше бы все делали для народа и документировали хорошо, а еще нет гарантии, что будут поддерживать (ах вы раскрыли нашу тайну, так мы не будем ее поддерживать = типо того)
0
Вернулся
 Аватар для HackerVlad
1778 / 673 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
14.01.2025, 02:21  [ТС]
Из этих 4 способов, я выделю два самых достойных способа это:

1. Использование DispCallFunc (этот вариант понравится для testuser2 так как он не любит недокументированные функции)
2. Использование связки недокументированных функций SHWeakQueryInterface/SHWeakReleaseInterface

Оба способа я хочу потом разобрать более подробно. В обоих случаях мы сможем получить доступ к объекту IStream из любого кода позднего связывания через
Visual Basic
1
Set oStream = CreateObject("ADODB.Stream")
так как это очень удобный способ создания стрима для функций которыми потом будет удобно делиться через Ctrl+C и Ctrl+V.

Я когда поднимал эту тему вообще, в самом начале написал, что меня не интересует вообще даже всякий там код раннего связывания, через TLB, так как делиться этим кодом с другими людьми, будет очень неудобно.

Добавлено через 5 минут
Цитата Сообщение от testuser2 Посмотреть сообщение
В TB не реализована этой функция, я тоже это замечал, когда пытался перенести код Анатолия на Твин-бейсик.
Кстати ты же зарегался на гитхабе вроде как валенок? Создай запрос на эту функцию плиз, а то кроме меня никто не хочет.
0
1412 / 876 / 93
Регистрация: 08.02.2017
Сообщений: 3,728
Записей в блоге: 2
14.01.2025, 02:32
Интересно, а что делает вообще эта функция vbaCastObj? Я то как-то особо не пользуюсь, я ее не понимаю.
cast (перевод): бросать, отбрасывать, отливать, лить, метать, закидывать
0
Вернулся
 Аватар для HackerVlad
1778 / 673 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
14.01.2025, 03:09  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
а что делает вообще эта функция vbaCastObj?
это вопрос к The Trick'у уже. Ну а ты обязательно создай запрос на эту функцию на Гитхабе на ТвинБейсик, если ты хочешь чтобы программные коды Анатолия у тебя работали. Они просто эту функцию не добавили почему-то. Наверное очень сильно мало людей на планете Земля, таких как Анатолий которые используют эту функцию, что они даже про неё и не знали, что людям она нужна :-)

Добавлено через 9 минут
Описания к функции vbaCastObj абсолютно нигде нет в интернете, однако нам примерно понятно, что vbaCastObj вызывает QueryInterface на объекте, но существует аналог этой функции это SHWeakQueryInterface которая немного по другому чуть работает и которая тоже не документирована...

Ну вот смотри для того чтобы вызвать QueryInterface на объекте The Trick использует связку двух функций это vbaCastObj и PutMem4, я достигаю того же самого используя тоже связку двух функций это SHWeakQueryInterface и SHWeakReleaseInterface. Ну короче я примерно объяснил. А более подробно только The Trick знает.

Добавлено через 2 минуты
Короче чтобы, например, найти объект IUnknown внутри объекта ADODB.Stream приходится использовать только эти недокументированные функции. Либо vbaCastObj/PutMem4 либо SHWeakQueryInterface/SHWeakReleaseInterface.
0
1412 / 876 / 93
Регистрация: 08.02.2017
Сообщений: 3,728
Записей в блоге: 2
14.01.2025, 03:39
Влад, я мало что понимаю в этих квери-интерфейсах и стримах. Ты бы сам написал туда, это было бы лучше. Там надо писать минимальный пример.
0
Вернулся
 Аватар для HackerVlad
1778 / 673 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
14.01.2025, 03:40  [ТС]
Ай не хочу я им писать мне это не надо.

Добавлено через 17 секунд
Цитата Сообщение от testuser2 Посмотреть сообщение
квери
я такого слова не знаю.
0
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
14.01.2025, 21:18
Цитата Сообщение от HackerVlad Посмотреть сообщение
Описания к функции vbaCastObj абсолютно нигде нет в интернете
Эта функция приведения объектного типа. По факту запрашивает нужный IID то бишь вызывает IUnknown::QueryInterface.
2
Вернулся
 Аватар для HackerVlad
1778 / 673 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
14.01.2025, 21:32  [ТС]
Итак вот вариант как использовать магическое число 76 и работать с объектом, только для Windows 7:
На форме обязательно должна быть картинка, это просто тестовый проект-пример.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Option Explicit
Private Declare Function IStream_Size Lib "shlwapi" Alias "#214" (ByVal ptrIStream As Long, ULARGE_INTEGER As Currency) As Long
 
Private Sub Command1_Click()
    Dim ADOStream As Object
    Dim IStreamPtr As Long
    
    Set ADOStream = CreateObject("ADODB.Stream")
    IStreamPtr = ObjPtr(ADOStream) + 76 ' Волшебное число для Windows 7
    
    ' Открыть поток в бинарном режиме (аналог SHCreateMemStream)
    ADOStream.Type = 1 ' adTypeBinary
    ADOStream.Open
    
    ' Теперь попробуем что-нибудь записать в поток, например картинку с формы
    Dim pPic As IPicture
    
    Set pPic = Me.Picture
    pPic.SaveAsFile ByVal IStreamPtr, True, 0 ' Записать в поток картинку Picture с формы, сохраняя данные в BMP-формате
    
    ' Теперь попробуем узнать сколько байтов занимает этот поток
    Dim sizeStream As Currency
    
    IStream_Size IStreamPtr, sizeStream
    MsgBox "Поток занимает: " & sizeStream * 10000@ & " байт", vbInformation
    
    ' Этот код будет эквивалентен вызову ADOStream.Size
    MsgBox "Поток занимает: " & ADOStream.Size
    
    If ADOStream.Size > 0 Then
        ' Потом этот поток, можно сохранить в файл на диске например
        ' Получить байтовый массив из потока
        Dim bArray() As Byte
        
        ADOStream.Position = 0
        bArray = ADOStream.Read
        
        ' Сохранить на диск
        Dim FileNo As Integer
        
        FileNo = FreeFile
        On Error Resume Next: Kill App.Path & "\test_picture.bmp"
        Open App.Path & "\test_picture.bmp" For Binary As FileNo
            Put #FileNo, , bArray
        Close FileNo
    End If
End Sub
Вложения
Тип файла: zip ADODB.Stream.zip (106.5 Кб, 2 просмотров)
0
Вернулся
 Аватар для HackerVlad
1778 / 673 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
14.01.2025, 21:34  [ТС]
Но как сохранить поток IStream в файл на диске более простым способом я не знаю, к сожалению, только через преобразование в байтовый массив и ручное сохранение на диске... А хотелось бы какую-нибудь простую функцию которая бы принимала поток IStream и записывала бы сразу в файл на диске поток.
0
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
14.01.2025, 21:48
SHCreateStreamOnFileEx - создает COM поток на файле, уже как мне кажется, писал об этом.
0
Вернулся
 Аватар для HackerVlad
1778 / 673 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
15.01.2025, 23:25  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Ты бы сам написал туда, это было бы лучше.
Ты знаешь, меня всё-таки услышали и добавили эту функцию __vbaCastObj, в новой бэтте: https://www.vbforums.com/showt... ost5667879

Добавлено через 1 минуту
Теперь значит можно так же пользоваться технологией The Trick, получается и использовать функцию __vbaCastObj уже смело)

Добавлено через 30 секунд
Очень удивлён как быстро они откликнулись) Молодцы прям)

Добавлено через 3 часа 30 минут
Цитата Сообщение от The trick Посмотреть сообщение
SHCreateStreamOnFileEx
Она сложнее, там ещё и структуры описывать надо. А функция SHCreateStreamOnFile обычная не подойдёт? Без Ex?
0
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
15.01.2025, 23:28
Цитата Сообщение от HackerVlad Посмотреть сообщение
там ещё и структуры описывать надо
Какие структуры?
0
Вернулся
 Аватар для HackerVlad
1778 / 673 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
15.01.2025, 23:33  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Какие структуры?
STGM и FILE_ATTRIBUTES, но скорее всего можно обойтись и без этого. Просто я искал объявление на VB в Интернете этой функции и единственное место где я нашёл пример этого объявления это вот здесь: https://www.vbforums.com/showt... ost5225243

Добавлено через 1 минуту
Ладно попробуем переписать декларацию так чтобы небыло никаких структур.

Добавлено через 1 минуту
STGM это же просто набор констант, не понимаю зачем fafalone тогда это написал как структуру - наверное ему так просто удобнее, короче если там можно просто написать Long тогда всё ок
0
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
15.01.2025, 23:34
Цитата Сообщение от HackerVlad Посмотреть сообщение
STGM и FILE_ATTRIBUTES
Это не структуры и в SHCreateStreamOnFileW STGM константы также нужны.
0
Вернулся
 Аватар для HackerVlad
1778 / 673 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
15.01.2025, 23:35  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
уже как мне кажется, писал об этом
не знаю писал или нет, но поисковик яндекс не находит, только на vbforums в одном месте нашло
0
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
15.01.2025, 23:35
Цитата Сообщение от HackerVlad Посмотреть сообщение
зачем fafalone тогда это написал как структуру
Где написал? Скорее всего речь шла о https://learn.microsoft.com/en... dl-statstg
0
Вернулся
 Аватар для HackerVlad
1778 / 673 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
15.01.2025, 23:36  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Это не структуры
Не удивлюсь если fafalone написал это как Enum
Или тогда по твоему что это значит в его коде "ByVal grfMode As STGM"...
0
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
15.01.2025, 23:44
Цитата Сообщение от HackerVlad Посмотреть сообщение
не знаю писал или нет, но поисковик яндекс не находит, только на vbforums в одном месте нашло
Писал вначале этой темы чтобы ты использовал эту функцию, а не ее декларации. Там декларации элементарные:
Visual Basic
1
2
3
4
5
6
7
Public Declare Function SHCreateStreamOnFileEx Lib "Shlwapi" ( _
                        ByVal pszFile As Long, _
                        ByVal grfMode As Long, _
                        ByVal dwAttributes As Long, _
                        ByVal fCreate As Long, _
                        ByVal pstmTemplate As IUnknown, _
                        ByRef ppstm As IUnknown) As Long
Добавлено через 4 минуты
Цитата Сообщение от HackerVlad Посмотреть сообщение
Не удивлюсь если fafalone написал это как Enum
Ну так это удобнее, я тоже так делаю чтобы нужные константы показывались.
1
Вернулся
 Аватар для HackerVlad
1778 / 673 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
15.01.2025, 23:54  [ТС]
Мне только непонятно теперь что два последних параметра - это стримы. В какой параметр нужно указать стрим не знаю.
И по моей глупой идее я хотел передавать существующий стрим с данными в функцию, но потом понял наверное что я был неправ. И что скорее всего функцию вообще вернёт абсолютно новый стрим который будет синхронизирован с файлом и в него придётся уже записывать данные. Это всё мои догадки. Не знаю поведения этой функции. Гадаю вот.

Добавлено через 51 секунду
В простой функции SHCreateStreamOnFile там хотябы один параметр стрима, там не пришлось бы долго ломать голову как здесь.
0
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
15.01.2025, 23:56
HackerVlad, чтобы сохранить картинку в стрим нужно этот стрим и передавать:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Private Function SaveCurrentImage() As Boolean
    Dim tPNGCodec   As UUID
    Dim cFileStm    As IStream
    Dim sFullPath   As String
    Dim lPathLen    As Long
    
    If Not GetEncoders(tPNGCodec) Then
        Exit Function
    End If
    
    sFullPath = Space$(MAX_PATH)
    
    lPathLen = GetFullPathName(txtPath.Text & "\" & CStr(m_lImgID) & ".png", Len(sFullPath) + 1, sFullPath, ByVal NULL_PTR)
    
    If lPathLen = 0 Then
        Exit Function
    Else
        sFullPath = Left$(sFullPath, lPathLen)
    End If
    
    If SHCreateStreamOnFileEx(sFullPath, STGM_CREATE Or STGM_READWRITE, FILE_ATTRIBUTE_NORMAL, 1, Nothing, cFileStm) < 0 Then
        Exit Function
    End If
    
    If GdipSaveImageToStream(m_hGPBitmap, cFileStm, tPNGCodec, ByVal NULL_PTR) <> Ok Then
        Exit Function
    End If
    
    m_lImgID = m_lImgID + 1
    
    SaveCurrentImage = True
    
End Function
Добавлено через 40 секунд
Цитата Сообщение от HackerVlad Посмотреть сообщение
там не пришлось бы долго ломать голову как здесь.
А что ломать? Ты что не видишь какой у тебя параметр ByRef, а какой ByVal? Как через ByVal вернуть значение по-твоему? Ну и в описании функции все описано:
[out] ppstm

Type: IStream**

Receives an IStream interface pointer for the stream associated with the file.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.01.2025, 23:56

Можно ли научится работать ASP.NET на основе Visual Basic
Всем доброго времени суток. Немножко владею навыками создавть и писать программы на VS 2010 на основе Visual Basic-a, можно ли научится...

Где бесплатно скачать учебник по Visual Basic 6 и Visual Basic .Net ?
Где бесплатно скачать учебник по Visual Basic 6 и Visual Basic .Net

Вычисление значений функции двух переменных в Visual Basic - Visual Basic
Помогите пожалуйста! В среде VB написать программу вычисления значений функции двух переменных. Ориентировочный вид окна программы и...

Как быстро работать с комбинациями стилей текста(жирный, курсив, жирный + курсив и т. д.) в Visual Basic?
Здравствуйте. Я учусь в университете, нам задали написать текстовый редактор. Я использую RichTextBox и мне нужно, чтобы я по нажатию...

Как работать с потоками?
Как создать поток? Как его стартануть? В какой он библиотеке? И вообще, как он называется? Когда гуглю, находится много информации про...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
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 и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru