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

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

16.11.2024, 18:08. Показов 11632. Ответов 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
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
16.11.2024, 23:45  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от The trick Посмотреть сообщение
Для чего? Понятия не имею. Все это делается без этих костыльных API.
А я люблю API. Я не люблю TLB. Тем более, мне, в моём проекте, нужно обязательно на Long'ах делать. Так как объект мне не подходит. Потому что я могу конвертировать объект в Long, но обратно из Long в объект IUnknown я уже сконвертировать не смогу.

Добавлено через 21 секунду
Цитата Сообщение от The trick Посмотреть сообщение
кому это нужно
Мне это очень нужно
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
16.11.2024, 23:46
HackerVlad, ты сам себе придумываешь проблему и сам же ее решаешь.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
16.11.2024, 23:48  [ТС]
The trick, ну если бы ты видел мой код ты бы понял что мне это необходимо и по другому там никак, потом покажу может как-нибудь
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
16.11.2024, 23:49
Цитата Сообщение от HackerVlad Посмотреть сообщение
и по другому там никак
Я так не думаю. Когда нужно работать с объектом - нужно работать с объектом, а не с Long'ом или еще с чем-то.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
16.11.2024, 23:51  [ТС]
The trick, мне там нужно обязательно засовывать в переменную Long.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.11.2024, 00:31  [ТС]
Итак, я выкладываю очень ценный код для работы с потоками IStream в VB6, для любителей API.

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
Option Explicit
Private Declare Function DispCallFunc Lib "oleaut32" (ByVal pvInstance As Long, ByVal oVft As Long, ByVal lCc As Long, ByVal vtReturn As VbVarType, ByVal cActuals As Long, prgVt As Any, prgpVarg As Any, pvargResult As Variant) As Long
Private Declare Function SHCreateMemStream Lib "shlwapi" Alias "#12" (ByRef pInit As Any, ByVal cbInit As Long) As Long
Private Declare Function IStream_Write Lib "shlwapi" (ByVal ptrIStream As Long, ByVal pv As Long, ByVal cb As Long) As Long
Private Declare Function IStream_Read Lib "shlwapi" (ByVal ptrIStream As Long, ByVal pv As Long, ByVal cb As Long) As Long
Private Declare Function IStream_Size Lib "shlwapi" (ByVal ptrIStream As Long, ULARGE_INTEGER As Currency) As Long
Private Declare Sub IUnknown_AtomicRelease Lib "shlwapi" (ppUnk As Any)
 
Private Enum Stream_Seek
    STREAM_SEEK_SET
    STREAM_SEEK_CUR
    STREAM_SEEK_END
End Enum
 
Dim hStream As Long
 
Private Function DispCallByVtbl(pUnk As Long, ByVal lIndex As Long, ParamArray A() As Variant) As Variant
    Const CC_STDCALL    As Long = 4
#If Win64 Then
    Const PTR_SIZE      As Long = 8
#Else
    Const PTR_SIZE      As Long = 4
#End If
    Dim lIdx            As Long
    Dim vParam()        As Variant
    Dim vType(0 To 63)  As Integer
    Dim vPtr(0 To 63)   As Long
    Dim hResult         As Long
    
    vParam = A
    For lIdx = 0 To UBound(vParam)
        vType(lIdx) = VarType(vParam(lIdx))
        vPtr(lIdx) = VarPtr(vParam(lIdx))
    Next
    hResult = DispCallFunc(pUnk, lIndex * PTR_SIZE, CC_STDCALL, vbLong, lIdx, vType(0), vPtr(0), DispCallByVtbl)
    If hResult < 0 Then
        Err.Raise hResult, "DispCallFunc"
    End If
End Function
 
Private Function IStream_Seek(ByVal ptrIStream As Long, ByVal Offset As Currency, ByVal Origin As Stream_Seek)
    IStream_Seek = DispCallByVtbl(ptrIStream, 5, Offset, Origin, 0)
End Function
 
Private Sub Command1_Click()
    hStream = SHCreateMemStream(ByVal 0&, 0)
    
    Me.Cls
    Print "hStream: " & hStream
End Sub
 
Private Sub Command2_Click()
    Dim str As String
    Dim s1 As Currency
    
    str = "str12345" ' 8 символов это 16 байтов
    
    Me.Cls
    Print IStream_Write(hStream, StrPtr(str), LenB(str))
    
    IStream_Size hStream, s1
    MsgBox s1 * 10000@, vbInformation
End Sub
 
Private Sub Command3_Click()
    Dim strRead As String
    
    strRead = String(16, "X")
    
    Me.Cls
    Print IStream_Read(hStream, StrPtr(strRead), 16) & ", strRead: " & Chr(34) & strRead & Chr(34)
End Sub
 
Private Sub Command4_Click()
    Me.Cls
    Print IStream_Seek(hStream, 6 / 10000@, STREAM_SEEK_SET)
End Sub
 
Private Sub Command5_Click()
    Dim cbSize As Currency
    
    Me.Cls
    IStream_Size hStream, cbSize
    Print "Size: " & cbSize * 10000@ & " bytes"
End Sub
 
Private Sub Command6_Click()
    Dim FileNo As Integer
    Dim fLen As Long
    Dim lng As Long
    Dim s1 As Currency
    Dim buf() As Byte
    
    ' Инициализировать счётчик
    FileNo = FreeFile
    
    ' Открыть файл
    Open App.Path + "\test.txt" For Binary As FileNo
        fLen = LOF(FileNo)
        ReDim buf(fLen - 1)
        Get #FileNo, , buf
    Close FileNo
    
    IStream_Write hStream, VarPtr(buf(0)), UBound(buf) + 1
    IStream_Size hStream, s1
    
    MsgBox s1 * 10000@, vbInformation
End Sub
 
Private Sub Command7_Click()
    IUnknown_AtomicRelease hStream
End Sub
Здесь есть всё: создание, запись, чтение, позиционирование, узнавание размера потока и даже уничтожение. И не нужны никакие TLB или DLL... Всё на Long'ах как я люблю. Но для любителей объектов я всё же прикрепил к архиву модуль для работы со стримами от wqweto (известный болгар, который разработал класс для работы с ZIP в VB6 без всяких там DLL), я у него кстати код и почерпнул для функции DispCallByVtbl.
Миниатюры
Как работать с потоками IStream в Visual Basic 6  
Вложения
Тип файла: zip IStream.zip (11.2 Кб, 12 просмотров)
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.11.2024, 00:36  [ТС]
Единственное, что меня смущает, что здесь: https://learn.microsoft.com/en... ream_write написано что якобы Минимально поддерживаемый клиент Windows Vista [только настольные приложения]. Придётся проверить на всякий случай будет ли работать в XP. Сейчас перезагружу компьютер в XP и проверю.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
17.11.2024, 00:43
HackerVlad, жесть конечно. Это все делается намного проще, не зря VB6 ActiveX/COM ориентированный:
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
Private Function CloneStream( _
                 ByVal cStm As IStream) As IStream
    Dim cRet        As IStream
    Dim cSize       As Currency
    Dim lSize       As Long
    Dim bData()     As Byte
 
    cSize = cStm.Seek(0, STREAM_SEEK_END)
    cStm.Seek 0, STREAM_SEEK_SET
    
    If cSize <= 0 Or cSize > 10000 Then Exit Function
    
    GetMem4 cSize, lSize
 
    Set cRet = SHCreateMemStream(ByVal 0&, 0)
    If cRet Is Nothing Then Exit Function
    
    ReDim bData(lSize - 1)
    
    If cStm.Read(bData(0), lSize) <> lSize Then Exit Function
    
    If cRet.Write(bData(0), lSize) <> lSize Then Exit Function
    
    cRet.Seek 0, STREAM_SEEK_SET
    
    Set CloneStream = cRet
    
End Function
Добавлено через 2 минуты
Стрим можно уже на файле сделать одним вызовом SHCreateStreamOnFileEx.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.11.2024, 00:48  [ТС]
Спасибо конечно, но я же говорил что мне надо на лонгах. Сейчас проверил в XP ни одна из функций не работает кроме создания, потому что она вызывается по номер 12. А как узнать номера для других функций? В XP же наверное надо по номерам вызывать?

Добавлено через 1 минуту
As IStream ты откуда берёшь я не понял. Из TLB что ли?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
17.11.2024, 00:49
Цитата Сообщение от HackerVlad Посмотреть сообщение
Из TLB
Да.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.11.2024, 01:00  [ТС]
The trick, лучше помоги мне узнать номера функций для XP как это делает вообще я не знаю

Добавлено через 1 минуту
А подключать какую-то TLB я не хочу. Тем более её ещё надо где-то выискивать, да и зависимость будет. Не люблю зависимости.

Добавлено через 1 минуту
А может тогда вычислять версию Windows и для XP полностью на DispCallByVtbl запросы переходить, на все запросы и чтение и запись. Но хотелось бы всё-таки номера функций узнать лучше...
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
17.11.2024, 01:04
HackerVlad, tlb после компиляции не нужно. Это просто описание
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.11.2024, 03:25  [ТС]
The trick, я это понимаю, но ещё раз подчёркиваю, мне нужно без TLB. Пожалуйста, скажи как узнать номера функций? Для меня это важно.

Добавлено через 2 часа 3 минуты
Итак, я объявляю отдельную подтему Как узнать номер функции (Ordinal number) внутри DLL по её названию?

Добавлено через 4 минуты
Так как я не нашёл способа это сделать штатными средствами Windows или какой-нибудь утилиткой, то придётся писать программу опять для этого свою. Искал в поиске Яндекс, Гугл тоже мало что даёт. Нашёл только эту заметку: https://translated.turbopages.... mmatically
Отсюда и будем переписывать код тогда.

Добавлено через 12 минут
Итак, создаю новый проект. Проект назовём "Искалка номеров функций внутри DLL по названию функции" или по английски пусть будет так "Getting ordinal number from DLL".
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.11.2024, 03:30  [ТС]
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
Option Explicit
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function GetProcAddressNumber Lib "kernel32" Alias "GetProcAddress" (ByVal hModule As Long, ByVal lpProcName As Long) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
 
Private Sub Command1_Click()
    Dim handle As Long, address As Long ' Переменные с результатами функций
    Dim IsDLLFunction As Boolean
    Dim address2 As Long
    
    handle = LoadLibrary(Text1.Text) ' Загружаем библиотеку
    
    If handle <> 0 Then ' Успешная загрузка
        address = GetProcAddress(handle, Text2.Text) ' Получаем адрес функции по её названию
        
        If address <> 0 Then ' Успешное получение адреса
            Dim i As Long
            
            IsDLLFunction = False
            
            For i = 1 To Text3.Text ' Перебирать циклом от 1 до 1000 например
                address2 = GetProcAddressNumber(handle, i) ' Получаем адрес функции по номеру
                
                If address2 = address Then
                    IsDLLFunction = True
                    Exit For
                End If
            Next
            
            If IsDLLFunction = True Then
                MsgBox "Успешно найден номер функции. Номер: " & i, vbInformation
            End If
        End If
    End If
    
    FreeLibrary handle ' Высвобождаем библиотеку из памяти
End Sub
Миниатюры
Как работать с потоками IStream в Visual Basic 6   Как работать с потоками IStream в Visual Basic 6  
Вложения
Тип файла: zip Getting ordinal number from DLL.zip (5.9 Кб, 8 просмотров)
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.11.2024, 03:54  [ТС]
Итак, утилитка теперь у нас есть! Теперь будет интереснее!!! Теперь будем узнавать номера функций по её названиям. Итак начнём.

1. IStream_Read - 184
2. IStream_Write - 212
3. IStream_Size - 214
4. IUnknown_AtomicRelease - 169

Теперь всё что мне осталось сделать, это объявить эти функции по номерам и попробовать будет ли работать в XP. Это очень интересный эксперемент.

Добавлено через 3 минуты
На номерах теперь эти функции будут выглядеть так:

Visual Basic
1
2
3
4
5
Private Declare Function SHCreateMemStream Lib "shlwapi" Alias "#12" (ByRef pInit As Any, ByVal cbInit As Long) As Long
Private Declare Function IStream_Write Lib "shlwapi" Alias "#212" (ByVal ptrIStream As Long, ByVal pv As Long, ByVal cb As Long) As Long
Private Declare Function IStream_Read Lib "shlwapi" Alias "#184" (ByVal ptrIStream As Long, ByVal pv As Long, ByVal cb As Long) As Long
Private Declare Function IStream_Size Lib "shlwapi" Alias "#214" (ByVal ptrIStream As Long, ULARGE_INTEGER As Currency) As Long
Private Declare Sub IUnknown_AtomicRelease Lib "shlwapi" Alias "#169" (ppUnk As Any)
Добавлено через 30 секунд
А теперь самое интересное! Перезагружу компьютер в Windows XP и проверю будет ли там это работать!?

Добавлено через 13 минут
Ура!!! Проверил в XP всё теперь работает по номерам!!! Ура!!! Работает теперь и в XP и в семёрке. Надеюсь и в восьмёрке и в десятке тоже будет работать так же.
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,585
Записей в блоге: 1
17.11.2024, 03:55
Цитата Сообщение от HackerVlad Посмотреть сообщение
#If Win64 Then
Const PTR_SIZE As Long = 8
#Else
Const PTR_SIZE As Long = 4
#End If
Тогда переменные pUnk, pStream и т.п. должны быть типа LongPtr. Но вообще интересный код, полезный, как я понимаю, вызов методов объектов по указателю, я искал про это.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.11.2024, 04:05  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
LongPtr
Я не люблю LongPtr если честно я всегда их переписываю на Long
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,585
Записей в блоге: 1
17.11.2024, 04:05
Цитата Сообщение от HackerVlad Посмотреть сообщение
Теперь будем узнавать номера функций по её названиям.
Ординалы можно узнать с помощью утилитки DLLExp (Dll Export Viewer) еще
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.11.2024, 04:12  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
с помощью утилитки DLLExp (Dll Export Viewer) еще
Я не знал, спасибо, но уже теперь не надо раз я написал свою утилитку.

Добавлено через 1 минуту
Я вообще не знал как это делать, The Trick промолчал, а я понятия не имел как это сделать, начал искать, гуглить, тоже ничего не нашёл толком, пришлось самому писать.

Добавлено через 2 минуты
The Trick осуждает мой код для работы с IStream конечно, но я уверен он очень полезный. Я очень люблю API, по сравнению с TLB и всяким таким что тяжело прикрепить в обычный модуль свой.
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,585
Записей в блоге: 1
17.11.2024, 04:14
Цитата Сообщение от HackerVlad Посмотреть сообщение
IStream_Seek(hStream, 6 / 10000@, STREAM_SEEK_SET)
Цитата Сообщение от HackerVlad Посмотреть сообщение
Private Function IStream_Seek(ByVal ptrIStream As Long, ByVal Offset As Currency, ByVal Origin As Stream_Seek)
IStream_Seek = DispCallByVtbl(ptrIStream, 5, Offset, Origin, 0)
End Function
А как этот "offset" узнавать. Допустим я хочу выполнить метод какого-то объекта, как узнать смещение этого метода в V-Table?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.11.2024, 04:14
Помогаю со студенческими работами здесь

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru