Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 3.00/2: Рейтинг темы: голосов - 2, средняя оценка - 3.00
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19

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

25.02.2014, 11:19. Показов 13373. Ответов 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
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
18.02.2025, 14:59
Студворк — интернет-сервис помощи студентам
The trick, да, я помню эти разрозненные куски кода, которые непонятно как заставить работать. Что такое As CZIPStreams например и где его брать вообще непонятно. Я думал есть класс (файл .cls) или модуль (файл .bas) нету такого?
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.02.2025, 17:56
Как можно давать код который не работает вот что такое CZIPStreams и где его брать непонятно вообще.

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

Добавлено через 3 минуты
The trick, просто ты рекламировал что у тебя будет класс для работы с zipfldr.dll, а в итоге этого класса нету
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
24.02.2025, 18:21
Цитата Сообщение от HackerVlad Посмотреть сообщение
The trick, просто ты рекламировал что у тебя будет класс для работы с zipfldr.dll, а в итоге этого класса нету
Из-за тех ньюансов о которых писал этого кода и нету. А полурабочий код выкладывать не вижу смысла. Проведя исследование кучи библиотек на разных системах в итоге я бы сделал как в 1-м варианте который тут опубликовал (с отслеживанием потоков), только определял поток по функции обратного вызова. Этот вариант будет работать на всех системах. Тот код с CZIPStreams был из одного проекта который гарантирнованно работает на WIN10 и был написан на заказ где и работает.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
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
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
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
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
25.02.2025, 00:07
HackerVlad, ошибок много. Не проверяются возвращаемые значения, нет валидации размера. Вот тут все это сделано.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
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
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
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
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
25.02.2025, 02:38
С таким вот кодом по крайней мере теперь уж точно можно написать инсталятор, так как можно распаковывать файлы даже из своего EXE
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
25.02.2025, 13:52
Цитата Сообщение от HackerVlad Посмотреть сообщение
Да и плевать на эти возвращаемые значения.
Мда, с таким подходом тебе не программистом нужно быть.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
25.02.2025, 14:48
Так работает же всё. Какова вероятность что будет не работать? Думаю, что меньше одного процента.

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

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

Добавлено через 2 минуты
Когда пишешь много API проверять абсолютно каждую функцию на возвращаемые значения морока ещё та. А по факту если где-то вдруг что-то слетит, не так уж сильно-то и важно в конечном итоге проверил ты эти возвращаемые значения или нет.
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
25.02.2025, 15:07
Цитата Сообщение от HackerVlad Посмотреть сообщение
Тем более я твой код переписывал изначально. Значит у тебя тоже ошибки, как ты говоришь, это же твой код, сам и не проверял возвращаемые значения значит, а теперь тебе вдруг захотелось что-то проверять зачем-то...
Читай внимательно:
Цитата Сообщение от The trick Посмотреть сообщение
Вот код (сырой) для извлечения всех файлов из архива (вложенные папки не извлекаются, т.к. тест). Все работает в одном потоке синхронно, функция завершается только после копирования.
Цитата Сообщение от HackerVlad Посмотреть сообщение
Так работает же всё. Какова вероятность что будет не работать? Думаю, что меньше одного процента.
Ничего не работает. Банально если указать несуществующий файл SHParseDisplayName съест и не подавится. Я уже написал как правильно делать.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
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
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
25.02.2025, 21:53
Цитата Сообщение от HackerVlad Посмотреть сообщение
Чтобы этот код распаковки из zipfldr.dll видел файл exe как zip?
Не знаю, смотреть нужно. Возьми, создай 2 файла и глянь разницу.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
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
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
25.02.2025, 23:44
HackerVlad, блин там же элементарно просто глянуть разницу. Мне просто не нужно это.

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

Добавлено через 1 минуту
The trick, короче сам догадался сделал, всё работает, с атрибутами не поможешь? или там никак атрибуты не извлечь?
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru