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

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

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

Студворк — интернет-сервис помощи студентам
Из всего, что попадалось по теме сжатия/распаковки 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, автоматизировать заполнение "Графика выполненных работ по месяцам". Из диапазона дат в...

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

283
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
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
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
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
Эксперт по электронике
7139 / 3319 / 341
Регистрация: 28.10.2011
Сообщений: 13,044
Записей в блоге: 7
03.11.2024, 23:14
Зачем извлекать dll на диск? Грузите ее с памяти!
0
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
04.11.2024, 01:43
locm, и как ты собираешься это сделать? и как вызывать функции?
0
Эксперт по электронике
7139 / 3319 / 341
Регистрация: 28.10.2011
Сообщений: 13,044
Записей в блоге: 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
1406 / 864 / 93
Регистрация: 08.02.2017
Сообщений: 3,680
Записей в блоге: 2
04.11.2024, 03:44  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
LoadLibrary(?dll)
Интересно, что за таинственный ?dll и как у вас производится зашивание dll в ресурсы программы, это автоматически производит модуль MemDll?
0
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
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
1406 / 864 / 93
Регистрация: 08.02.2017
Сообщений: 3,680
Записей в блоге: 2
04.11.2024, 04:39  [ТС]
Но в этом способе есть определенный минус - вызовы функций производятся по указателю, это как бы визуалльное усложнение. Вот еслиб можно было библу загрузить так, чтоб ее пришить к декларациям..
1
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
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
1406 / 864 / 93
Регистрация: 08.02.2017
Сообщений: 3,680
Записей в блоге: 2
04.11.2024, 05:28  [ТС]
Меня вполне устраивает извлечение библиотеки из ресурсов или откуда-либо (хотяб с нета) в папку с программой.
1
Эксперт по электронике
7139 / 3319 / 341
Регистрация: 28.10.2011
Сообщений: 13,044
Записей в блоге: 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
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
04.11.2024, 15:23
Цитата Сообщение от locm Посмотреть сообщение
В чем смыл хранения в ресурсе если файл извлекается на диск?
Смысл в том, чтобы переносить только одно своё EXE и если DLL файла нет то он создаётся автоматически.

Добавлено через 7 минут
Цитата Сообщение от locm Посмотреть сообщение
Статические библиотеки возможно использовать в VB?
Только TLB, я пытался подключить ваш файл LIB ничего не вышло короче нельзя.
0
Эксперт по электронике
7139 / 3319 / 341
Регистрация: 28.10.2011
Сообщений: 13,044
Записей в блоге: 7
04.11.2024, 15:27
Со статической библиотекой работает линкер. Он должен быть в VB.
0
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
04.11.2024, 15:33
locm, надо сконвертировать в TLB

Добавлено через 4 минуты
Я без понятия как подключить файл .LIB к проекту на VB6 и возможно ли это вообще.
А после компиляции EXE-файла необходимость в библиотеке LIB отпадает?
0
Эксперт по электронике
7139 / 3319 / 341
Регистрация: 28.10.2011
Сообщений: 13,044
Записей в блоге: 7
04.11.2024, 15:50
Цитата Сообщение от HackerVlad Посмотреть сообщение
после компиляции EXE-файла необходимость в библиотеке LIB отпадает?
Для его работы она не требуется. Ее функции добавятся в exe файл.
0
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
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
1406 / 864 / 93
Регистрация: 08.02.2017
Сообщений: 3,680
Записей в блоге: 2
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
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
04.11.2024, 16:51
Цитата Сообщение от testuser2 Посмотреть сообщение
Строку лучше сжимает LZNT
Да у тебя просто строка с повторяющимися одинаковыми словами я посмотрел

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

Добавлено через 58 секунд
А вот упаковка и распаковка буфера с помощью компрессии cabinet это интересно. Можно написать такой модуль будет.
0
1406 / 864 / 93
Регистрация: 08.02.2017
Сообщений: 3,680
Записей в блоге: 2
04.11.2024, 16:52  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
Можно написать такой модуль будет.
А выше что?
0
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
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
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru