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

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

16.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
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
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
17.11.2024, 20:01
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от testuser2 Посмотреть сообщение
Я еще вот чего не понимаю, пишут, что типа через номера вызов идет чуть быстрее. Просто также наверное не должно быть, там что при вызове каждый раз участвует текстовое имя функции, компилятор же так не должен работать?
Быстрее связывание, а не вызов. Вызов точно также работает без разницы по скорости.

Добавлено через 12 минут
Цитата Сообщение от HackerVlad Посмотреть сообщение
Вот вы все используете функцию SHCreateMemStream а почему в ваших TLB нет такого метода создания стрима? Почему вы используете API функцию? Почему в майкрософте не сделали такого метогда в интерфейсе IStream для создания потока? Почему только функция из API для этого есть? Если уже и делать было бы, по логике, то либо всё на API либо всё на ваших методах интерфейса без АПИ.
Я даже не знаю что тут ответить, ты вообще сам понимаешь что ты написал? Ты сначала изучи что такое TLB, COM интерфейс и WINAPI функции, а потом опять прочитай свое сообщение и поймешь что ты написал чепуху.

Добавлено через 4 минуты
Самый правильный метод вызова методов IStream - вызывать через библиотеку типов. В VB6 - это нативный вариант из коробки, как раз для чего VB6 и создавался - для прозрачной работы с COM.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
17.11.2024, 20:55  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Самый правильный метод вызова методов IStream
А ты попробуй так создать поток стрима, без API.

Добавлено через 11 минут
The trick, вот ты называешь функции для работы со стримами "костылём", хотя сам же и используешь апи-функцию для создания стрима (так как такого метода просто нет). Так что апи-функции никакой это не костыль, а просто другой способ и всё.

Добавлено через 16 минут
У вас же нету метода IStream::Create поэтому вы и создаёте только через функцию API

Добавлено через 3 минуты
Цитата Сообщение от testuser2 Посмотреть сообщение
У них есть имена, dll export viewer же их как-то считывает
Я думал что в библиотеках DLL есть безымянные функции, которые идут только по номерам. И никто меня даже не поправил, а фафалон вот мне ответил сейчас в такой же параллельной теме на иностранном форуме (я там такую же тему создавал), что "Ни одна функция не идет по номерам в исходном коде. Это всего лишь результат того, что не определен символ экспорта для скомпилированной DLL. Поэтому для функций в XP SP2/Server 2003 и более ранних версиях, если вы знаете порядковый номер, вы можете найти фактическое имя."

Добавлено через 49 секунд
Значит безымянных функций в DLL нету???? я ошибался?
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
17.11.2024, 21:01
Цитата Сообщение от HackerVlad Посмотреть сообщение
А ты попробуй так создать поток стрима, без API.
Ты вообще понимаешь что ты пишешь? Как это коррелирует с процитированным сообщением?

Цитата Сообщение от HackerVlad Посмотреть сообщение
а просто другой способ и всё.
А не другой способ - это какой по-твоему?

Цитата Сообщение от HackerVlad Посмотреть сообщение
У вас же нету метода IStream::Create поэтому вы и создаёте только через функцию API
Метода какого интерфейса? Такие методы к слову существуют. К примеру IStorage::CreateStream. Только я не пойму причем тут это?
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
17.11.2024, 21:10  [ТС]
Это метод IStorage но не IStream но спасибо за информацию, думаю дискуссию можно прекращать уже по этому поводу. Всё равно каждый остаётся при своём мнении.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
17.11.2024, 21:15
Цитата Сообщение от HackerVlad Посмотреть сообщение
Я думал что в библиотеках DLL есть безымянные функции, которые идут только по номерам. И никто меня даже не поправил, а фафалон вот мне ответил сейчас в такой же параллельной теме на иностранном форуме (я там такую же тему создавал), что "Ни одна функция не идет по номерам в исходном коде. Это всего лишь результат того, что не определен символ экспорта для скомпилированной DLL. Поэтому для функций в XP SP2/Server 2003 и более ранних версиях, если вы знаете порядковый номер, вы можете найти фактическое имя."
Это не так работает. Есть системные функции которые винда там внутри себя где-то использует. У них есть имена и разработчики вызывают их по именам, но вот линкер потом может эти имена убрать, а использовать ординалы для более быстрого связывания, имена могут просто быть выброшены. Потом разработчики решают предоставить доступ для прикладных программ к данным функциям и функции получают имена которые ресолвятся через lib файлы. Причем для каждой системы есть свои Lib файлы. Если ты компилишь таргет для ХП то и выбираешь из папки соответствующей LIB файлы, они будут ресолвится по ординалу, а если для 7 то другая либка будет их ресолвить по своему. На старых системах к примеру нет некоторых функций и в них зашивается непосредственно сам код, а для новых используется из DLL.
Миниатюры
Как работать с потоками IStream в Visual Basic 6  
1
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
17.11.2024, 21:17
Цитата Сообщение от HackerVlad Посмотреть сообщение
Это метод IStorage но не IStream но спасибо за информацию, думаю дискуссию можно прекращать уже по этому поводу. Всё равно каждый остаётся при своём мнении.
Ну по твоей логике получается что должен быть метод IStream для создания IStream, тогда вопрос - а как создать IStream чтобы из него создать IStream? Ты понимаешь что ты рассуждаешь как-то не так? А точнее ты вообще неверно понимаешь процессы за интерфейсами.
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
17.11.2024, 21:24  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Это не так работает. Есть системные функции которые винда там внутри себя где-то использует.
Ну я примерно так и думал. Значит безымянные функции всё-таки есть?

Добавлено через 57 секунд
Цитата Сообщение от The trick Посмотреть сообщение
что должен быть метод IStream для создания IStream
ахаахахах да я и правда не понимал

Добавлено через 1 минуту
The trick, но всё равно я не понимаю почему ты используешь апи-функцию в своём коде для создания стрима, если ты так очень сильно любишь методы, интерфейсы и TLB
и ещё вопрос: почему в XP нету названий этих функций

Добавлено через 2 минуты
Вот почему ты используешь функцию SHCreateMemStream вместо того чтобы использовать свои интерфейсы и методы. SHCreateMemStream это же функция такая же как и другие мои функции значит эта функция тоже костыль. Всё. Такая логика.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
17.11.2024, 21:33
Цитата Сообщение от HackerVlad Посмотреть сообщение
The trick, но всё равно я не понимаю почему ты используешь апи-функцию в своём коде для создания стрима, если ты так очень сильно любишь методы, интерфейсы и TLB
Потому что API функции в данном случае никакого отношения не имеют к интерфейсам и TLB.

TLB - это библиотека типов, в ней могут содержаться и интерфейсы и типы и константы и API функции - абсолютно все тоже что и в VB6 и даже больше (к примеру алиасы). Считай это аналогом h файлов в С/С++. Это просто описание, это не код и ни DLL. Также как к примеру ты объявляешь в коде Type/Declare Function и т.д.

COM интерфейс - это контракт взаимодействия с COM объектами. В самом простом случае это таблица функций с определенным соглашением.

Чтобы вызывать методы COM интерфейса, нужно просто вызывать методы COM интерфейса, также как ты в любом классе вызываешь Class1.Method.

Чтобы создать COM объект можно либо создать его по ID, также как ты в VB6 создаешь его через New (CreateObject), а можно вызвать функцию/метод которая вернет нужный объект с нужной интерфейсной ссылкой (аналогично в стандартном модуле функция возвращающая объект).

Чтобы вызывать методы - не нужны API функции - они просто лишнее звено.
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
17.11.2024, 23:46  [ТС]
The trick, мне тут понадобилось. как узнать текущее положение указателя Seek? На каком оно сейчас месте находится, на каком смещении?

Добавлено через 4 минуты
А точнее мне нужно, как узнать новую позицию указателя после выполнения функции Seek?
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,024
Записей в блоге: 7
17.11.2024, 23:58
Цитата Сообщение от HackerVlad Посмотреть сообщение
как узнать новую позицию указателя после выполнения функции Seek?
Читать справку? Зачем?
https://learn.microsoft.com/en... tream-seek
[out] plibNewPosition
A pointer to the location where this method writes the value of the new seek pointer from the beginning of the stream.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
18.11.2024, 00:18  [ТС]
Я думаю что так будет возвращать новую позицию:

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
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 Function DispCallByVtbl(ByVal 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) As Long
    Dim NewPosition As Currency
    
    IStream_Seek = DispCallByVtbl(ptrIStream, 5, Offset, Origin, VarPtr(NewPosition))
    
    If NewPosition > 0 Then
        IStream_Seek = NewPosition * 10000@
    End If
End Function
Добавлено через 6 минут
Я тут для себя увидел что API мне не предоставляет возвращаемого значения фактического количество байтов, считанных из потокового объекта, поэтому скорее всего придётся юзать ISequentialStream::Read

Добавлено через 31 секунду
Ну то есть через DispCallByVtbl конечно же, я же не дурак TLB с собой таскать.
0
Вернулся
 Аватар для HackerVlad
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 минут
Вот как будет правильно:

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
Private Function DispCallByVtbl(ByVal 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_Read(ByVal ptrIStream As Long, ByVal pv As Long, ByVal BytesRead As Long) As Long
    Dim BytesReaded As Long
    
    DispCallByVtbl ptrIStream, 3, pv, BytesRead, VarPtr(BytesReaded)
    IStream_Read = BytesReaded
End Function
 
Private Function IStream_Write(ByVal ptrIStream As Long, ByVal pv As Long, ByVal BytesWrite As Long) As Long
    Dim BytesWritten As Long
    
    DispCallByVtbl ptrIStream, 4, pv, BytesWrite, VarPtr(BytesWritten)
    IStream_Write = BytesWritten
End Function
 
Private Function IStream_Seek(ByVal ptrIStream As Long, ByVal Offset As Currency, ByVal Origin As Stream_Seek) As Long
    Dim NewPosition As Currency
    
    DispCallByVtbl ptrIStream, 5, Offset, Origin, VarPtr(NewPosition)
    IStream_Seek = NewPosition * 10000@
End Function
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
19.11.2024, 12:29
Цитата Сообщение от HackerVlad Посмотреть сообщение
Я тут для себя увидел что API мне не предоставляет возвращаемого значения фактического количество байтов
Я не до конца въезжаю во всю эту тему, но может быть из-за этого
Цитата Сообщение от HackerVlad Посмотреть сообщение
DispCallFunc(pUnk, lIndex * PTR_SIZE, CC_STDCALL, vbLong
Указан тип возврщаемого значения vbLong, но может быть нужно в Currency (vbCurrency)?
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
19.11.2024, 12:46  [ТС]
Нет, там всё правильно у меня написано, последний код, что я скинул работает как надо. Всё именно так как надо. И возвращает необходимое мне значение. Это правильный код уже окончательный. Read, Write As Long надо, а вот Seek уже As Currency надо там почему-то, как мы видим, за то всё работает теперь.

Я же говорил про API там вообще к shlwapi.dll там вообще не возвращает то что мне надо, дурацкие функции, трюк был прав.
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,024
Записей в блоге: 7
19.11.2024, 13:35
Цитата Сообщение от HackerVlad Посмотреть сообщение
вот Seek уже As Currency надо там почему-то
Читать документацию нужно!
[out] ULARGE_INTEGER *plibNewPosition
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
12.01.2025, 04:57  [ТС]
У меня вопрос. А создавать поток можно через CreateObject("ADODB.Stream") ???

Добавлено через 36 минут
Может, DispCallByVtbl вообще не нужен? Если можно работать через объект?
0
Вернулся
 Аватар для HackerVlad
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
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
12.01.2025, 17:07
Цитата Сообщение от HackerVlad Посмотреть сообщение
Но скорее всего, это не так просто получить адрес на объект IStream из объекта «ADODB.Stream».
Я посмотрел, он просто использует методы объекта ADODB.Stream (в том сообщении). Но я немного знаю, что библиотека ADO очен юзабельная, ее используют в основном для работы с базами данных.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
12.01.2025, 18:00  [ТС]
The Trick это делал через vbaCastObj но vbaCastObj вызывает фатальный крах в Твин Бейсике поэтому этот способ мне не подходит.

Добавлено через 2 минуты
Сейчас просто когда мы пишем новые коды, мы так же думаем и о том, чтобы код был совместим с Твин Бейсиком. А раньше пофиг было, когда было одно VB6.
0
Вернулся
 Аватар для HackerVlad
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.01.2025, 00:41

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

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


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

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