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

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

29.10.2024, 02:49. Показов 22188. Ответов 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
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,673
Записей в блоге: 2
04.11.2024, 17:32  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от HackerVlad Посмотреть сообщение
Там я нашёл COMPRESS_ALGORITHM_MSZIP.
Я тоже сначала обрадовался.. но есть нюанс

Добавлено через 7 минут
Составил декларацию CreateDeltaB, надеюсь без ошибок
Кликните здесь для просмотра всего текста
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
Option Explicit
Private Type DELTA_FILE_TYPE
    Llng As Long
    Hlng As Long
End Type
Private Type DELTA_INPUT
    lpcStart As Long
    uSize As Long
    Editable As Long
End Type
Private Type DELTA_OUTPUT
    lpStart As Long
    uSize As Long
End Type
Private Declare Function CreateDeltaB Lib "msdelta" (ByVal FileTypeSet As DELTA_FILE_TYPE, _
                                                     ByVal SetFlags As DELTA_FILE_TYPE, _
                                                     ByVal ResetFlags As DELTA_FILE_TYPE, _
                                                     ByVal Source As DELTA_INPUT, _
                                                     ByVal Target As DELTA_INPUT, _
                                                     ByVal SourceOptions As DELTA_INPUT, _
                                                     ByVal TargetOptions As DELTA_INPUT, _
                                                     ByVal GlobalOptions As DELTA_INPUT, _
                                                     ByVal lpTargetFileTime As Long, _
                                                     ByVal HashAlgId As Long, _
                                                     ByVal lpDelta As Long)
'BOOL  WINAPI  CreateDeltaB(
'       DELTA_FILE_TYPE  FileTypeSet,
'       DELTA_FLAG_TYPE  SetFlags,
'       DELTA_FLAG_TYPE  ResetFlags,
'       DELTA_INPUT      Source,
'       DELTA_INPUT      Target,
'       DELTA_INPUT      SourceOptions,
'       DELTA_INPUT      TargetOptions,
'       DELTA_INPUT      GlobalOptions,
'const  FILETIME        *lpTargetFileTime,
'       ALG_ID           HashAlgId,
'       LPDELTA_OUTPUT lpDelta
');
'typedef struct _DELTA_INPUT
'{
'    union{
'        LPCVOID  lpcStart;
'        LPVOID   lpStart;
'    };
'    SIZE_T  uSize;
'    BOOL    Editable;
'} DELTA_INPUT;
'typedef struct _DELTA_OUTPUT
'{
'    LPVOID  lpStart;
'    SIZE_T  uSize;
'} DELTA_OUTPUT;
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
04.11.2024, 18:46
testuser2, а зачем ты занимаешься дельтами?

Добавлено через 22 минуты
Цитата Сообщение от testuser2 Посмотреть сообщение
но есть нюанс
а нюанс это то что это работает только начиная от Windows 8 наверное

Добавлено через 4 минуты
https://learn.microsoft.com/ru... compressor

Добавлено через 1 минуту
Ну значит нужно сначала определять версию ОС если Windows 8 и выше то использовать cabinet.dll иначе использовать zlibwapi.dll. Для Windows 10 например тогда можно вообще не создавать файл zlibwapi.dll даже в корне с программой.

Добавлено через 1 минуту
Ну и бонус от меня - класс для работы с Cabinet.dll начиная от Windows 8

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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
Option Explicit
'=======
'Cabinet version 1.1
'=======
'
'Requires Windows 8 or later.
'
'Not entirely complete:
'
'   o COMPRESS_INFORMATION_CLASS_LEVEL is not working and so we can't support high
'     XPRESS and XPRESS_HUFF compression.
'
'   o Have not attempted using COMPRESS_RAW or COMPRESS_INFORMATION_CLASS_BLOCK_SIZE
'     with COMPRESS_ALGORITHM_LZMS. [LOW PRIORITY]
'
'   o Have not attempted to implement "Allocation Routine" callbacks.  We'll let
'     Cabinet.dll do its own default allocations. [LOW PRIORITY]
'
 
Private Const WIN32_FALSE As Long = 0
Private Const WIN32_TRUE As Long = Not WIN32_FALSE
Private Const WIN32_NULL As Long = 0
 
Private Const INVALID_HANDLE_VALUE = -1
 
Private Const ERROR_BAD_LENGTH As Long = 24
Private Const ERROR_FUNCTION_FAILED As Long = 1627
Private Const ERROR_INSUFFICIENT_BUFFER As Long = 122
Private Const ERROR_INVALID_HANDLE As Long = 6
Private Const ERROR_INVALID_PARAMETER As Long = 87
Private Const ERROR_NOT_SUPPORTED As Long = 50
Private Const ERROR_UNSUPPORTED_TYPE As Long = 1630
 
Public Enum COMPRESS_ALGORITHMS
    COMPRESS_ALGORITHM_INVALID = 0
    
    COMPRESS_ALGORITHM_NULL = 1           'No compression.
    
    COMPRESS_ALGORITHM_MSZIP = 2          '• Uses more resources than
                                          '  COMPRESS_ALGORITHM_XPRESS_HUFF.
                                          '• Generates a compressed block similar to RFC 1951.
                                          '• Medium to high compression ratio.
                                          '• Medium compression speed and high decompression speed.
                                          '• Medium memory requirement.
    
    COMPRESS_ALGORITHM_XPRESS = 3         '• Very fast with low resource requirements.
                                          '• Medium compression ratio.
                                          '• High compression and decompression speeds.
                                          '• Low memory requirement.
                                          '• Supports the COMPRESS_INFORMATION_CLASS_LEVEL
                                          '  option available in the COMPRESS_INFORMATION_CLASS
                                          '  enumeration. The default value is (DWORD)0. For
                                          '  some data, the value (DWORD)1 can improve the
                                          '  compression ratio with a slightly slower compression
                                          '  speed.
 
    COMPRESS_ALGORITHM_XPRESS_HUFF = 4    '• Compression ratio is higher than
                                          '  COMPRESS_ALGORITHM_XPRESS.
                                          '• Medium compression ratio.
                                          '• Medium to high compression and decompression speeds.
                                          '• Low memory requirement.
                                          '• Supports the COMPRESS_INFORMATION_CLASS_LEVEL option
                                          '  in the COMPRESS_INFORMATION_CLASS enumeration. The
                                          '  default value is (DWORD)0. For some data, the value
                                          '  (DWORD)1 can improve the compression ratio with a
                                          '  slightly slower compression speed.
 
    COMPRESS_ALGORITHM_LZMS = 5           '• Good algorithm if the size of the data to be
                                          '  compressed is over 2MB.
                                          '• High compression ratio.
                                          '• Low compression speed and high decompression speed.
                                          '• Medium to high memory requirement.
                                          '• Supports the COMPRESS_INFORMATION_CLASS_BLOCK_SIZE
                                          '  option in the COMPRESS_INFORMATION_CLASS enumeration.
                                          '  A minimum size of 1 MB is suggested to get a better
                                          '  compression ratio.
    
    COMPRESS_RAW = &H20000000             'Do not include the COMPRESS_RAW flag in the Algorithm
                                          'parameter when you call CreateCompressor and
                                          'CreateDecompressor to use buffer mode.
End Enum
#If False Then
Dim COMPRESS_ALGORITHM_MSZIP, COMPRESS_ALGORITHM_XPRESS, COMPRESS_ALGORITHM_XPRESS_HUFF
Dim COMPRESS_ALGORITHM_LZMS, COMPRESS_RAW
#End If
 
Private Enum COMPRESS_INFORMATION_CLASS   'MSDN listed this incorrectly as of 17-May-2017.
                                          'They had COMPRESS_INFORMATION_CLASS_BLOCK_SIZE and
                                          'COMPRESS_INFORMATION_CLASS_LEVEL inverted, changing
                                          'their values!
    COMPRESS_INFORMATION_CLASS_INVALID = 0
 
    COMPRESS_INFORMATION_CLASS_BLOCK_SIZE 'Customized block size. The value specified may be
                                          'from 65536 to 67108864 bytes. This value can be used
                                          'only with the LZMS compression algorithm. A minimum
                                          'size of 1 MB is suggested to get a better
                                          'compression ratio. An information class of this type
                                          'is sizeof(DWORD).
 
    COMPRESS_INFORMATION_CLASS_LEVEL      'Desired level of compression. The default value
                                          'is (DWORD)0. The value (DWORD)1 can improve the
                                          'compression ratio with a slightly slower compression
                                          'speed. This value can be used only with the XPRESS
                                          'compression algorithm or the XPRESS with Huffman
                                          'encoding compression algorithm. An information class
                                          'of this type is sizeof(DWORD).
End Enum
#If False Then
Dim COMPRESS_INFORMATION_CLASS_INVALID, COMPRESS_INFORMATION_CLASS_BLOCK_SIZE
Dim COMPRESS_INFORMATION_CLASS_LEVEL
#End If
 
Public Enum COMPRESSION_LEVELS
    LEVEL_STD = 0
    LEVEL_HIGH = 1
End Enum
#If False Then
Dim LEVEL_STD, LEVEL_HIGH
#End If
 
Private Declare Function CloseCompressor Lib "Cabinet" ( _
    ByVal CompressorHandle As Long) As Long
 
Private Declare Function CloseDecompressor Lib "Cabinet" ( _
    ByVal DecompressorHandle As Long) As Long
 
Private Declare Function CompressAPI Lib "Cabinet" Alias "Compress" ( _
    ByVal CompressorHandle As Long, _
    ByRef UncompressedData As Byte, _
    ByVal UncompressedBufferLength As Long, _
    ByRef CompressedBuffer As Byte, _
    ByVal CompressedBufferLength As Long, _
    ByRef CompressedDataLength As Long) As Long
 
Private Declare Function CreateCompressor Lib "Cabinet" ( _
    ByVal Algorithm As COMPRESS_ALGORITHMS, _
    ByVal pAllocationRoutines As Long, _
    ByRef CompressorHandle As Long) As Long
 
Private Declare Function CreateDecompressor Lib "Cabinet" ( _
    ByVal Algorithm As COMPRESS_ALGORITHMS, _
    ByVal pAllocationRoutines As Long, _
    ByRef DecompressorHandle As Long) As Long
 
Private Declare Function DecompressAPI Lib "Cabinet" Alias "Decompress" ( _
    ByVal DecompressorHandle As Long, _
    ByRef CompressedData As Byte, _
    ByVal CompressedDataLength As Long, _
    ByRef UncompressedBuffer As Byte, _
    ByVal UncompressedBufferLength As Long, _
    ByRef UncompressedBufferLength As Long) As Long
 
Private Declare Function QueryCompressorInformation Lib "Cabinet" ( _
    ByVal CompressorHandle As Long, _
    ByVal CompressInformationClass As COMPRESS_INFORMATION_CLASS, _
    ByRef CompressInformation As Long, _
    ByVal CompressInformationSize As Long) As Long
 
Private Declare Function QueryDecompressorInformation Lib "Cabinet" ( _
    ByVal DecompressorHandle As Long, _
    ByVal CompressInformationClass As COMPRESS_INFORMATION_CLASS, _
    ByRef CompressInformation As Long, _
    ByVal CompressInformationSize As Long) As Long
 
Private Declare Function ResetCompressor Lib "Cabinet" ( _
    ByVal CompressorHandle As Long) As Long
 
Private Declare Function ResetDecompressor Lib "Cabinet" ( _
    ByVal DecompressorHandle As Long) As Long
 
Private Declare Function SetCompressorInformation Lib "Cabinet" ( _
    ByVal CompressorHandle As Long, _
    ByVal CompressInformationClass As COMPRESS_INFORMATION_CLASS, _
    ByRef CompressInformation As Long, _
    ByVal CompressInformationSize As Long) As Long
 
Private Declare Function SetDecompressorInformation Lib "Cabinet" ( _
    ByVal DecompressorHandle As Long, _
    ByVal CompressInformationClass As COMPRESS_INFORMATION_CLASS, _
    ByRef CompressInformation As Long, _
    ByVal CompressInformationSize As Long) As Long
 
Private Handle As Long           '<> INVALID_HANDLE_VALUE means open.
Private Decompressing As Boolean 'Compressing/Decompressing when open.
 
Public Sub CloseCompression()
    If Handle = INVALID_HANDLE_VALUE Then Err.Raise &H8004E100, , "Not open"
    
    If Decompressing Then
        CloseDecompressor Handle
    Else
        CloseCompressor Handle
    End If
    Handle = INVALID_HANDLE_VALUE
End Sub
 
Public Function Compress( _
    ByRef UncompressedData() As Byte, _
    ByRef CompressedBuffer() As Byte, _
    Optional ByVal UnCompressedDataLength As Long = 0, _
    Optional ByVal CompressedBufferLength As Long = 0) As Long
    'UnCompressedDataLength  If provided this is the number of bytes of UncompressedData
    '                        to compress.  Can be less than the entire array.
    '
    'CompressedBufferLength  If provided this is the number of bytes of space
    '                        available in CompressedBuffer (we trust the caller).
    '                        This non-0 value also tells us not to trim the
    '                        CompressedBuffer array.
    '
    'The return value is the actual spcace used in CompressedBuffer for output.
    Dim TrimOutput As Boolean
    Dim LastDllError As Long
    
    If Handle = INVALID_HANDLE_VALUE Then Err.Raise &H8004E100, , "Not open"
    
    If Decompressing Then
        CloseCompressor Handle
        Handle = INVALID_HANDLE_VALUE
        Err.Raise &H8004E110, , "Not open for compression"
    End If
    
    If UnCompressedDataLength = 0 Then
        UnCompressedDataLength = UBound(UncompressedData) - LBound(UncompressedData) + 1
    End If
    
    If CompressedBufferLength = 0 Then
        TrimOutput = True
        On Error Resume Next 'In case CompressedBuffer() was not allocated at all.
        CompressedBufferLength = UBound(CompressedBuffer) - LBound(CompressedBuffer) + 1
        If Err.Number <> 0 Or CompressedBufferLength <= 0 Then
            ReDim CompressedBuffer(0)
        End If
        On Error GoTo 0
    End If
    
    If CompressAPI(Handle, _
                   UncompressedData(LBound(UncompressedData)), _
                   UnCompressedDataLength, _
                   CompressedBuffer(LBound(CompressedBuffer)), _
                   CompressedBufferLength, _
                   CompressedBufferLength) Then
        If TrimOutput Then
            ReDim Preserve CompressedBuffer(LBound(CompressedBuffer) _
                                         To LBound(CompressedBuffer) + CompressedBufferLength - 1)
        End If
    Else
        LastDllError = Err.LastDllError
        If LastDllError = ERROR_INSUFFICIENT_BUFFER Then
            ReDim CompressedBuffer(LBound(CompressedBuffer) _
                                To LBound(CompressedBuffer) + CompressedBufferLength - 1)
            If CompressAPI(Handle, _
                           UncompressedData(LBound(UncompressedData)), _
                           UnCompressedDataLength, _
                           CompressedBuffer(LBound(CompressedBuffer)), _
                           CompressedBufferLength, _
                           CompressedBufferLength) = WIN32_FALSE Then
                LastDllError = Err.LastDllError
                CloseCompressor Handle
                Handle = INVALID_HANDLE_VALUE
                Err.Raise &H8004E200, , "Compress failed, error " & CStr(LastDllError)
            End If
        End If
    End If
    Compress = CompressedBufferLength
End Function
 
Public Function Decompress( _
    ByRef CompressedData() As Byte, _
    ByRef UncompressedBuffer() As Byte, _
    Optional ByVal CompressedDataLength As Long = 0, _
    Optional ByVal UncompressedBufferLength As Long = 0) As Long
    'CompressedDataLength     If provided this is the number of bytes of CompressedData
    '                         to decompress.  Can be less than the entire array.
    '
    'UncompressedBufferLength If provided this is the number of bytes of space
    '                         available in UncompressedBuffer (we trust the caller).
    '                         This non-0 value also tells us not to trim the
    '                         UncompressedBuffer array.
    '
    'The return value is the actual spcace used in UncompressedBuffer for output.
    Dim TrimOutput As Boolean
    Dim LastDllError As Long
    
    If Handle = INVALID_HANDLE_VALUE Then Err.Raise &H8004E100, , "Not open"
    
    If Not Decompressing Then
        CloseDecompressor Handle
        Handle = INVALID_HANDLE_VALUE
        Err.Raise &H8004E120, , "Not open for decompression"
    End If
    
    If CompressedDataLength = 0 Then
        CompressedDataLength = UBound(CompressedData) - LBound(CompressedData) + 1
    End If
    
    If UncompressedBufferLength = 0 Then
        TrimOutput = True
        On Error Resume Next 'In case UncompressedBuffer() was not allocated at all.
        UncompressedBufferLength = UBound(UncompressedBuffer) - LBound(UncompressedBuffer) + 1
        If Err.Number <> 0 Or UncompressedBufferLength <= 0 Then
            ReDim UncompressedBuffer(0)
        End If
        On Error GoTo 0
    End If
    
    If DecompressAPI(Handle, _
                     CompressedData(LBound(CompressedData)), _
                     CompressedDataLength, _
                     UncompressedBuffer(LBound(UncompressedBuffer)), _
                     UncompressedBufferLength, _
                     UncompressedBufferLength) Then
        If TrimOutput Then
            ReDim Preserve UncompressedBuffer(LBound(UncompressedBuffer) _
                                           To LBound(UncompressedBuffer) _
                                            + UncompressedBufferLength - 1)
        End If
    Else
        LastDllError = Err.LastDllError
        If LastDllError = ERROR_INSUFFICIENT_BUFFER Then
            ReDim UncompressedBuffer(LBound(UncompressedBuffer) _
                                  To LBound(UncompressedBuffer) + UncompressedBufferLength - 1)
            If DecompressAPI(Handle, _
                             CompressedData(LBound(CompressedData)), _
                             CompressedDataLength, _
                             UncompressedBuffer(LBound(UncompressedBuffer)), _
                             UncompressedBufferLength, _
                             UncompressedBufferLength) = WIN32_FALSE Then
                LastDllError = Err.LastDllError
                CloseDecompressor Handle
                Handle = INVALID_HANDLE_VALUE
                Err.Raise &H8004E210, , "Decompress failed, error " & CStr(LastDllError)
            End If
        End If
    End If
    Decompress = UncompressedBufferLength
End Function
 
Public Sub OpenCompressor( _
    ByVal Algorithm As COMPRESS_ALGORITHMS, _
    Optional ByVal Level As COMPRESSION_LEVELS = LEVEL_STD)
    
    Dim LastDllError As Long
 
    If Handle <> INVALID_HANDLE_VALUE Then Err.Raise &H8004E300, , "Already open"
    
    If CreateCompressor(Algorithm, WIN32_NULL, Handle) Then
        'Getting ERROR_UNSUPPORTED_TYPE = 1630 so commenting this out.
'        If Algorithm = COMPRESS_ALGORITHM_XPRESS Or Algorithm = COMPRESS_ALGORITHM_XPRESS_HUFF Then
'            If SetCompressorInformation(Handle, _
'                                        COMPRESS_INFORMATION_CLASS_LEVEL, _
'                                        Level, _
'                                        4) = WIN32_FALSE Then
'                LastDllError = Err.LastDllError
'                CloseCompressor Handle
'                Handle = INVALID_HANDLE_VALUE
'                Err.Raise &H8004E310, _
'                          , _
'                          "SetCompressorInformation failed, error " _
'                        & CStr(LastDllError)
'            End If
'        End If
        Decompressing = False
    Else
        Err.Raise &H8004E320, , "CreateCompressor failed, error " & CStr(Err.LastDllError)
    End If
End Sub
 
Public Sub OpenDecompressor( _
    ByVal Algorithm As COMPRESS_ALGORITHMS, _
    Optional ByVal Level As COMPRESSION_LEVELS = LEVEL_STD)
    
    Dim LastDllError As Long
 
    If Handle <> INVALID_HANDLE_VALUE Then Err.Raise &H8004E330, , "Already open"
    
    If CreateDecompressor(Algorithm, WIN32_NULL, Handle) Then
        'Getting ERROR_UNSUPPORTED_TYPE = 1630 so commenting this out.
'        If Algorithm = COMPRESS_ALGORITHM_XPRESS Or Algorithm = COMPRESS_ALGORITHM_XPRESS_HUFF Then
'            If SetDecompressorInformation(Handle, _
'                                          COMPRESS_INFORMATION_CLASS_LEVEL, _
'                                          Level, _
'                                          4) = WIN32_FALSE Then
'                LastDllError = Err.LastDllError
'                CloseDecompressor Handle
'                Handle = INVALID_HANDLE_VALUE
'                Err.Raise &H8004E340, _
'                          , _
'                          "SetDecompressorInformation failed, error " _
'                        & CStr(LastDllError)
'            End If
'        End If
        Decompressing = True
    Else
        Err.Raise &H8004E350, , "CreateDecompressor failed, error " & CStr(Err.LastDllError)
    End If
End Sub
 
Private Sub Class_Initialize()
    Handle = INVALID_HANDLE_VALUE
End Sub
 
Private Sub Class_Terminate()
    If Handle <> INVALID_HANDLE_VALUE Then CloseCompression
End Sub
Здесь можно сжимать и расжимать буфера разными способами включая ZIP

Добавлено через 10 минут
testuser2, так если функция CreateCompressor появилась только начиная от Windows 8 то я не смогу значит написать модуль для упаковки и распаковки данных твоим способом через Cabinet

Добавлено через 1 минуту
Цитата Сообщение от testuser2 Посмотреть сообщение
Сравнил компрессию RtlCompressBuffer (LZNT) и Сabinet (LZMS).
Почему ты сразу мне не сказал что этот твой модуль Сabinet (LZMS) начиная только от Windows 8

Добавлено через 2 минуты
testuser2, а дельты твои работают начиная от Windows Vista?

Добавлено через 26 минут
testuser2, так например даже если ты упакуешь/распакуешь буфер своими дельтами, то в XP это уже работать не будет, и буфер уже там никак не распакуешь. Единственный универсальный вариант это мой модуль к ntdll.dll где используется хоть и не сильное сжатие но хоть какое-то и зато быстрое.

Добавлено через 1 минуту
testuser2, я нашёл ещё очень интересную тему где сравниваются алгоритмы сжатия, библиотеки для сжатия даются, и сравниваются скорости https://www.vbforums.com/showt... -solutions

Добавлено через 43 секунды
testuser2, Compression_5.zip скачай с иностранного форума там очень интересно
1
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,673
Записей в блоге: 2
04.11.2024, 18:51  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Составил декларацию CreateDeltaB, надеюсь без ошибок
Были ошибки, в VB не поддерживаются UDT ByVal. Ошибки исправил (но, по моему, есть еще вариант сделать покрасивей), функция отработала - результат 133 байта, лучше сжал строку, чем в первых 2х случаях
Кликните здесь для просмотра всего текста
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
Option Explicit
Enum DELTA_FLAG_TYPE
    DELTA_FLAG_NONE = 0    
End Enum
Private Const DELTA_FILE_TYPE_RAW = 1
Private Const DELTA_FILE_TYPE_SET_RAW_ONLY = DELTA_FILE_TYPE_RAW
'Private Type DELTA_FILE_TYPE
'    Llng As Long
'    Hlng As Long
'End Type
'Private Type DELTA_INPUT
'    lpcStart As Long
'    uSize As Long
'    Editable As Long
'End Type
Private Type DELTA_OUTPUT
    lpStart As Long
    uSize As Long
End Type
Private Declare Function CreateDeltaB Lib "msdelta" (ByVal FileTypeSet1 As Long, ByVal FileTypeSet2 As Long, _
                                                     ByVal SetFlags1 As Long, ByVal SetFlags2 As Long, _
                                                     ByVal ResetFlags1 As Long, ByVal ResetFlags2 As Long, _
                                                     ByVal Src_lpcStart As Long, ByVal Src_uSize As Long, ByVal Src_Editable As Long, _
                                                     ByVal Trg_lpcStart As Long, ByVal Trg_uSize As Long, ByVal Trg_Editable As Long, _
                                                     ByVal Src_Opt1 As Long, ByVal Src_Opt2 As Long, ByVal Src_Opt3 As Long, _
                                                     ByVal Trg_Opt1 As Long, ByVal Trg_Opt2 As Long, ByVal Trg_Opt3 As Long, _
                                                     ByVal Glb_Opt1 As Long, ByVal Glb_Opt2 As Long, ByVal Glb_Opt3 As Long, _
                                                     ByVal lpTargetFileTime As Long, _
                                                     ByVal HashAlgId As Long, _
                                                     ByVal lpDelta As Long) As Long
Private Declare Function DeltaFree Lib "msdelta" (ByVal lpMemory As Long) As Long
 
Private Sub test()
    Dim bBuf() As Byte, szBuf&, bComp() As Byte, ret&
    Dim DO_Res As DELTA_OUTPUT
    
    bBuf = "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!"
    szBuf = UBound(bBuf) + 1
    ReDim bComp(UBound(bBuf))
    
    ret = CreateDeltaB(DELTA_FILE_TYPE_RAW, 0, _
                        0, 0, _
                        0, 0, _
                        0, 0, 0, _
                        VarPtr(bBuf(0)), szBuf, 0, _
                        0, 0, 0, _
                        0, 0, 0, _
                        0, 0, 0, _
                        0, _
                        0, _
                        VarPtr(DO_Res))
      CopyMemory bComp(0), DO_Res.lpStart, DO_Res.uSize
      ReDim Preserve bComp(DO_Res.uSize - 1)
      
      ret = DeltaFree(DO_Res.lpStart) 'освобождаем память, выделенную функцией для компрессии
      
      Debug.Print "Размер данных:    "; szBuf
      Debug.Print "После компрессии: "; DO_Res.uSize
End Sub

Code
1
2
Размер данных:     374 
После компрессии:  133
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
04.11.2024, 18:59
Цитата Сообщение от testuser2 Посмотреть сообщение
лучше сжал строку
А файл DLL пробовал так сжать? Каков будет результат?

Добавлено через 4 минуты
Цитата Сообщение от testuser2 Посмотреть сообщение
После компрессии: 133
У меня в семёрке так же, тоже 133, а вот в XP боюсь, что не будет работать (но сейчас проверю, для интереса)
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,673
Записей в блоге: 2
04.11.2024, 19:04  [ТС]
Code
1
2
Размер данных:     74240 
После компрессии:  39667
Еще такая фигня, пошагово выполняю - нормально, выполнил обычно - все зависло, походу, ассинхронно это работает..

Добавлено через 2 минуты
Цитата Сообщение от testuser2 Посмотреть сообщение
Code
1
2
3
4
5
6
7
8
'сжатие строки
Размер данных:   374 
NT-кмопрессия:   139 
Cab-компрессия:  146 
'сжатие бинарного файла (библиотеки)
Размер данных:   171008 
NT-кмопрессия:   125047 
Cab-компрессия:  83504
DeltaB:
Code
1
2
Размер данных:     171008 
После компрессии:  88618
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
04.11.2024, 19:10
testuser2, хорошие новости: я проверил в XP тоже работает
а ты можешь приложить код для теста DLL

Добавлено через 1 минуту
testuser2, о так напиши тогда модуль для упаковки/распаковки буфера на дельтах (если не будет глючить и зависать то можно пользоваться)

Добавлено через 28 секунд
на дельтах же лучше сжимает получается ну
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,673
Записей в блоге: 2
04.11.2024, 19:16  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
а ты можешь приложить код для теста DLL
Точно также использовал функцию GetFile, как в прошлом примере с кабинетом.

Добавлено через 35 секунд
Цитата Сообщение от HackerVlad Посмотреть сообщение
на дельтах же лучше сжимает получается ну
похуже кабинета
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
04.11.2024, 19:27
Цитата Сообщение от testuser2 Посмотреть сообщение
похуже кабинета
Можно использовать API для кабинета которые есть во всех версиях Windows начиная с Windows 98
Там вроде такие функции
FciCreate FciAddFile FciFlushCabinet FciFlushFolder FciDestroy

Добавлено через 27 секунд
Типа как создание и распаковка CAB-файлов возможно и буфера просто без файлов можно
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
04.11.2024, 19:29
Вот я прикладываю скриншот, чтобы ты понимал какие функции есть для Cabinet.dll в семёрке
Миниатюры
Работа с zip архивами  
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
04.11.2024, 22:02
Создание CAB думаю используется эта API: https://learn.microsoft.com/en... -fcicreate

Добавлено через 3 минуты
testuser2, вот например пример использования https://www.viathinksoft.com/codelib/206

Добавлено через 2 минуты
testuser2, но это очень сложные API по сравнению с новой версией библиотеки Cabinet.dll начиная от Windows 8

Добавлено через 2 часа 18 минут
testuser2, полная документация по дельта-сжатию https://learn.microsoft.com/en... (v=msdn.10)
1
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,673
Записей в блоге: 2
05.11.2024, 13:36  [ТС]
Компрессия/декомпрессия буфера DeltaB
Кликните здесь для просмотра всего текста
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
Option Explicit
''##Разкомментировать в VB6##
'Private Enum LongPtr
'    [_]
'End Enum
''###########################
Enum DELTA_FLAG_TYPE
    DELTA_FLAG_NONE = 0    
End Enum
Private Const DELTA_FILE_TYPE_RAW@ = 1 / 10000
Private Const DELTA_FILE_TYPE_SET_RAW_ONLY@ = DELTA_FILE_TYPE_RAW
Private Type DELTA_OUTPUT
    lpStart As LongPtr
    uSize As LongPtr
End Type
Private Declare Function CreateDeltaB Lib "msdelta" (Optional ByVal FileTypeSet As Currency = DELTA_FILE_TYPE_RAW, Optional ByVal SetFlags As Currency, Optional ByVal ResetFlags As Currency, _
                                                     Optional ByVal Src_lpcStart As LongPtr, Optional ByVal Src_uSize As LongPtr, Optional ByVal Src_Editable As Long, _
                                                     Optional ByRef Trg_lpcStart As Any, Optional ByVal Trg_uSize As LongPtr, Optional ByVal Trg_Editable As Long, _
                                                     Optional ByVal SrcOpt_lpcStart As LongPtr, Optional ByVal SrcOpt_uSize As LongPtr, Optional ByVal SrcOpt_Editable As Long, _
                                                     Optional ByVal TrgOpt_lpcStart As LongPtr, Optional ByVal TrgOpt_uSize As LongPtr, Optional ByVal TrgOpt_Editable As Long, _
                                                     Optional ByVal GlbOpt_lpcStart As LongPtr, Optional ByVal GlbOpt_uSize As LongPtr, Optional ByVal GlbOpt_Editable As Long, _
                                                     Optional ByVal lpTargetFileTime As LongPtr, Optional ByVal HashAlgId As Long, _
                                                     Optional ByRef lpDelta As Any) As Long
Private Declare Function DeltaFree Lib "msdelta" (ByVal lpMemory As LongPtr) As Long
Private Declare Function ApplyDeltaB Lib "msdelta" (ByVal ApplyFlags As Currency, _
                                                     ByVal Src_lpcStart As LongPtr, ByVal Src_uSize As LongPtr, ByVal Src_Editable As Long, _
                                                     ByRef Dlt_lpcStart As Any, ByVal Dlt_uSize As LongPtr, ByVal Dlt_Editable As Long, _
                                                     ByRef lpTarget As DELTA_OUTPUT) As Long
 
Private Function CompressDeltaB(bInp() As Byte) As Byte()
    Dim ret&, bOut() As Byte, DO_Res As DELTA_OUTPUT
    
'    ret = CreateDeltaB(DELTA_FILE_TYPE_RAW, 0, 0, 0, 0, 0, bInp(0), UBound(bInp) + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, DO_Res) 'v1
'    ret = CreateDeltaB(, , , , , , bInp(0), UBound(bInp) + 1, , , , , , , , , , , , , DO_Res)                                     'v2
    ret = CreateDeltaB(Trg_lpcStart:=bInp(0), Trg_uSize:=UBound(bInp) + 1, lpDelta:=DO_Res)                                       'v3
    If ret Then
      With DO_Res
        ReDim bOut(.uSize - 1)
        CopyMemory bOut(0), ByVal .lpStart, .uSize
        DeltaFree (.lpStart)
      End With
    End If
    
    CompressDeltaB = bOut
End Function
Private Function DeCompressDeltaB(bInp() As Byte) As Byte()
    Dim ret&, bOut() As Byte, DO_Res As DELTA_OUTPUT
    
    ret = ApplyDeltaB(0, 0, 0, 0, bInp(0), UBound(bInp) + 1, 0, DO_Res)
    If ret Then
      With DO_Res
        If .lpStart Then
            ReDim bOut(.uSize - 1)
            CopyMemory bOut(0), ByVal .lpStart, .uSize
        End If
      End With
    End If
    
    DeCompressDeltaB = bOut
End Function


Добавлено через 5 часов 34 минуты
Скорее всего DeltaB использует ту же компрессию, что и Cab, просто добавляет какую-то описательную информацию
Цитата Сообщение от testuser2 Посмотреть сообщение
If .lpStart Then
Это была лишняя проверка

Добавлено через 12 минут
Цитата Сообщение от HackerVlad Посмотреть сообщение
я нашёл ещё очень интересную тему где сравниваются алгоритмы сжатия
Интересная тема, оказывается есть более современные библиотеки, даже по сравнению с zlib, сжимающие зип с большим уровнем компрессии и с большей скоростью
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
05.11.2024, 15:42
Цитата Сообщение от testuser2 Посмотреть сообщение
Скорее всего DeltaB использует ту же компрессию, что и Cab
Надо просто сравнить буфера
Буфер из файла CAB выдернуть посмотреть, и тут в дельте

Добавлено через 50 секунд
Буфер выдернуть из CAB легко на Windows 8 API я не смогу, для меня в семёрке это слишком сложно

Добавлено через 33 минуты
testuser2, с твоего позволения у меня есть несколько замечаний

1. Не объявлена функция CopyMemory
2. Функции которые возвращают байтовый массив - это не очень удобные функции, так как в случае ошибки будет 9 ошибка что массив не инициализирован, мне больше нравится когда функция возвращает не массив а True или False, но это дело вкусов уже может

Однако у меня как раз сейчас и выскочила 9 ошибка, буду думать почему не работает и почему массив не наполняется

Добавлено через 2 минуты
testuser2, смотри какую ошибку я сразу нашёл: на маленьком файле всё успешно, а вот когда я буфер поместил файл объёмом 40 мегабайт, то сразу всё слетело и 9 ошибка
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,673
Записей в блоге: 2
05.11.2024, 15:51  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
Надо просто сравнить буфера
Буфер из файла CAB выдернуть посмотреть, и тут в дельте
У меня тоже была такая мысль и я проверил, сжатые буферы поместил в строки и произвольную небольшную часть одной строки, искал в другой. Брал с разных мест, но не разу не совпало. Хотя уровень компрессии очень похожий.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
05.11.2024, 16:03
testuser2, так же мои тесты показывают, что хоть и компрессия у дельты лучше, однако скорость хуже чем у RtlCompressBuffer. С помощью RtlCompressBuffer 0млск, а с помощью дельты целых 150млск для маленького файла zlibwapi.dll

Добавлено через 57 секунд
Цитата Сообщение от testuser2 Посмотреть сообщение
Брал с разных мест, но не разу не совпало.
Значит это разные алгоритмы, хоть и по объёму сжатия сжимает примерно с одинаковым коэффицентом.

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

Сейчас будем думать что не так с большими файлами!!!

Добавлено через 8 минут
testuser2, сам подумай: если функция выполнилась неуспешно, с ошибкой, то возвращать массив это тупость (так как массива нет и будет 9 ошибка) лучше всего возвращать True или False и тогда можно будет хотябы проверить что если функция вернула True то только тогда шерстить наполненный массив. Иначе, по твоей системе возвращения байтового массива мне придётся делать дополнительную проверку на: либо наличие 9 ошибка, либо на то наполнен ли вообще был массив с помощью разных хаков, а это не так и просто.
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,673
Записей в блоге: 2
05.11.2024, 16:21  [ТС]
Сейчас проверл на файле 20 мб текстовом файле, без ошибки, такой результат. Дельта медленная, но получше жмет
Code
1
2
3
Размер файла:   22890878 (21,83 мб)
Cabinet (LZMS): 3251524  6,945313 
DeltaB:         2156477  14,36719
Цитата Сообщение от HackerVlad Посмотреть сообщение
если функция выполнилась неуспешно, с ошибкой, то возвращать массив это тупость
У тебя, тоже лажа бывает в кодах )) Не у тебя только конечно, вообще в большинстве кодов, которые мне попадаются какая-то лажа, которую я переделываю просто по своему. И это классно, кстати, когда че-то переделываешь, какбы свою лепту тоже вносишь )

Добавлено через 9 минут
Цитата Сообщение от HackerVlad Посмотреть сообщение
testuser2, вот например пример использования https://www.viathinksoft.com/codelib/206
Делфи конечно мощный язык, но объявлять так структуры TCCAB = record это зашквар какой-то
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
05.11.2024, 16:51
Цитата Сообщение от testuser2 Посмотреть сообщение
6,94
Что такое 6.94? Неужели секунды? Было бы тогда оч медленно

Добавлено через 22 секунды
Цитата Сообщение от testuser2 Посмотреть сообщение
на файле 20 мб
20 мб может ещё и тянет а вот ты проверь 40

Добавлено через 5 минут
Цитата Сообщение от testuser2 Посмотреть сообщение
какая-то лажа, которую я переделываю просто по своему
Полностью согласен, особенно люблю убирать ненавистные мне Call некоторые прогеры эту фигню пишут

Добавлено через 17 минут
testuser2, неужели в функции CreateDeltaB все параметры необязательные?
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,673
Записей в блоге: 2
05.11.2024, 17:15  [ТС]
Проверил на 68 мб, действительно не отрабатывает компрессию. Там есть в пояснении
Return value

This function returns TRUE if it succeeds; otherwise, it returns FALSE. When the function returns FALSE, you can call GetLastError to get the corresponding Win32 system error code.
Однако GetLastError тоже возвращает ноль
Цитата Сообщение от HackerVlad Посмотреть сообщение
неужели в функции CreateDeltaB все параметры необязательные?
Я все делал по этой прекрасной статье.
Плюсы использования Delta-функций очевидны. Отличная степень сжатия, особенно на файлах большого размера, простота реализации, а главное, не надо выделять дополнительную память под упакованные и распакованные данные, все это сделает система.
Могу предложить идею вычислить минимальный допустимый размер и нарезать файл "чанки" такого размера перед сжатием..

Добавлено через 3 минуты
Если же придаться изучению дельта-функций, полагаю, можно погрязнуть в тине не смежных со сжатием вопросов, так и не достигнув желаемого понимания
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
05.11.2024, 17:56
Цитата Сообщение от testuser2 Посмотреть сообщение
минимальный допустимый размер
Минимальный? 1 байт скорее всего)))) Может ты имел ввиду максимальный))) Надо смотреть реально почему большие файлы не тянет.

Добавлено через 38 секунд
Цитата Сообщение от testuser2 Посмотреть сообщение
Я все делал по этой прекрасной статье.
Кстати я в интернете больше нигде не видел такого кода упаковки и распаковки буферов на дельте.

Добавлено через 15 минут
Цитата Сообщение от testuser2 Посмотреть сообщение
Могу предложить идею вычислить минимальный допустимый размер и нарезать файл "чанки" такого размера перед сжатием..
А я могу предложить идею буферной подкачки, чтобы всегда-всегда нарезало на кусочки там по 10 Мб например или по сколько-нибудь там

Добавлено через 5 минут
Смотри вот в функции RtlCompressBuffer есть параметр UncompressedChunkSize где у меня в моём модуле устанавливается 4096 (я уже не помню почему ставил именно 4096) то есть там чанки уже есть в этих функциях похоже. А в дельте нет чанок?
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,673
Записей в блоге: 2
05.11.2024, 17:59  [ТС]
Описание параметнов DeltaB
Кликните здесь для просмотра всего текста
Параметры

FileTypeSet

[в] Набор типов файлов, который будет использоваться для Create. См. также Наборы типов файлов.

УстановитьФлаги

[в] Флаги, которые будут использоваться во время создания, в дополнение к флагам по умолчанию.

СбросФлагов

[в] Флаги по умолчанию, которые необходимо сбросить во время создания.

Источник

[в] Структура DELTA_INPUT, содержащая указатель на буфер, содержащий исходные данные.

Цель

[в] Структура DELTA_INPUT, содержащая указатель на буфер, содержащий целевые данные.

SourceOptions

[в] Зарезервировано. Передайте структуру DELTA_INPUT с Editable, установленным на FALSE, lpStart, установленным на NULL, и uSize, установленным на 0.

TargetOptions

[в] Зарезервировано. Передайте структуру DELTA_INPUT с Editable, установленным на FALSE, lpStart, установленным на NULL, и uSize, установленным на 0.

GlobalOptions

[in] Зарезервировано. Передайте структуру DELTA_INPUT с lpStart, установленным в NULL, и uSize, установленным в 0.

lpTargetFileTime

[in] Временная метка, установленная на целевом файле после delta Apply. Если NULL, то целевой временной меткой будет текущее время во время Create.

HashAlgId

[в] ALG_ID алгоритма, который будет использоваться для генерации целевой подписи. Некоторые специальные значения:

0 = Нет подписи

32 = 32-битный CRC, определенный в msdelta.dll

lpDelta

[out] Указатель на структуру DELTA_OUTPUT, куда должна быть записана дельта.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
05.11.2024, 18:05
testuser2, твою функцию упаковки лучше переделать так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Function CompressDeltaB(bInp() As Byte, bOut() As Byte) As Boolean
    Dim ret As Long
    Dim DO_Res As DELTA_OUTPUT
    
    ret = CreateDeltaB(Trg_lpcStart:=bInp(0), Trg_uSize:=UBound(bInp) + 1, lpDelta:=DO_Res)
    
    If ret Then
        With DO_Res
            ReDim bOut(.uSize - 1)
            CopyMemory bOut(0), ByVal .lpStart, .uSize
            DeltaFree (.lpStart)
        End With
        
        CompressDeltaB = True
    End If
End Function
Тогда можно будет хоть проверять на ошибки, в коде писать так:

Visual Basic
1
If CompressDeltaB(buf, buf2) = True Then ' Успех
Добавлено через 47 секунд
Хотя в моих функциях NT вообще буфер перезаписывался старый который был, но как лучше тут делать я уже не знаю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.11.2024, 18:05

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? Какие нужны библиотеки и где их взять? заранее спасибо.


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

Или воспользуйтесь поиском по форуму:
140
Ответ Создать тему
Новые блоги и статьи
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru