Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19

Как программно узнать закончил ли ZIP свою работу?

25.02.2014, 11:19. Показов 14219. Ответов 90
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Тот класс переделал, только не могу понять
как всётаки получить ответ что ZIP закончил свою работу ?

класс переделал ! по рекомендации проффесионала под ником Dragokas
выкладываю все версии в блоге

ниже фрагмент с коментарием где необходим этот код

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
Public Function UnZipFile(ByVal DestPath$, ParamArray Files())
    '
    'Извлечение из архива
    'Аргументы:
    'DestPath - полный путь к папке для распаковки архива
    'Files - Без параметра все файлы, либо по индексу либо имени в архиве
    'Примечание: Имена файлов в архиве, должны быть полными !
    '
    Dim DestDir As Object, s$, f&, j$(), v As Variant
 
    If Not FolderExists(DestPath) Then 'Проверяем есть ли папка
        MkDir (DestPath) 'Создаём папку для перемещаемых туда объектов
    End If
    Set DestDir = Shell.NameSpace((DestPath))
 
    If IsMissing(Files) Then
        DestDir.CopyHere mArchive.Items 'Перемещаем все ...
        '
        '
        '===== Здесь нужен правильный код окончания операции ! ! !
        '
        '
    Else
 
        For Each v In Files 'Подготавливаем список для перемещения
 
            If IsNumeric(v) Then
                s = s & " " & mArchive.Items().Item((v)).Name
            Else
 
                For f = 0 To mArchive.Items.Count - 1
                    If v = mArchive.Items().Item((f)).Name Then s = s & " " & f
                Next
            End If
        Next
        j = Split(Mid$(s, 2)) 'Cписок для перемещения
 
        For f = 0 To mArchive.Items.Count - 1
            s = mArchive.Items().Item(CLng(j(f))).Name
            s = DestPath & "\" & s
            DestDir.CopyHere mArchive.Items.Item(CLng(j(f))) 'Перемещаем указнные инексы
 
            Do 'Ждём пока в папке назначения не появится файл
                Sleep 100 '1/10 доля секунды
            Loop While Len(Dir(s)) = 0
        Next
    End If
End Function
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.02.2014, 11:19
Ответы с готовыми решениями:

Как в VBA узнать когда процесс закончил работу?
Как в VBA узнать когда процесс закончил работу? И существует работа с процессами в VBA

Как уведомить первый поток о том, что второй закончил свою работу
Добрый день. Проблема такая. Есть 2 класса. Первый MyLogic - отвечает за логику приложения, второй MyApplication - отвечает за его...

Как узнать закончил ли поток работу?
Для создания потоков использую ThreadPool.QueueUserWorkItem Как узнать когда, потоки закончат работу, к результату не привязать...

90
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
18.02.2025, 14:59
Студворк — интернет-сервис помощи студентам
The trick, да, я помню эти разрозненные куски кода, которые непонятно как заставить работать. Что такое As CZIPStreams например и где его брать вообще непонятно. Я думал есть класс (файл .cls) или модуль (файл .bas) нету такого?
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
24.02.2025, 17:56
Как можно давать код который не работает вот что такое CZIPStreams и где его брать непонятно вообще.

Добавлено через 1 час 17 минут
Ненавижу такое: когда пишут As что-то там и не понятно As что...
Может быть CZIPStreams это обычный IStream? Это как предположение...
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
24.02.2025, 18:09
Цитата Сообщение от HackerVlad Посмотреть сообщение
Как можно давать код который не работает вот что такое CZIPStreams и где его брать непонятно вообще.
Ну значит сам пиши код. Тебе дали логику работы и объяснили ньюансы. Если бы ты читал эту тему, ты бы понял для чего тот код. Тебе что целый проект кидать в котором куча зависимостей?
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
24.02.2025, 18:17
Цитата Сообщение от The trick Посмотреть сообщение
Ну значит сам пиши код.
Ну вот сижу сейчас и пишу сам эту рекурсию для подпапок, а что ещё остаётся делать...

Добавлено через 3 минуты
The trick, просто ты рекламировал что у тебя будет класс для работы с zipfldr.dll, а в итоге этого класса нету
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
24.02.2025, 18:21
Цитата Сообщение от HackerVlad Посмотреть сообщение
The trick, просто ты рекламировал что у тебя будет класс для работы с zipfldr.dll, а в итоге этого класса нету
Из-за тех ньюансов о которых писал этого кода и нету. А полурабочий код выкладывать не вижу смысла. Проведя исследование кучи библиотек на разных системах в итоге я бы сделал как в 1-м варианте который тут опубликовал (с отслеживанием потоков), только определял поток по функции обратного вызова. Этот вариант будет работать на всех системах. Тот код с CZIPStreams был из одного проекта который гарантирнованно работает на WIN10 и был написан на заказ где и работает.
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
24.02.2025, 19:03
Ура! Я написал рекурсию для чтения подпапок:
Ура! Я написал примерчик для чтения структуры ZIP со всеми вложенными подпапками (без распаковки, просто чтение файлов)
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
Private Declare Function SHParseDisplayName Lib "shell32" (ByVal pszName As Long, ByVal IBindCtx As Long, ByRef ppidl As Long, sfgaoIn As Long, sfgaoOut As Long) As Long
Private Declare Function ILFree Lib "shell32" (ByVal pidlFree As Long) As Long
Private Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynW" (ByVal lpString1 As Long, ByVal lpString2 As Long, ByVal iMaxLength As Long) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenW" (ByVal lpString As Long) As Long
 
Private Const ZipFldrCLSID = "{E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31}"
Private Const IID_IShellExtInit = "{000214E8-0000-0000-C000-000000000046}"
 
Private Sub IStorageRead(IStorageInZIP As IStorage, Optional PathFolder As String)
    Dim enm As IEnumSTATSTG
    Dim itm As STATSTG
    Dim nam As String
    Dim cb As Long
    
    Set enm = IStorageInZIP.EnumElements
    
    enm.Reset
    Do While enm.Next(1, itm) = S_OK
        cb = lstrlen(itm.pwcsName)
        nam = Space(cb)
        lstrcpyn StrPtr(nam), itm.pwcsName, cb + 1
        CoTaskMemFree itm.pwcsName
        
        If itm.Type <> STGTY_STORAGE Then
            If Len(PathFolder) > 0 Then
                List1.AddItem PathFolder & "\" & nam
            Else
                List1.AddItem nam
            End If
        Else
            IStorageRead IStorageInZIP.OpenStorage(nam, 0, STGM_READ, 0, 0), IIf(PathFolder <> "", PathFolder & "\" & nam, nam)
        End If
    Loop
End Sub
 
Private Sub ReadingStructureZIP(ByVal FileName As String)
    Dim clsid   As UUID
    Dim iidSh   As UUID
    Dim shExt   As IShellExtInit
    Dim pf      As IPersistFolder2
    Dim pidl    As Long
    
    CLSIDFromString ZipFldrCLSID, clsid
    CLSIDFromString IID_IShellExtInit, iidSh
    
    If CoCreateInstance(clsid, Nothing, CLSCTX_INPROC_SERVER, iidSh, shExt) <> S_OK Then Exit Sub
    Set pf = shExt
    SHParseDisplayName StrPtr(FileName), 0, pidl, 0, 0
    pf.Initialize pidl
    ILFree pidl
    
    IStorageRead pf
End Sub
 
Private Sub Form_Load()
    Text1.Text = App.Path & "\test.zip"
    ReadingStructureZIP Text1.Text
    If List1.ListCount > 0 Then List1.Selected(0) = True
End Sub
И тут совершенно мне даже не нужно знать что такое CZIPStreams. Вообще плевать на это. Работает и без знания того что такое CZIPStreams.

Главное я понял логику, просматривая проект fafalone а так же этот код от The trick. И сделал сам рекурсию! Ура!

Теперь хоть можно сделать нормальную прогу для чтения картинок из файлов docx, код фафалона оказался на это не способен почему-то. Поэтому я и выбрал переделывать код The trick (самый лучший вариантов из всех оказался).
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
24.02.2025, 23:52
Цитата Сообщение от The trick Посмотреть сообщение
Я разобрался с Zipfldr.dll
Почему-то за 10 лет так до сих пор никто и не улучшил этот код. Даже у знаменитого fafalone код не такой хороший как у The trick, так как не позволяет напрямую работать с docx файлами. А вот этот код очень хороший у The trick осталось его только немного доработать для обработки вложенных подпапок и всё. И я это сделал!

Ура! Выкладываю свой новый код. Прога для чтения картинок из файлов zip, docx, xlsx, exe (sfx-zip) и т. д.

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
Option Explicit
Private Declare Function SHParseDisplayName Lib "shell32" (ByVal pszName As Long, ByVal IBindCtx As Long, ByRef ppidl As Long, sfgaoIn As Long, sfgaoOut As Long) As Long
Private Declare Function ILFree Lib "shell32" (ByVal pidlFree As Long) As Long
Private Declare Function GetTickCount Lib "kernel32" () As Long
 
Private Const ZipFldrCLSID = "{E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31}"
Private Const IID_IShellExtInit = "{000214E8-0000-0000-C000-000000000046}"
 
Private Sub ReadingStructureZIP(ByVal FileName As String)
    Dim clsid   As UUID
    Dim iidSh   As UUID
    Dim shExt   As IShellExtInit
    Dim pf      As IPersistFolder2
    Dim pidl    As Long
    
    CLSIDFromString ZipFldrCLSID, clsid
    CLSIDFromString IID_IShellExtInit, iidSh
    
    If CoCreateInstance(clsid, Nothing, CLSCTX_INPROC_SERVER, iidSh, shExt) <> S_OK Then Exit Sub
    Set pf = shExt
    SHParseDisplayName StrPtr(FileName), 0, pidl, 0, 0
    pf.Initialize pidl
    ILFree pidl
    
    IStorageRead pf
End Sub
 
Private Sub IStorageRead(IStorageInZIP As IStorage, Optional PathFolder As String)
    Dim enm As IEnumSTATSTG
    Dim itm As STATSTG
    Dim nam As String
    Dim cb As Long
    
    Set enm = IStorageInZIP.EnumElements
    
    enm.Reset
    Do While enm.Next(1, itm) = S_OK
        nam = SysAllocString(itm.pwcsName)
        CoTaskMemFree itm.pwcsName
        
        If itm.Type = STGTY_STREAM Then
            List1.AddItem IIf(PathFolder <> "", PathFolder & "\" & nam, nam)
        ElseIf itm.Type = STGTY_STORAGE Then
            IStorageRead IStorageInZIP.OpenStorage(nam, 0, STGM_READ, 0, 0), IIf(PathFolder <> "", PathFolder & "\" & nam, nam)
        End If
    Loop
End Sub
 
Private Sub LoadFileFromZIP(ByVal FileName As String, ByVal FileNameInZIP As String)
    Dim clsid   As UUID
    Dim iidSh   As UUID
    Dim shExt   As IShellExtInit
    Dim pf      As IPersistFolder2
    Dim pidl    As Long
    
    CLSIDFromString ZipFldrCLSID, clsid
    CLSIDFromString IID_IShellExtInit, iidSh
    
    If CoCreateInstance(clsid, Nothing, CLSCTX_INPROC_SERVER, iidSh, shExt) <> S_OK Then Exit Sub
    Set pf = shExt
    SHParseDisplayName StrPtr(FileName), 0, pidl, 0, 0
    pf.Initialize pidl
    ILFree pidl
    
    UnpackFileFromZIP pf, FileNameInZIP
End Sub
 
Private Sub UnpackFileFromZIP(IStorageInZIP As IStorage, ByVal FileNameInZIP As String, Optional PathFolder As String)
    Dim enm As IEnumSTATSTG
    Dim itm As STATSTG
    Dim nam As String
    Dim cb As Long
    Dim FileName As String
    Dim stm As IStream
    Dim bArray() As Byte
    Dim my_size As Long
    
    Set enm = IStorageInZIP.EnumElements
    
    enm.Reset
    Do While enm.Next(1, itm) = S_OK
        nam = SysAllocString(itm.pwcsName)
        CoTaskMemFree itm.pwcsName
        FileName = IIf(PathFolder <> "", PathFolder & "\" & nam, nam)
        
        If itm.Type = STGTY_STREAM Then
            If FileName = FileNameInZIP Then
                Set stm = IStorageInZIP.OpenStream(nam, 0, STGM_READ, 0)
                
                my_size = itm.cbSize * 10000@
                ReDim bArray(my_size - 1)
                
                stm.Read bArray(0), my_size
                Picture1.Picture = SimpleLoadPicture(bArray)
            End If
        ElseIf itm.Type = STGTY_STORAGE Then
            UnpackFileFromZIP IStorageInZIP.OpenStorage(nam, 0, STGM_READ, 0, 0), FileNameInZIP, FileName
        End If
    Loop
End Sub
 
Private Function SimpleLoadPicture(bPic() As Byte) As StdPicture
    On Error Resume Next
    
    With CreateObject("WIA.Vector")
        .BinaryData = bPic
        Set SimpleLoadPicture = .Picture
    End With
End Function
 
Private Sub Form_Load()
    Text1.Text = App.Path & "\test.docx"
    ReadingStructureZIP Text1.Text
    
    If List1.ListCount > 0 Then
        List1.Selected(0) = True
        Label1.Caption = "Count files: " & List1.ListCount
    End If
End Sub
 
Private Sub List1_Click()
    Dim tick As Long
    
    tick = GetTickCount
    LoadFileFromZIP Text1.Text, List1.Text
    Label2.Caption = "ms: " & (GetTickCount - tick)
End Sub
 
Private Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then
        KeyAscii = 0
        
        List1.Clear
        ReadingStructureZIP Text1.Text
        
        If List1.ListCount > 0 Then
            List1.Selected(0) = True
            Label1.Caption = "Count files: " & List1.ListCount
            List1.SetFocus
        End If
    End If
End Sub
Миниатюры
Как программно узнать закончил ли ZIP свою работу?  
Вложения
Тип файла: zip Reading ZIP, DOCX, EXE and a preview of the pictures.zip (915.6 Кб, 0 просмотров)
1
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
25.02.2025, 00:07
HackerVlad, ошибок много. Не проверяются возвращаемые значения, нет валидации размера. Вот тут все это сделано.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
25.02.2025, 01:18
Цитата Сообщение от The trick Посмотреть сообщение
нет валидации размера
Хорошо, пусть будет так тогда:

Visual Basic
1
2
3
4
5
6
                If my_size > 0 Then
                    ReDim bArray(my_size - 1)
                    
                    stm.Read bArray(0), my_size
                    Picture1.Picture = SimpleLoadPicture(bArray)
                End If
Добавлено через 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
Private Sub UnpackFileFromZIP(IStorageInZIP As IStorage, ByVal FileNameInZIP As String, Optional PathFolder As String)
    Dim enm As IEnumSTATSTG
    Dim itm As STATSTG
    Dim nam As String
    Dim cb As Long
    Dim FileName As String
    Dim stm As IStream
    Dim bArray() As Byte
    Dim my_size As Long
    
    Set enm = IStorageInZIP.EnumElements
    
    enm.Reset
    Do While enm.Next(1, itm) = S_OK
        nam = SysAllocString(itm.pwcsName)
        CoTaskMemFree itm.pwcsName
        FileName = IIf(PathFolder <> "", PathFolder & "\" & nam, nam)
        
        If itm.Type = STGTY_STREAM Then
            If FileName = FileNameInZIP Then
                Set stm = IStorageInZIP.OpenStream(nam, 0, STGM_READ, 0)
                my_size = itm.cbSize * 10000@
                
                If my_size > 0 Then
                    ReDim bArray(my_size - 1)
                    
                    stm.Read bArray(0), my_size
                    Picture1.Picture = SimpleLoadPicture(bArray)
                End If
                
                Set stm = Nothing
            End If
        ElseIf itm.Type = STGTY_STORAGE Then
            UnpackFileFromZIP IStorageInZIP.OpenStorage(nam, 0, STGM_READ, 0, 0), FileNameInZIP, FileName
        End If
    Loop
End Sub
Норм!

Добавлено через 53 секунды
Я правда не знаю зачем ты это добавил в своём коде "Set cStm = Nothing" но пусть будет, на всякий случай тогда. Проверять возвращаемые значения не хочу. Итак всё работает шикарненько!

Добавлено через 3 минуты
Все эти преобразования с GetMem8 и деление на hipart и lowpart я тоже не хочу, достаточно просто математического умножения на 10 тысяч для меня и всё, так проще и короче будет)

Добавлено через 1 минуту
Главное что всё работает! Я даже не понял про какие ты там возвращаемые значения говорил. CoCreateInstance и SHParseDisplayName что ли. Да и плевать на эти возвращаемые значения.

Добавлено через 1 минуту
Я же переписывал с твоего изначального примера и там есть одна проверка возвращаемого значения вот так написана: If CoCreateInstance(clsid, Nothing, CLSCTX_INPROC_SERVER, iidSh, shExt) <> S_OK Then Exit Sub

Добавлено через 37 секунд
SHParseDisplayName только проверки нету ну и плевать я считаю что от этого измениться, луна с неба не рухнет на землю.

Добавлено через 4 минуты
Абсолютно нормально у меня написано, я считаю.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
25.02.2025, 02:32
Я решил ещё написать теперь XP-совместимую версию. Теперь вообще не нужен даже промежуточный байтовый массив, теперь сразу напрямую загружаю картинку из IStream через GdiPlus API да и всё дело. Ура! Новая версия XP-совместимая! А так же теперь показывает размеры файлов.

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
Option Explicit
Private Declare Function SHParseDisplayName Lib "shell32" (ByVal pszName As Long, ByVal IBindCtx As Long, ByRef ppidl As Long, sfgaoIn As Long, sfgaoOut As Long) As Long
Private Declare Function ILFree Lib "shell32" (ByVal pidlFree As Long) As Long
Private Declare Function GetTickCount Lib "kernel32" () As Long
 
Private Const ZipFldrCLSID = "{E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31}"
Private Const IID_IShellExtInit = "{000214E8-0000-0000-C000-000000000046}"
 
Private Sub ReadingStructureZIP(ByVal FileName As String)
    Dim clsid   As UUID
    Dim iidSh   As UUID
    Dim shExt   As IShellExtInit
    Dim pf      As IPersistFolder2
    Dim pidl    As Long
    
    CLSIDFromString ZipFldrCLSID, clsid
    CLSIDFromString IID_IShellExtInit, iidSh
    
    If CoCreateInstance(clsid, Nothing, CLSCTX_INPROC_SERVER, iidSh, shExt) <> S_OK Then Exit Sub
    Set pf = shExt
    SHParseDisplayName StrPtr(FileName), 0, pidl, 0, 0
    pf.Initialize pidl
    ILFree pidl
    
    IStorageRead pf
End Sub
 
Private Sub IStorageRead(IStorageInZIP As IStorage, Optional PathFolder As String)
    Dim enm As IEnumSTATSTG
    Dim itm As STATSTG
    Dim nam As String
    Dim cb As Long
    
    Set enm = IStorageInZIP.EnumElements
    
    enm.Reset
    Do While enm.Next(1, itm) = S_OK
        nam = SysAllocString(itm.pwcsName)
        CoTaskMemFree itm.pwcsName
        
        If itm.Type = STGTY_STREAM Then
            List1.AddItem IIf(PathFolder <> "", PathFolder & "\" & nam, nam) & IIf(itm.cbSize, "    " & itm.cbSize * 10000@ & " bytes", "")
        ElseIf itm.Type = STGTY_STORAGE Then
            IStorageRead IStorageInZIP.OpenStorage(nam, 0, STGM_READ, 0, 0), IIf(PathFolder <> "", PathFolder & "\" & nam, nam)
        End If
    Loop
End Sub
 
Private Sub LoadFileFromZIP(ByVal FileName As String, ByVal FileNameInZIP As String)
    Dim clsid   As UUID
    Dim iidSh   As UUID
    Dim shExt   As IShellExtInit
    Dim pf      As IPersistFolder2
    Dim pidl    As Long
    
    CLSIDFromString ZipFldrCLSID, clsid
    CLSIDFromString IID_IShellExtInit, iidSh
    
    If CoCreateInstance(clsid, Nothing, CLSCTX_INPROC_SERVER, iidSh, shExt) <> S_OK Then Exit Sub
    Set pf = shExt
    SHParseDisplayName StrPtr(FileName), 0, pidl, 0, 0
    pf.Initialize pidl
    ILFree pidl
    
    LoadPictureFileFromZIP pf, FileNameInZIP
End Sub
 
Private Sub LoadPictureFileFromZIP(IStorageInZIP As IStorage, ByVal FileNameInZIP As String, Optional PathFolder As String)
    Dim enm As IEnumSTATSTG
    Dim itm As STATSTG
    Dim nam As String
    Dim cb As Long
    Dim FileName As String
    Dim stm As IStream
    
    Set enm = IStorageInZIP.EnumElements
    
    enm.Reset
    Do While enm.Next(1, itm) = S_OK
        nam = SysAllocString(itm.pwcsName)
        CoTaskMemFree itm.pwcsName
        FileName = IIf(PathFolder <> "", PathFolder & "\" & nam, nam)
        
        If itm.Type = STGTY_STREAM Then
            If FileName = FileNameInZIP Then
                Set stm = IStorageInZIP.OpenStream(nam, 0, STGM_READ, 0)
                If itm.cbSize Then Picture1.Picture = LoadPictureFromStream(stm)
                Set stm = Nothing
            End If
        ElseIf itm.Type = STGTY_STORAGE Then
            LoadPictureFileFromZIP IStorageInZIP.OpenStorage(nam, 0, STGM_READ, 0, 0), FileNameInZIP, FileName
        End If
    Loop
End Sub
 
Private Sub Form_Load()
    Text1.Text = App.Path & "\test.docx"
    ReadingStructureZIP Text1.Text
    
    If List1.ListCount > 0 Then
        List1.Selected(0) = True
        Label1.Caption = "Count files: " & List1.ListCount
    End If
End Sub
 
Private Sub List1_Click()
    Dim tick As Long
    
    tick = GetTickCount
    LoadFileFromZIP Text1.Text, Mid$(List1.Text, 1, InStr(1, List1.Text, "    ") - 1)
    Label2.Caption = "ms: " & (GetTickCount - tick)
End Sub
 
Private Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then
        KeyAscii = 0
        
        List1.Clear
        ReadingStructureZIP Text1.Text
        
        If List1.ListCount > 0 Then
            List1.Selected(0) = True
            Label1.Caption = "Count files: " & List1.ListCount
            List1.SetFocus
        End If
    End If
End Sub
Миниатюры
Как программно узнать закончил ли ZIP свою работу?  
Вложения
Тип файла: zip Reading ZIP, DOCX, EXE and a preview of the pictures (2).zip (917.1 Кб, 2 просмотров)
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
25.02.2025, 02:38
С таким вот кодом по крайней мере теперь уж точно можно написать инсталятор, так как можно распаковывать файлы даже из своего EXE
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
25.02.2025, 13:52
Цитата Сообщение от HackerVlad Посмотреть сообщение
Да и плевать на эти возвращаемые значения.
Мда, с таким подходом тебе не программистом нужно быть.
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
25.02.2025, 14:48
Так работает же всё. Какова вероятность что будет не работать? Думаю, что меньше одного процента.

Добавлено через 1 минуту
Тем более я твой код переписывал изначально. Значит у тебя тоже ошибки, как ты говоришь, это же твой код, сам и не проверял возвращаемые значения значит, а теперь тебе вдруг захотелось что-то проверять зачем-то...

Добавлено через 2 минуты
Ну и плюс у каждого свой подход и свои взгляды на одни и те же вещи. Тебе вот нравится возиться с GetMem8 и младшими и старшими этими значениями а я не считаю это нужным.

Добавлено через 2 минуты
Когда пишешь много API проверять абсолютно каждую функцию на возвращаемые значения морока ещё та. А по факту если где-то вдруг что-то слетит, не так уж сильно-то и важно в конечном итоге проверил ты эти возвращаемые значения или нет.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
25.02.2025, 15:07
Цитата Сообщение от HackerVlad Посмотреть сообщение
Тем более я твой код переписывал изначально. Значит у тебя тоже ошибки, как ты говоришь, это же твой код, сам и не проверял возвращаемые значения значит, а теперь тебе вдруг захотелось что-то проверять зачем-то...
Читай внимательно:
Цитата Сообщение от The trick Посмотреть сообщение
Вот код (сырой) для извлечения всех файлов из архива (вложенные папки не извлекаются, т.к. тест). Все работает в одном потоке синхронно, функция завершается только после копирования.
Цитата Сообщение от HackerVlad Посмотреть сообщение
Так работает же всё. Какова вероятность что будет не работать? Думаю, что меньше одного процента.
Ничего не работает. Банально если указать несуществующий файл SHParseDisplayName съест и не подавится. Я уже написал как правильно делать.
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
25.02.2025, 21:45
Цитата Сообщение от The trick Посмотреть сообщение
Банально если указать несуществующий файл SHParseDisplayName съест и не подавится.
Кстати про этот баг я уже думал. Потом просто забыл про него. Чуть-чуть подлатать всё же придётся значит.

Добавлено через 18 минут
Хорошо, уговорил. Проверю возвращаемое значение SHParseDisplayName.
Тогда напишу так:

Visual Basic
1
If SHParseDisplayName(StrPtr(FileName), 0, pidl, 0, 0) <> S_OK Then Exit Sub
Вот эту одну строчку кода поменяю и всё, чтобы исключить ошибку когда файл не найден. Этого достаточно теперь. Всё.

Добавлено через 4 минуты
Теперь у меня зато код уже не сырой и вложенные папки извлекаются! Ура!

Добавлено через 4 минуты
Цитата Сообщение от The trick Посмотреть сообщение
Ничего не работает.
Всё работает.

Добавлено через 2 минуты
Цитата Сообщение от The trick Посмотреть сообщение
Ничего не работает.
Всё работает.

Добавлено через 1 час 47 минут
The trick, подскажи пожалуйста как установить атрибуты извлечённого из ZIP файла?
Структура STATSTG имеет только дату и время, но где взять атрибуты файла вообще?

Добавлено через 2 часа 27 минут
На основе этой технологии я почти, на 99%, написал само-распаковывающийся SFX-ZIP архив! Но на атрибутах у меня случился полный затык! Помогите!

Добавлено через 1 час 29 минут
The trick, кстати этот код (твой код) открывает только SFX exe если создавать спец. прогами для создания SFX ZIP если самому склеить EXE и ZIP или если склеить EXE и ZIP через твой класс для склейки EXE с любыми файлами то именно этот код тоже не увидит этот EXE как SFX не заглянет в него и не прочитает как ZIP. Интересно почему!? Чего-то не хватает!? Как пометить EXE как SFX для системы? Чтобы этот код распаковки из zipfldr.dll видел файл exe как zip?
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
25.02.2025, 21:53
Цитата Сообщение от HackerVlad Посмотреть сообщение
Чтобы этот код распаковки из zipfldr.dll видел файл exe как zip?
Не знаю, смотреть нужно. Возьми, создай 2 файла и глянь разницу.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
25.02.2025, 22:22
The trick, первый раз вижу чтобы ты что-то не знал) вот и я не знаю пытался сравнивать файлы в гексодах копался но пока всё тщетно.

Добавлено через 1 минуту
вот тут по этой статейке: https://pure-basic.narod.ru/ar... x_zip.html там создаётся на ПуреБейсике SFX exe и этот где видет как ZIP там какая-то скрытая магия непонятная, как пометить exe как sfx

Добавлено через 1 минуту
Как на VB6 создать такое EXE которое система будет воспринимать как SFX? Чтобы этим замечательным кодом из zipfldr.dll открывался файл как архив, вот понять не могу этого вообще...

Добавлено через 57 секунд
На ПуреБейсике работает всё почему-то...

Добавлено через 22 минуты
The trick, можно было бы и не заморчаиваться с этим вообще, если бы я мог например прочитать не из файла ZIp а из стрима! Можно ли этим кодом прочитать не из файла на диске а из памяти из стрима? или нельзя?
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
25.02.2025, 23:44
HackerVlad, блин там же элементарно просто глянуть разницу. Мне просто не нужно это.

Цитата Сообщение от HackerVlad Посмотреть сообщение
The trick, можно было бы и не заморчаиваться с этим вообще, если бы я мог например прочитать не из файла ZIp а из стрима! Можно ли этим кодом прочитать не из файла на диске а из памяти из стрима? или нельзя?
zipfldr - всегда использует диск. В ней используется Dynazip
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
26.02.2025, 00:11
The trick, я думал, что в EXE какая-то магия, оказывается нужно в сам ZIP-архив записывать адрес смещения, позицию когда заканчивается EXE файл и начинается ZIP-архив, просто пришлось несколько часов помучиться, так как в поиске ничего такого подобного просто не найдёшь даже с ходу.

Добавлено через 1 минуту
The trick, короче сам догадался сделал, всё работает, с атрибутами не поможешь? или там никак атрибуты не извлечь?
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
26.02.2025, 13:38
The trick, но этот код очень хороший, даже юникодные имена, на удивление, распаковывает спокойно - я проверил. Хрен с ним с атрибутами. Невозможно так невозможно. Fafalone сказал что никак нельзя короче. А по установке времени тоже есть чудо: работает только в семёрке. В XP время не видит вообще.

Добавлено через 2 минуты
Windows - это вообще странная штука. Упаковывать юникодные имена не хочет, а распаковывает спокойно... А упаковывать Total'ом приходится...

Добавлено через 13 минут
Короче придётся самому загружать ZIP в структуры, считывать атрибуты через копания в структуре ZIP и через CopyMemory ручным поиском внутри файла короче, по другому никак
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.02.2025, 13:38
Помогаю со студенческими работами здесь

Закончил ли свою работу animate, toggle
Вот к примеру есть код спойлера: var Spoiler = { showClass: 'plus', hideClass: 'minus', toggle: function(el) { var...

Как определить закончил ли работу поток?
Здравствуйте, как определить закончил ли работу поток? begin Potok1 := ParallelObj.Create(true); Potok2 :=...

Как узнать что WinSock закончил загрузку файла?
Здравствуйте! Наверняка, все кто начинали работать с winsock спрашивали о том-же, что и я сейчас хочу спросить. 1. Моя программа...

Как узнать, что клиет закончил отсылать пакеты?
Забиндил локалхост, посылаю на него пакеты последовательно одной секцией sequence number, после чего на стороне клиента завершаю...

Как сделать, чтобы один поток не закончил работу, пока второй работает?
Подскажите, есть например 2 потока, которые ну например отсчитывают в цикле до 100. Как сделать чтоб один не закончил работу пока второй...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Опции темы

Новые блоги и статьи
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru