Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/1: Рейтинг темы: голосов - 1, средняя оценка - 5.00
1387 / 843 / 92
Регистрация: 08.02.2017
Сообщений: 3,591
Записей в блоге: 1

Работа с zip архивами

29.10.2024, 02:49. Показов 18610. Ответов 282
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Из всего, что попадалось по теме сжатия/распаковки ZIP наиболее интересные были примеры с использованием библиотеки Zlib. Оригинальная zlib использует cdecl экспорт функций, но есть реализация zlibwapi.dll, которую можно использовать в VB. Вот хороший пример использования. Там можно увидеть как сжть/распаковать массив байтов, но вот беда, очень сложно найти пример под VB с более обширным использованием, способной на большее, данной либы, которая не есть простая, там есть функции с использованием множества параметров констант и длинных структур, которые чтобы узнать наверное надо долго копатся в сишных заголочниках. Но HackerVlad в личной беседе говорил, что у него есть исходники с использованием данной библиотеки, поэтому любезно прошу его поделиться данной информацией.

Добавлено через 1 минуту
кстати словосочетание zip-архивами в названии форум блочит почему-то )

Добавлено через 6 минут
На одном форуме есть хороший пример испльзования функций zlib для извлечения/распаковки отдельных файлов, там
Кликните здесь для просмотра всего текста
обсуждался какой-то экзотический ЯП Clarion, но очень наглядно
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
! Источнег: https://forum.clarionlife.net/viewtopic.php?t=2389
! Для добавления в архив PwlZip ваш пароль
ZipHandle = zipOpen(NEW_ZIPPACK, 0)
If EncryptFlag = 1
Res# = zipOpenNewFileInZip3(ZipHandle, PATH_CURZIP, Zinfo, 0, 0, 0, 0, Comment, Z_DEFLATED, CompressionFlag,0,-15,8,0,PwlZip,0)
Else
Res# = zipOpenNewFileInZip(ZipHandle, PATH_CURZIP, Zinfo, 0, 0, 0, 0, Comment, Z_DEFLATED, CompressionFlag)
.
 
!Для чтения из архива
ZipHandle = unzOpen(PATH_INFILE_PACK)
LocRes1=UnzGoToFirstFile(ZipHandle)
If unzGetCurrentFileInfo(ZipHandle,FinFo,PATH_NAMEUPD_TMP,Size(PATH_NAMEUPD_TMP),0,0,Comment,Size(Comment)).
If FinFo.Flag = 3 !признак шифрованного zip по крайней мере так я понял после мыкания с архивами
LocRes2 = unzOpenCurrentFilePassword(ZipHandle,PwlZip)
Else
LocRes2 = UnzOpenCurrentFile(ZipHandle)

Здесь подробное описание функций, структур и констант, однако я не нашел там unzGetCurrentFileInfo и т.п.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.10.2024, 02:49
Ответы с готовыми решениями:

Работа с ZIP-архивами - распаковка файлов
Привет, уважаемый ALL! Подскажите, как можно работать с zip архивами из VBA? Стоит задача: 1) прочитать из архива...

Автоматизировать заполнение "Графика выполненных работ по месяцам"
Используя готовую рабочую книгу Blank1.xls, автоматизировать заполнение "Графика выполненных работ по месяцам". Из диапазона дат в...

Задания из лаб.работ
Надоедаю наверное уже всем...

282
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.11.2024, 20:16
Студворк — интернет-сервис помощи студентам
Итак новый вариант создания библиотеки вторая версия

Форма:
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
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
 
Private Function CreatingDLL() As Boolean
    On Error Resume Next
    
    Dim dll() As Byte
    Dim FileNo As Integer
    
    Err.Clear
    dll = LoadResData(101, "LZNT1")
    DeCompress_NT dll
    
    If UBound(dll) = 171007 Then
        FileNo = FreeFile
        
        Open App.Path + "\zlibwapi.dll" For Binary As FileNo
            Put #FileNo, , dll
        Close FileNo
    Else
        CreatingDLL = False
        Exit Function
    End If
    
    If Err.Number = 0 Then CreatingDLL = True
End Function
 
Private Sub Command1_Click()
    Dim tick As Long
    Dim result As Boolean
    
    If IsDLLFunction("zlibwapi.dll", "zlibVersion") = False Then ' Не найдена библиотека либо функция в библиотеке
        tick = GetTickCount
        result = CreatingDLL ' Создать DLL
        Print GetTickCount - tick & " ml" ' Измерить время (у меня 0 млск)
        
        MsgBox "Создание библиотеки: " & result
    End If
End Sub
Получилось у меня что создания DLL файла вместе с распаковкой буфера даже происходит мгновенно за 0 млск.
Размер выходного EXE при этом всего 150 Кб! Я думаю, что это самый лучший и самый оптимальный вариант будет!
Вложения
Тип файла: zip zlibwapi.dll from resources v.2.zip (228.0 Кб, 5 просмотров)
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.11.2024, 20:38
Мои 150Кб против 278Кб EXE-файла по изначально предложенному варианту от tetstuser2.

Добавлено через 51 секунду
И это я ещё брал за основу библиотеку именно от testuser2 моя так меньше места занимает вообще на целых 100Кб.

Добавлено через 1 минуту
Но технологию base64 мне конечно стоит изучить всё равно. Можно будет вместо ресурсов иногда и строками base64 баловаться. Например воспроизовдить вавки или описывать регионы для нестандартных форм.

Добавлено через 12 минут
А я вот ещё думаю, может надо было base64 данные в ресурсы зашивать? Вместо LZNT1 компрессии DLL-файла? Или base64 данные, упакованные LZNT1 компрессией? Если эта компрессия помогала бы...

Добавлено через 1 минуту
Я ведь так и не изучил ещё технологию base64 и как там testuser2 упаковывал эти данные...

Добавлено через 2 минуты
testuser2, у тебя ведь получилось на выходе 126056 base64 данные каким-то чудом упакованные? А у меня 125047 на выходе получились данные упакованные, с помощью LZNT1, почти одинаково...

Добавлено через 55 секунд
testuser2, но каким чудом ты упаковал данные? что у тебя получилось 126056 на выходе? как, каким образом, и при помощи какого механизма ты этого достиг?

Добавлено через 25 секунд
И base64 строки бывают разные что ли, упакованные и не упакованные?
0
Эксперт по электронике
6801 / 3228 / 335
Регистрация: 28.10.2011
Сообщений: 12,600
Записей в блоге: 7
03.11.2024, 23:14
Зачем извлекать dll на диск? Грузите ее с памяти!
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.11.2024, 01:43
locm, и как ты собираешься это сделать? и как вызывать функции?
0
Эксперт по электронике
6801 / 3228 / 335
Регистрация: 28.10.2011
Сообщений: 12,600
Записей в блоге: 7
04.11.2024, 02:18
Цитата Сообщение от HackerVlad Посмотреть сообщение
как ты собираешься это сделать?
Загрузив программно dll в память. Не знаю точно как это сделать на VB6. Есть код на Си и PB.
Для примера загрузка из памяти zlibwapi.dll и вызов из нее функции zlibVersion().
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
XIncludeFile "MemDll.pb"
 
UseModule MemDll
 
hdll = LoadLibrary(?dll)
If hdll
  *Proc = GetProcAddress(hdll, "zlibVersion")
  If *Proc
    MessageRequester("","Версия zlibwapi "+PeekS(CallFunctionFast(*Proc), -1, #PB_Ascii))
  Else
    MessageRequester("","Не получен адрес функции")
  EndIf
  FreeLibrary(hdll)
  hdll=0
Else
  MessageRequester("","DLL не загружена")
EndIf
 
DataSection
  dll:
  IncludeBinary "zlibwapi.dll" ; Добавление dll в исполняемый файл.
EndDataSection
На VB6 наверное тоже также можно.
Вложения
Тип файла: 7z MemDll.7z (54.7 Кб, 14 просмотров)
2
1387 / 843 / 92
Регистрация: 08.02.2017
Сообщений: 3,591
Записей в блоге: 1
04.11.2024, 03:44  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
LoadLibrary(?dll)
Интересно, что за таинственный ?dll и как у вас производится зашивание dll в ресурсы программы, это автоматически производит модуль MemDll?
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.11.2024, 04:38
locm, если честно, я не знал вообще что так можно

Добавлено через 11 секунд
это очень интересно

Добавлено через 10 минут
Цитата Сообщение от locm Посмотреть сообщение
hdll = LoadLibrary(?dll)
Как происходит загрузка DLL я что-то не понял... Есть конечно такая функция LoadLibrary но она принимает к параметру только строку с именем файла https://learn.microsoft.com/en... adlibrarya

Поэтому я не понимаю

Добавлено через 2 минуты
Я не знаю как устроен ваш PureBasic но в ресурсах исполняемого файла MemDLL.exe нет никакого DLL вообще. Тогда как он загружает я пока не понимаю, откуда берётся эта DLL, но за пример спасибо, я стал верить, что это возможно и в VB6

Добавлено через 6 минут
Там без танцев с бубном вообще никак не обойтись конечно
Но я даже не знал что это вообще возможно

Примерно технология такая: берутся двичные данные, например из ресурсов или из строки base64 не важно откуда
потом загружается DLL в виртуальное адресное пространство процесса своего EXE через функцию VirtualAlloc
потом загружается таблица импорта функций потом куча всякого ещё что я вообще не понимаю

Добавлено через 4 минуты
Вообще не понимаю как загрузить DLL из воздуха и выполнить функцию я вообще в шоке

Добавлено через 6 минут
Помнится мне вроде The Trick работал уже с чем-то похожим, он ведь у нас супер хакер

Добавлено через 2 минуты
На vb6 ещё наверное не создан человечеством такой код всё-таки вот тема https://www.vbforums.com/showt... rom-memory

Добавлено через 1 минуту
Там у нашего гениального The Trick что-то похожее было вроде но не сама функция LoadLibrary из ресурсов

Добавлено через 2 минуты
ну короче нужен огромный модуль с самописной функцией LoadLibrary которая будет принимать в качестве параметра не имя файла DLL а буфер данных DLL файла и ещё функции вызова функций из DLL и очень код такой серьёзный будет, с ассемблерными вставками даже я думаю вряд ли это так просто осуществить

Добавлено через 3 минуты
testuser2, помнишь былд проект у трюкача, вот он: https://www.vbforums.com/showt... ut-runtime
там что-то такое есть примерно похожее, но очень сложное и почти не понятное нам
0
1387 / 843 / 92
Регистрация: 08.02.2017
Сообщений: 3,591
Записей в блоге: 1
04.11.2024, 04:39  [ТС]
Но в этом способе есть определенный минус - вызовы функций производятся по указателю, это как бы визуалльное усложнение. Вот еслиб можно было библу загрузить так, чтоб ее пришить к декларациям..
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.11.2024, 04:57
и правда только для PureBasic и для С есть в интернете код вот например как раз https://www.purebasic.fr/engli... hp?t=37979
для vb6 нет такого кода в интернете короче, на почти на 100% уверен что The Trick точно знает как это сделать или у него уже есть почти правильно написанный код

Добавлено через 1 минуту
testuser2, короче мой совет - спроси у The Trick может у него уже и модуль такой написан...

Добавлено через 14 минут
testuser2, ну короче не по сеньке шапка, не для таких отсталых программистов как мы эта тема, только такой гений как The Trick смог бы разобраться, поэтому предлагаю забыть
0
1387 / 843 / 92
Регистрация: 08.02.2017
Сообщений: 3,591
Записей в блоге: 1
04.11.2024, 05:28  [ТС]
Меня вполне устраивает извлечение библиотеки из ресурсов или откуда-либо (хотяб с нета) в папку с программой.
1
Эксперт по электронике
6801 / 3228 / 335
Регистрация: 28.10.2011
Сообщений: 12,600
Записей в блоге: 7
04.11.2024, 13:15
Цитата Сообщение от testuser2 Посмотреть сообщение
Интересно, что за таинственный ?dll
Указатель на метку в 20 строке кода.
Цитата Сообщение от testuser2 Посмотреть сообщение
как у вас производится зашивание dll в ресурсы программы
Не в ресурсы, а в секцию .data исполняемого файла. Но это не важно. Можно и в ресурс, из которого загрузить в память.

Цитата Сообщение от HackerVlad Посмотреть сообщение
Как происходит загрузка DLL я что-то не понял... Есть конечно такая функция LoadLibrary но она принимает к параметру только строку с именем файла
Процедуры LoadLibrary(), GetProcAddress() и FreeLibrary() находятся в файле MemDll.pb и к WinAPI отношения не имеют.

Цитата Сообщение от HackerVlad Посмотреть сообщение
в ресурсах исполняемого файла MemDLL.exe нет никакого DLL вообще
Потому что файл в секции данных. IncludeBinary добавляет файл в секцию .data. Компилятор просто помещает данные файла в константный байтовый массив.

Цитата Сообщение от testuser2 Посмотреть сообщение
Меня вполне устраивает извлечение библиотеки из ресурсов или откуда-либо (хотяб с нета) в папку с программой.
В чем смыл хранения в ресурсе если файл извлекается на диск?

Статические библиотеки возможно использовать в VB?
Если да, можно сишный код (например MemoryModule) скомпилировать в lib и подключить к проекту.
В архиве немного измененный код с экспортируемыми функциями с соглашением вызовов stdcall.
Кликните здесь для просмотра всего текста
PureBasic
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
CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
  Import "MemoryModule_x64.lib"
CompilerElse
  Import "MemoryModule.lib" 
CompilerEndIf
 
  MemoryLoadLibrary(*mem, size)
  MemoryGetProcAddress(hModule, Name.p-ascii)
  MemoryFreeLibrary(hModule)
EndImport
 
hdll = MemoryLoadLibrary(?dll, ?dll_size-?dll)
If hdll
  *Proc = MemoryGetProcAddress(hdll, "zlibVersion")
  If *Proc
    MessageRequester("","Версия zlibwapi "+PeekS(CallFunctionFast(*Proc), -1, #PB_Ascii))
  Else
    MessageRequester("","Не получен адрес функции")
  EndIf
  MemoryFreeLibrary(hdll)
  hdll=0
Else
  MessageRequester("","DLL не загружена")
EndIf
 
DataSection
  dll:
  IncludeBinary "zlibwapi.dll" ; Добавление dll в исполняемый файл.
  dll_size:
EndDataSection
Вложения
Тип файла: 7z MemDLL_MemoryModule.7z (51.2 Кб, 9 просмотров)
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.11.2024, 15:23
Цитата Сообщение от locm Посмотреть сообщение
В чем смыл хранения в ресурсе если файл извлекается на диск?
Смысл в том, чтобы переносить только одно своё EXE и если DLL файла нет то он создаётся автоматически.

Добавлено через 7 минут
Цитата Сообщение от locm Посмотреть сообщение
Статические библиотеки возможно использовать в VB?
Только TLB, я пытался подключить ваш файл LIB ничего не вышло короче нельзя.
0
Эксперт по электронике
6801 / 3228 / 335
Регистрация: 28.10.2011
Сообщений: 12,600
Записей в блоге: 7
04.11.2024, 15:27
Со статической библиотекой работает линкер. Он должен быть в VB.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.11.2024, 15:33
locm, надо сконвертировать в TLB

Добавлено через 4 минуты
Я без понятия как подключить файл .LIB к проекту на VB6 и возможно ли это вообще.
А после компиляции EXE-файла необходимость в библиотеке LIB отпадает?
0
Эксперт по электронике
6801 / 3228 / 335
Регистрация: 28.10.2011
Сообщений: 12,600
Записей в блоге: 7
04.11.2024, 15:50
Цитата Сообщение от HackerVlad Посмотреть сообщение
после компиляции EXE-файла необходимость в библиотеке LIB отпадает?
Для его работы она не требуется. Ее функции добавятся в exe файл.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.11.2024, 16:00
locm, вот например тут: Как подключить *.lib файлы нет ответа с 2007 года, никто не знает как

Добавлено через 4 минуты
Нашёл такое "в С++-проекте надо нарисовать IDL-файл, сгенерить из него typelib, которую затем подключить к проекту VB6"

Добавлено через 3 минуты
locm, вот например нашёл: https://forum.sources.ru/index... pic=195184 там тоже нет ответа с 2007 года

Добавлено через 45 секунд
простым способом подключить .lib не получится только какими-то хакерскими штучками сложными манипцляциями

Добавлено через 15 секунд
и то хрен знает как это сделать
0
1387 / 843 / 92
Регистрация: 08.02.2017
Сообщений: 3,591
Записей в блоге: 1
04.11.2024, 16:04  [ТС]
Сравнил компрессию RtlCompressBuffer (LZNT) и Сabinet (LZMS). Строку лучше сжимает LZNT, бинарь - LZMS
Кликните здесь для просмотра всего текста
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
Option Explicit
Enum Compess_Algorithm
'    COMPRESS_ALGORITHM_MSZIP = 2 'не поддерживается
    COMPRESS_ALGORITHM_XPRESS = 3
    COMPRESS_ALGORITHM_XPRESS_HUFF = 4
    COMPRESS_ALGORITHM_LZMS = 5
End Enum
'#If VBA7 Then
'    Private Declare PtrSafe Function Compress& Lib "cabinet" (ByVal hCompressor&, pUncompressedData As Any, ByVal sizeUncompressedData&, pCompressedDataBuffer As Any, ByVal sizeCompressedBuffer&, bytesOut&)
'    Private Declare PtrSafe Function Decompress& Lib "cabinet" (ByVal hCompressor&, pCompressedData As Any, ByVal sizeCompressedData&, pUncompressedDataBuffer As Any, ByVal sizeOfUncompressedBuffer&, bytesOut&)
'    Private Declare PtrSafe Function CreateCompressor& Lib "cabinet" (ByVal CompressAlgorithm As Compess_Algorithm, ByVal pAllocationRoutines&, hCompressor&)
'    Private Declare PtrSafe Function CreateDecompressor& Lib "cabinet" (ByVal CompressAlgorithm As Compess_Algorithm, ByVal pAllocationRoutines&, hDecompressor&)
'    Private Declare PtrSafe Function CloseCompressor& Lib "cabinet" (ByVal hCompressor&)
'    Private Declare PtrSafe Function CloseDecompressor& Lib "cabinet" (ByVal hDecompressor&)
'#Else
    Private Declare Function Compress& Lib "cabinet" (ByVal hCompressor&, pUncompressedData As Any, ByVal sizeUncompressedData&, pCompressedDataBuffer As Any, ByVal sizeCompressedBuffer&, bytesOut&)
    Private Declare Function Decompress& Lib "cabinet" (ByVal hCompressor&, pCompressedData As Any, ByVal sizeCompressedData&, pUncompressedDataBuffer As Any, ByVal sizeOfUncompressedBuffer&, bytesOut&)
    Private Declare Function CreateCompressor& Lib "cabinet" (ByVal CompressAlgorithm As Compess_Algorithm, ByVal pAllocationRoutines&, hCompressor&)
    Private Declare Function CreateDecompressor& Lib "cabinet" (ByVal CompressAlgorithm As Compess_Algorithm, ByVal pAllocationRoutines&, hDecompressor&)
    Private Declare Function CloseCompressor& Lib "cabinet" (ByVal hCompressor&)
    Private Declare Function CloseDecompressor& Lib "cabinet" (ByVal hDecompressor&)
'#End If
Enum NtCompressionStatus
    STATUS_SUCCESS& = 0
    STATUS_BAD_COMPRESSION_BUFFER& = &HC0000242   '-1073741246
    STATUS_UNSUPPORTED_COMPRESSION& = &HC000025F  '-1073741217
    STATUS_INVALID_PARAMETER& = &HC000000D        '-1073741811
    STATUS_BUFFER_ALL_ZEROS = &H117               '279
    STATUS_NOT_SUPPORTED = &HC00000BB             '-1073741637
    STATUS_BUFFER_TOO_SMALL = &HC0000023          '-1073741789
End Enum
Private Declare Function RtlGetCompressionWorkSpaceSize Lib "ntdll" (ByVal CompressionFormatAndEngine As Integer, ByRef CompressBufferWorkSpaceSize As Long, ByRef CompressFragmentWorkSpaceSize As Long) As NtCompressionStatus
Private Declare Function RtlCompressBuffer Lib "ntdll" (ByVal CompressionFormatAndEngine As Integer, ByRef UncompressedBuffer As Any, ByVal UncompressedBufferSize As Long, ByRef CompressedBuffer As Any, ByVal CompressedBufferSize As Long, ByVal UncompressedChunkSize As Long, ByRef FinalCompressedSize As Long, ByRef WorkSpace As Any) As NtCompressionStatus
Private Declare Function RtlDecompressBuffer Lib "ntdll" (ByVal CompressionFormat As Integer, ByRef ptrDestBuffer As Any, ByVal DestBufferSize As Long, ByRef ptrSrceBuffer As Any, ByVal SceBufferSize As Long, ByRef pDestinationSize As Long) As NtCompressionStatus
 
Private Const COMPRESSION_FORMAT_LZNT1& = 2
Private Const nullPtr As LongPtr = 0
 
Private Function Compress_NT(bInp() As Byte, bOut() As Byte) As NtCompressionStatus
    On Error GoTo Quit
    Dim WorkSpace() As Byte
    Dim szWorkSpace As Long
    Dim bInpSize As Long
    Dim bOutSize As Long
    
    Compress_NT = RtlGetCompressionWorkSpaceSize(COMPRESSION_FORMAT_LZNT1, szWorkSpace, 0)
    If Compress_NT = STATUS_SUCCESS Then
        bInpSize = UBound(bInp) + 1
        ReDim WorkSpace(szWorkSpace - 1)
        ReDim bOut(bInpSize - 1)
        
        Compress_NT = RtlCompressBuffer(COMPRESSION_FORMAT_LZNT1, bInp(0), bInpSize, bOut(0), bInpSize, 4096, bOutSize, WorkSpace(0))
        If Compress_NT = STATUS_SUCCESS Then ReDim Preserve bOut(bOutSize - 1)
    End If
Quit:
End Function
Public Function DeCompress_NT(bInp() As Byte, bOut() As Byte, Optional ByVal bOutSize As Long) As NtCompressionStatus
    On Error GoTo Quit
    Dim bInpSize As Long
    Dim returnedSize As Long
    
    bInpSize = UBound(bInp) + 1
    If bOutSize = 0 Then bOutSize = bInpSize * 2
    ReDim bOut(bOutSize - 1)
    
    Do
        DeCompress_NT = RtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1, bOut(0), bOutSize, bInp(0), bInpSize, returnedSize)
        Select Case DeCompress_NT
        Case STATUS_SUCCESS
            ReDim Preserve bOut(returnedSize - 1)
            Exit Do
        Case STATUS_BAD_COMPRESSION_BUFFER
            bOutSize = bOutSize + bInpSize
            ReDim Preserve bOut(bOutSize - 1)
        Case Else 'STATUS_UNSUPPORTED_COMPRESSION
            Exit Do
        End Select
    Loop
Quit:
End Function
Function CabCompress(bInp() As Byte, Optional ByVal algorithm As Compess_Algorithm = COMPRESS_ALGORITHM_LZMS) As Byte()
    Dim h&, max&, bytesOut&, bOut() As Byte
    
    If CreateCompressor(algorithm, 0, h) Then
        max = UBound(bInp) + 1: ReDim bOut(max - 1)
        If Compress(h, bInp(0), max, bOut(0), max, bytesOut) Then
            If bytesOut Then ReDim Preserve bOut(bytesOut - 1)
        End If
        CloseCompressor h
    End If
    
    CabCompress = bOut
End Function
Function CabDecompress(bInp() As Byte, Optional ByVal algorithm As Compess_Algorithm = COMPRESS_ALGORITHM_LZMS) As Byte()
    Dim h&, bytesOut&, bOut() As Byte
    
    If CreateDecompressor(algorithm, 0, h) Then
        Decompress h, bInp(0), UBound(bInp) + 1, ByVal StrPtr(vbNullString), 0, bytesOut
        If bytesOut Then
            ReDim bOut(bytesOut - 1)
            Decompress h, bInp(0), UBound(bInp) + 1, bOut(0), bytesOut, ByVal StrPtr(vbNullString)
        End If
        CloseDecompressor h
    End If
    
    CabDecompress = bOut
End Function
Private Function GetFile(sFlPt As String) As Byte()
    Dim fNum&, fLen&, bBuf() As Byte
    fNum = FreeFile
    Open sFlPt For Binary Access Read As #fNum
    fLen = LOF(fNum)
    If fLen Then
        ReDim bBuf(fLen - 1)
        Get fNum, , bBuf
    End If
    Close fNum
    GetFile = bBuf
End Function
 
Sub CompressionTest()
    Dim bFile() As Byte, bCompNt() As Byte, bCompCab() As Byte
    
'    bFile = "I do not like them in a box. I do not like them with a fox. I will not eat them in a house. I do not like them with a mouse. I do not like them here or there. I do not like them ANYWHERE!"
    bFile = GetFile("D:\tmp\Zip\Diletant\Simpler Zipper Demo_\Subfolder\zlibwapi.dll")
    
    Compress_NT bFile, bCompNt
    bCompCab = CabCompress(bFile)
    Debug.Print "Размер данных:  "; UBound(bFile) + 1
    Debug.Print "NT-кмопрессия:  "; UBound(bCompNt) + 1
    Debug.Print "Cab-компрессия: "; UBound(bCompCab) + 1
    Debug.Print
End Sub
Code
1
2
3
4
5
6
7
8
'сжатие строки
Размер данных:   374 
NT-кмопрессия:   139 
Cab-компрессия:  146 
'сжатие бинарного файла (библиотеки)
Размер данных:   171008 
NT-кмопрессия:   125047 
Cab-компрессия:  83504
Однако это не все возможности сжатия внутренними средствами ОС. Здесь пишут
Из встроенного в винду есть ещё CreateDeltaB/ApplyDeltaB (MSDELTA.DLL). Сжимает на уровне LZMA особенно хорошо жмёт EXE-шники.
Здесь реализация на ASM. На VB или на C с налету не нашел, но должно быть не очень сложно. Еще есть такое, чисто для распаковки.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.11.2024, 16:51
Цитата Сообщение от testuser2 Посмотреть сообщение
Строку лучше сжимает LZNT
Да у тебя просто строка с повторяющимися одинаковыми словами я посмотрел

Добавлено через 43 секунды
139 и 146 извини меня не сильно отличается

Добавлено через 58 секунд
А вот упаковка и распаковка буфера с помощью компрессии cabinet это интересно. Можно написать такой модуль будет.
0
1387 / 843 / 92
Регистрация: 08.02.2017
Сообщений: 3,591
Записей в блоге: 1
04.11.2024, 16:52  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
Можно написать такой модуль будет.
А выше что?
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.11.2024, 17:25
Цитата Сообщение от testuser2 Посмотреть сообщение
А выше что
сборная солняка какая-то содрал мой модуль плюс присвинячил ещё и свои функции
а я думаю создать только для cabinet

Добавлено через 19 минут
testuser2, кстати хочешь прикол в cabinet.dll есть возможность распаковки/упаковки ZIP кажется. Там я нашёл COMPRESS_ALGORITHM_MSZIP.

Добавлено через 2 минуты
RFC 1951 это ZIP?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.11.2024, 17:25
Помогаю со студенческими работами здесь

access и zip архив
Привет всем! Подскажите... если есть возможность сохранение файла в zip архив Dim FileHeder As String Dim filePath As String ...

Как распаковать ZIP-файл в 7z?
'При помощи VBA WinRAR распаковывает архив в папку … q = Адрес_сохранения_файла 'путь к каталогу, то есть к папке, в конце пути для...

ребята!завтра надо сдать работу,а без этих работ никак((
алгоритмы линейной структуры 1) СОСТАВИТЬ ПРОГРАММУ ВЫЧИСЛЕНИЯ СРЕДНЕГО ЗНАЧЕНИЯ ТРЕХ ВЕЛИЧИН 2) ПОДСЧИТАТЬ И ВЫВЕСТИ НА ЭКРАН СУММУ И...

Замена файла в zip архиве при совпадении имени
Есть несколько excel файлов. например, 1.xls, 2.xls, 3.xls Есть куча zip архивов. например, A (1.xls), B (1.xls,5.doc,3.doc), C (3.xls),...

Как сделать архив zip?
Как сделать архив zip? Какие нужны библиотеки и где их взять? заранее спасибо.


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

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru