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

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

16.11.2024, 18:08. Показов 13680. Ответов 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
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
17.01.2025, 14:23  [ТС]
Студворк — интернет-сервис помощи студентам
Я вообще не знал что ByVal можно писать как As Any, я думал это невозможно, я думал что As Any всегда ByRef и что даже в коде не напишешь иначе) а тут написали)

Добавлено через 1 минуту
Цитата Сообщение от The trick Посмотреть сообщение
bbb Lib "msvbvm60" Alias "VarPtr" (ByVal p As Any)
Я имею ввиду такие объявления, первый раз в жизни вижу ByVal As Any

Добавлено через 3 минуты
По сути тут что ByRef что ByVal одно и тоже получается, ByVal не работает короче
Это как передача массивов как ByVal там тоже есть чудеса с этим помню
А ещё я вспомнил что есть исключительные случаи когда в IDE работает а в EXE уже не работает если где-то перепутать ByVal с ByRef помню сталкивался
0
1406 / 865 / 93
Регистрация: 08.02.2017
Сообщений: 3,696
Записей в блоге: 2
17.01.2025, 14:33
Цитата Сообщение от HackerVlad Посмотреть сообщение
есть исключительные случаи когда в IDE работает а в EXE уже не работает если где-то перепутать ByVal с ByRef помню сталкивался
Это также не правильно, даже из описания понятно, это буквально баг 100%, если есть такие случаи

Добавлено через 1 минуту
Цитата Сообщение от HackerVlad Посмотреть сообщение
Это как передача массивов как ByVal
массивы и UDT нельзя передавать ByVal в VB вообще-то
1
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
17.01.2025, 14:33  [ТС]
Кстати я ни давно узнал что PNG это формат сжатый с помощью ZIP очень удивился этому
1
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
17.01.2025, 14:35
Цитата Сообщение от HackerVlad Посмотреть сообщение
По сути тут что ByRef что ByVal одно и тоже получается, ByVal не работает короче
Где так получается? Ты код смотрел?
0
1406 / 865 / 93
Регистрация: 08.02.2017
Сообщений: 3,696
Записей в блоге: 2
17.01.2025, 14:35
Цитата Сообщение от HackerVlad Посмотреть сообщение
Я имею ввиду такие объявления, первый раз в жизни вижу ByVal As Any
Стандартное поведение должно быть ByRef - в функцию передается указатель переменной, ByVal - передаются данные, записанные в эту переменную.
Visual Basic
1
2
VarPtr(123&) 'Указатель переменной
VarPtr(ByVal 123&) 'Данные переменной (123)
0
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
17.01.2025, 14:38  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
нельзя передавать ByVal
А вот так можно, но скорее всего это псевдо ByVal будет:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Private Sub x_arr(ByVal arr1)
    MsgBox arr1(0)
End Sub
 
Private Sub Command1_Click()
    Dim strs() As String
    
    ReDim strs(0)
    strs(0) = "strs"
    x_arr strs
End Sub
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
17.01.2025, 14:40
Цитата Сообщение от testuser2 Посмотреть сообщение
Функция получения hex-маски
У меня такая:
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
Public Function MakeHexString( _
                ByRef bData() As Byte) As String
    Dim lLength As Long
    Dim bOut()  As Byte
    Dim lIndex  As Long
    Dim lChar   As Long
    Dim lSymbol As Long
    Dim lDig    As Long
    Dim lValue  As Long
    
    lLength = SafeArrayElementsCount(Not Not bData())
    If lLength <= 0 Then Exit Function
    
    ReDim bOut(lLength * 4 - 1)
    
    For lIndex = 0 To lLength - 1
        
        lValue = bData(lIndex)
        
        For lDig = 0 To 1
            
            lSymbol = (lValue And &HF0) \ &H10
            
            Select Case lSymbol
            Case Is < 10:   lSymbol = lSymbol + &H30
            Case Else:      lSymbol = lSymbol + &H37
            End Select
            
            bOut(lChar) = lSymbol
            
            lValue = lValue * &H10
            lChar = lChar + 2
            
        Next
        
    Next
    
    MakeHexString = bOut()
    
End Function
Это если не подходит поведение CryptBinaryToString.
1
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
17.01.2025, 14:43  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Где так получается? Ты код смотрел?
Ошибся, неправильно посмотрел
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
17.01.2025, 14:45
Цитата Сообщение от HackerVlad Посмотреть сообщение
псевдо ByVal будет
Это не ByVal, тут передается Variant содержащий ссылку на массив. Variant передается по значению просто.
0
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
17.01.2025, 14:54  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
SafeArrayElementsCount
А что это такое? не описанное

Добавлено через 52 секунды
Ты забыл декларацию приложить походу
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
17.01.2025, 14:57
HackerVlad, https://www.cyberforum.ru/post10043131.html
0
1406 / 865 / 93
Регистрация: 08.02.2017
Сообщений: 3,696
Записей в блоге: 2
17.01.2025, 15:06
А я еще вот недавно на Твин-Бейсике наизобретал )
Кликните здесь для просмотра всего текста
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
    Private Const MaxBase& = 222
    Private ChrTbl(MaxBase - 1) As Integer '()
    [Debuggable(False)]
    Sub BytesToBaseXEncode_Init()
        Static Init As Boolean
        If Init Then
        Else
            Dim i&
            Dim sChrRng As String = _
            "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/!""#$%&'()*,-.:;<>?@[\]^_`{|}~ ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—˜™љ›њќћџЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕї=АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
            CopyMemory ChrTbl(0), ByVal StrPtr(sChrRng), MaxBase * 2
            Init = True
        End If
    End Sub
    Function BytesToBaseXEncode(ByVal pBgn As LongPtr, ByVal lSize As Long, ByVal Base As Long) As String
        Select Case Base
        Case 0 To MaxBase
        Case Else: Exit Function
        End Select
        Dim bAr() As Byte: ReDim bAr(lSize - 1)
        vbaCopyBytes lSize, VarPtr(bAr(0)), pBgn
        Dim MaxInd As Long = lSize * 2
        Dim iAr%(): ReDim iAr(MaxInd)
        Dim i As Long = MaxInd, j As Long
        Dim bNum As Byte, md As Long
        
        Dim quo As Long = lSize \ 8
        If quo Then
            md = lSize - quo * 8
            If md Then md -= 1 Else md = 7
        Else
            md = lSize - 1
            GoSub EncodeBytes
            GoTo 1
        End If
        
        GoSub EncodeBytes
        md = 7
        For j = j To lSize - 1
            iAr(i - 1) = 61     'добавляем разделитель ("=")
            i -= 2
            GoSub EncodeBytes
        Next
        1
        Dim strLen As Long = MaxInd - i + 1
        
        BytesToBaseXEncode = String$(strLen, vbNullChar)
        vbaCopyBytes(strLen * 2, StrPtr(BytesToBaseXEncode), VarPtr(iAr(i)))
    Exit Function
    EncodeBytes:
        For j = j To j + md
            bNum = bAr(j)
            If bNum > Base Then
                Do
                    iAr(i) = ChrTbl(CLng(bNum Mod Base))
                    i -= 1
                    bNum = bNum \ Base
                Loop While bNum
            Else
                iAr(i) = ChrTbl(CLng(bNum Mod Base))
                iAr(i - 1) = 48
                i -= 2
            End If
        Next
        Do
            i += 1
        Loop While iAr(i) = 48 'Asc("0")
    Return
    End Function
0
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
17.01.2025, 15:10  [ТС]
The trick, а я думал это API вроде же похожая API была...

Добавлено через 54 секунды
Цитата Сообщение от testuser2 Посмотреть сообщение
на Твин-Бейсике наизобретал
для этого есть тема Твин Бейсика
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
17.01.2025, 15:11
Цитата Сообщение от HackerVlad Посмотреть сообщение
The trick, а я думал это API вроде же похожая API была...
Да, но я написал:
Цитата Сообщение от The trick Посмотреть сообщение
Это если не подходит поведение CryptBinaryToString
0
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
17.01.2025, 15:23  [ТС]
The trick, кстати нашёл я наконец-таки твой код на GDI+
Вот он: https://www.cyberforum.ru/blogs/354370/1721.html там получается очень много строк кода, около 130 строк кода
И сравни с этим всего 40 строк кода, наверное поэтому и придумали делать этот код без GID+ чтобы было мало строк кода:

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
Option Explicit
Private Declare Function vbaCastObj Lib "msvbvm60" Alias "__vbaCastObj" (ByVal cObj As Object, ByRef pIID As Any) As IUnknown
 
Public Function SaveAsPng(ByVal pPic As IPicture) As Byte()
    Dim ADOStream As Object
    Dim WIAImageFile As Object
    Dim bIID_IStream(1) As Currency ' IStreamGUID
    
    Do While WIAImageFile Is Nothing
        Set ADOStream = CreateObject("ADODB.Stream")
        
        ADOStream.Type = 1 ' adTypeBinary
        ADOStream.Open
        
        ' Extract an IStream object from an ADODB.Stream object
        bIID_IStream(0) = 0.0012@
        bIID_IStream(1) = 504403158265495.5712@
        
        pPic.SaveAsFile ByVal ObjPtr(vbaCastObj(ByVal ADOStream, bIID_IStream(0))), True, 0
        
        If ADOStream.Size > 0 Then
            ADOStream.Position = 0
            
            With CreateObject("WIA.Vector")
                .BinaryData = ADOStream.Read
                
                If pPic.Type <> vbPicTypeBitmap Then
                    Set pPic = .Picture ' This converts pPic to vbPicTypeBitmap subtype
                Else
                    Set WIAImageFile = .ImageFile
                End If
            End With
        Else
            Exit Function
        End If
    Loop
    
    ' Serialize WIA.ImageFile to PNG file format
    With CreateObject("WIA.ImageProcess")
        .Filters.Add .FilterInfos("Convert").FilterID
        .Filters(.Filters.Count).Properties("FormatID").Value = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}" ' wiaFormatPNG
        SaveAsPng = .Apply(WIAImageFile).FileData.BinaryData
    End With
End Function
Но на GDI+ мне тоже нравится
P. S. Поставил бы тебе лайк, в блогах нельзя почему-то.

Добавлено через 2 минуты
P. P. S. А я ещё думал кстати делать свой блог тут на киберфоруме, но если нельзя собирать лайки то тогда какой смысл)

Добавлено через 3 минуты
Цитата Сообщение от The trick Посмотреть сообщение
Это если не подходит поведение CryptBinaryToString
Не, я имел ввиду про SafeArrayElementsCount, разве небыло такой похоже API?

Добавлено через 33 секунды
SafeArrayGetDim например же есть

Добавлено через 2 минуты
Вот твоя самописная SafeArrayElementsCount ещё и CopyMemory требует например, а разве нет такой функции в API срузу? Вместо твоей самописной SafeArrayElementsCount
0
1406 / 865 / 93
Регистрация: 08.02.2017
Сообщений: 3,696
Записей в блоге: 2
17.01.2025, 15:28
Цитата Сообщение от HackerVlad Посмотреть сообщение
ByVal ADOStream
Можно не писать ByVal кст., что ByVal, что ByRef, не имеет значения, как теперь выяснилось
1
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
17.01.2025, 15:39  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Можно не писать ByVal кст., что ByVal, что ByRef, не имеет значения
ByVal ObjPtr обязателен.
Может ты имел ввиду что vbaCastObj(ByVal ADOStream
да тут походу ByVal не нужен, хоть The Trick его и написал...

Добавлено через 2 минуты
Спасибо за подсказку, удалил ByVal нафик, теперь получилось вот так вот:

Visual Basic
1
pPic.SaveAsFile ByVal ObjPtr(vbaCastObj(ADOStream, bIID_IStream(0))), True, 0
0
1406 / 865 / 93
Регистрация: 08.02.2017
Сообщений: 3,696
Записей в блоге: 2
17.01.2025, 15:42
В декларации vbaCastObj также можно убрать ByVal и также должно работать по теории..
0
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
17.01.2025, 15:44  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
В декларации vbaCastObj также можно убрать ByVal и также должно работать по теории..
Ну давай попробуем

Добавлено через 21 секунду
testuser2, рухнуло IDE сразу

Добавлено через 31 секунду
testuser2, ты оказался неправ
1
1406 / 865 / 93
Регистрация: 08.02.2017
Сообщений: 3,696
Записей в блоге: 2
17.01.2025, 15:48
Хотя в Эксельке я замечал, в событиях допустим объекты всегда ByVal, может оно как-то прикольнее я х.з.
Visual Basic
1
2
3
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
 
End Sub
Добавлено через 2 минуты
Цитата Сообщение от HackerVlad Посмотреть сообщение
рухнуло IDE сразу
Ну хрен ее знает тогда, этот поворот неожиданен, надо продолжать поиски..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.01.2025, 15:48

Можно ли научится работать 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 и мне нужно, чтобы я по нажатию...

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


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

Или воспользуйтесь поиском по форуму:
160
Ответ Создать тему
Новые блоги и статьи
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
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
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru