С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/41: Рейтинг темы: голосов - 41, средняя оценка - 4.80
Вопрощающий

Создание (+распаковка) CAB архива

11.10.2009, 19:26. Показов 10765. Ответов 130

Студворк — интернет-сервис помощи студентам
Обращаясь к cabinet.dll, без использования *.exe
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.10.2009, 19:26
Ответы с готовыми решениями:

Создание архива
Есть такая строка .AddAttachment "C:\logfiles.rar" При выполнении кода на ней ошибка. Как создать программно этот архив?

Программное создание архива.
Добрый день! Можноли программно сделать архив, например, ZIP или rar, не важно и добавить в него файлы? Заранее спасибо.

Создание архива с паролем
Private Declare Sub Sleep Lib "kernel32" (ByVal milliseconds As Long) Private Declare Function OpenProcess Lib "Kernel32.dll" (ByVal...

130
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,516
Записей в блоге: 1
24.11.2024, 14:59
Студворк — интернет-сервис помощи студентам
Короче, похоже в этой строчке ошибка
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
    lErr = 15
    fci = FCICreate(erf, _
                    AddressOf fnFilePlaced, _
                    AddressOf fnAlloc, _
                    AddressOf fnFree, _
                    AddressOf fnOpen, _
                    AddressOf fnRead, _
                    AddressOf fnWrite, _
                    AddressOf fnClose, _
                    AddressOf fnSeek, _
                    AddressOf fnDelete, _
                    AddressOf fnFciGTF, _
                    VarPtr(ccab))
Цитата Сообщение от HackerVlad Посмотреть сообщение
А что такое Erl?
Да Erl не работает, но я придумал lErr, который работает )
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.11.2024, 15:02
Цитата Сообщение от testuser2 Посмотреть сообщение
а Erl не работает, но я придумал lErr, который работает )
Я не знаю что это такое просто.
0
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,516
Записей в блоге: 1
24.11.2024, 15:02
Erl это встроенная функция, которая показывает последний пройденый номер строки, если есть пронумерованные строки
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.11.2024, 15:02
Ты считаешь что на этой строке кода накрылось? fci = FCICreate на этой да?
0
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,516
Записей в блоге: 1
24.11.2024, 15:05
Чтоб было понятнее, как я нашел строку
Кликните здесь для просмотра всего текста
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
Public Function CabinetAddFiles(ByVal CabinetFullFileName As String, SourceFullFileNames As Variant, Optional DestFileNames As Variant, Optional CompressionMethod As cabCompressionMethod = cm_LZX21) As Boolean
    On Error GoTo errHdr
    Dim lErr&
    Dim ccab As TCCAB
    Dim erf As TERF
    Dim fci As LongPtr
    Dim CabinetName As String
    Dim CabinetPath As String
    Dim AnsiSourceFileName As String
    Dim AnsiExtractFileName As String
    Dim AnsiDestinationFileName As String
    Dim AnsiSourceFullFileNames() As String
    Dim AnsiDestFileNames() As String
    Dim DestFileNamesArrayInitialized As Boolean
    Dim i As Long
    lErr = 1
    If Len(CabinetFullFileName) = 0 Then Exit Function
    lErr = 2
    If IsArray(SourceFullFileNames) Then ' If it is an array
        lErr = 3
        If CabinetIsArrayInitialized(SourceFullFileNames) = True Then ' If the array is initialized
            lErr = 4
            For i = 0 To UBound(SourceFullFileNames)
                AnsiSourceFileName = StrConv(SourceFullFileNames(i), vbFromUnicode) ' Convert to ANSI
                
                If InStrB(1, AnsiSourceFileName, ChrB(&H3F)) > 0 Then
                    ' Cabinet.dll does not support unicode file names for packaging
                    Exit Function
                End If
                
                ' We copy the array, only the resulting array will contain the file names in ANSI encoding
                5:
                CabinetInsertArrayString AnsiSourceFullFileNames, AnsiSourceFileName
            Next
        Else
            Exit Function
        End If
    Else
        lErr = 6
        If VarType(SourceFullFileNames) = vbString Then
            If SourceFullFileNames <> vbNullString Then
                AnsiSourceFileName = StrConv(SourceFullFileNames, vbFromUnicode) ' Convert to ANSI
                
                If InStrB(1, AnsiSourceFileName, ChrB(&H3F)) > 0 Then
                    ' Cabinet.dll does not support unicode file names for packaging
                    Exit Function
                End If
                lErr = 7
                CabinetInsertArrayString AnsiSourceFullFileNames, AnsiSourceFileName ' There will be only one row in the array
            Else ' String not be empty
                Exit Function
            End If
        Else ' Data type error (not an array or a string)
            Exit Function
        End If
    End If
    
    If IsArray(DestFileNames) Then
    lErr = 8
        If CabinetIsArrayInitialized(SourceFullFileNames) = True Then ' If the array is initialized
            lErr = 9
            If UBound(SourceFullFileNames) <> UBound(DestFileNames) Then Exit Function ' The boundaries of the arrays do not match
            
            For i = 0 To UBound(DestFileNames)
                AnsiDestinationFileName = StrConv(DestFileNames(i), vbFromUnicode) ' Convert to ANSI
                
                If InStrB(1, AnsiDestinationFileName, ChrB(&H3F)) > 0 Then
                    ' Cabinet.dll does not support unicode file names for packaging
                    Exit Function
                End If
                10:
                ' We copy the array, only the resulting array will contain the file names in ANSI encoding
                CabinetInsertArrayString AnsiDestFileNames, AnsiDestinationFileName
            Next
            
            DestFileNamesArrayInitialized = True
        End If
    Else
        If VarType(DestFileNames) = vbString Then
            If DestFileNames <> vbNullString Then
                AnsiDestinationFileName = StrConv(DestFileNames, vbFromUnicode) ' Convert to ANSI
                
                If InStrB(1, AnsiDestinationFileName, ChrB(&H3F)) > 0 Then
                    ' Cabinet.dll does not support unicode file names for packaging
                    Exit Function
                End If
                lErr = 10
                CabinetInsertArrayString AnsiDestFileNames, AnsiDestinationFileName ' There will be only one row in the array
                DestFileNamesArrayInitialized = True
            End If
        End If
    End If
    lErr = 11
    ' First of all, you need to take the FullFileName of the future archive and extract the folder path and file name from it
    CabinetName = StrConv(CabinetExtractFileName(CabinetFullFileName), vbFromUnicode) ' Convert to ANSI
    lErr = 12
    CabinetPath = StrConv(CabinetExtractFilePath(CabinetFullFileName), vbFromUnicode) ' Convert to ANSI
    
    ' Define structure values (rewriting from MSDN: https://learn.microsoft.com/ru-ru/windows/win32/devnotes/creating-a-cabinet)
    ccab.cb = &H7FFFFFFF ' The maximum size, in bytes, of a cabinet created by FCI
    ccab.cbFolderThresh = &H7FFFFFFF ' Important! If this is not written, then the old versions of the CAB archivers will read the archive incorrectly
    ccab.setID = 555
    ccab.iCab = 1
    ccab.iDisk = 0
    lErr = 13
    CopyMemory VarPtr(ccab.setID) + 2 + 256, StrPtr(CabinetName), LenB(CabinetName) ' ccab.szCab = CabinetName
    lErr = 14
    CopyMemory VarPtr(ccab.setID) + 2 + 512, StrPtr(CabinetPath), LenB(CabinetPath) ' ccab.szCabPath = CabinetPath
    cabFileName = CabinetFullFileName ' Remember the FileName of the future archive
    lErr = 15
    fci = FCICreate(erf, _
                    AddressOf fnFilePlaced, _
                    AddressOf fnAlloc, _
                    AddressOf fnFree, _
                    AddressOf fnOpen, _
                    AddressOf fnRead, _
                    AddressOf fnWrite, _
                    AddressOf fnClose, _
                    AddressOf fnSeek, _
                    AddressOf fnDelete, _
                    AddressOf fnFciGTF, _
                    VarPtr(ccab))
    
    If fci <> 0 Then
        For i = 0 To UBound(AnsiSourceFullFileNames)
            lErr = 16
            AnsiSourceFileName = AnsiSourceFullFileNames(i)
            If DestFileNamesArrayInitialized = True Then
                AnsiExtractFileName = AnsiDestFileNames(i)
            Else
                If IsArray(SourceFullFileNames) Then ' If it is an array
                    AnsiExtractFileName = StrConv(CabinetExtractFileName(SourceFullFileNames(i)), vbFromUnicode) ' Convert to ANSI
                Else
                    AnsiExtractFileName = StrConv(CabinetExtractFileName(SourceFullFileNames), vbFromUnicode) ' Convert to ANSI
                End If
            End If
            lErr = 17
            FCIAddFile fci, _
                       StrPtr(AnsiSourceFileName), _
                       StrPtr(AnsiExtractFileName), _
                       0, _
                       AddressOf fnGetNextCabinet, _
                       AddressOf fnStatus, _
                       AddressOf fnOpenInfo, _
                       CompressionMethod
        Next
        lErr = 18
        If FCIFlushCabinet(fci, cFalse, AddressOf fnGetNextCabinet, AddressOf fnStatus) = cTrue Then
            CabinetAddFiles = True
        End If
        lErr = 19
        FCIDestroy fci
    End If
    
    cabFileName = vbNullString
Exit Function
ErrHdr:
    MsgBox "Ошибка в функции: CabinetAddFiles" & vbCr & Err.Description & vbCr & "Строка: " & lErr 'Erl
End Function
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.11.2024, 15:15
Я только что проверил версию 1.0 моего модуля там работает нормально в EXE. Значит проблема в каких-то моих новых изменениях....

Добавлено через 1 минуту
Цитата Сообщение от testuser2 Посмотреть сообщение
For i = 0 To UBound(AnsiSourceFullFileNames)
А мне кажется в этой строке ошибка. Так как это было моё нововведение после версии 1.0.

Добавлено через 4 минуты
testuser2, хотя ты был прав: посыпалось на этой строке кода: fci = FCICreate(erf, AddressOf fnFilePlaced, AddressOf fnAlloc, AddressOf fnFree, AddressOf fnOpen, AddressOf fnRead, AddressOf fnWrite, AddressOf fnClose, AddressOf fnSeek, AddressOf fnDelete, AddressOf fnFciGTF, VarPtr(ccab))

Добавлено через 1 минуту
Хотя это ни чем не отличается от такой же строки кода в версии 1.0 там всё работает. Что за чудеса!?

Добавлено через 2 минуты
И объявление абсолютно одинаковое...
0
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,516
Записей в блоге: 1
24.11.2024, 15:20
там ccab должно передаваться ByRef, следовательно должно быть просто ccab, а не varptr(ccab) или ByVal VarPtr(ccab), хотя я исправил, но ошибка повторилась

Добавлено через 59 секунд
Сравни с первой версией
Visual Basic
1
    Private Declare PtrSafe Function FCICreate CDecl Lib "cabinet.dll" (perf As TERF, ByVal pfnfcifp As LongPtr, ByVal pfna As LongPtr, ByVal pfnf As LongPtr, ByVal pfnopen As LongPtr, ByVal pfnread As LongPtr, ByVal pfnwrite As LongPtr, ByVal pfnclose As LongPtr, ByVal pfnseek As LongPtr, ByVal pfndelete As LongPtr, ByVal pfnfcigtf As LongPtr, pccab As TCCAB, Optional ByVal pv As LongPtr) As LongPtr
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.11.2024, 15:23
Да я сравнивал эту строку, в первой версии, и в версии 1.3 абсолютно одинаковое объявление API и абсолютно одинаковая строка вызова этой API. В версии 1.0 работает, а в версии 1.3 уже не хочет работать. Чудеса да и только.
0
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,516
Записей в блоге: 1
24.11.2024, 15:25
А структура ccab заполняется одинаково?
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.11.2024, 17:08
testuser2, по разному, но я пробовал уже заполнять по старому, тоже не помогло (хотя по старому заполнять не надо ибо там баг)

Добавлено через 1 минуту
Ладно, сейчас ещё проверю в версии 1.1 будет ли работать

Добавлено через 3 минуты
В версии 1.1 уже перестало работать, когда я перешёл на списки файлов.

Добавлено через 36 секунд
Это непонятное чудо.

Добавлено через 39 минут
Ну вот как, после этого, программировать на TwinBasic, если в ТвинБейсике такие баги непонятные!? что в IDE работает, а в EXE уже не работает...

Добавлено через 52 минуты
testuser2, а есть ли в TwinBasic встроенная функция проверки инициализирован ли массив?
0
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,516
Записей в блоге: 1
24.11.2024, 17:09
Цитата Сообщение от HackerVlad Посмотреть сообщение
а есть ли в TwinBasic встроенная функция проверки инициализирован ли массив?
да есть IsArrayInitialized()
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.11.2024, 17:26
Кстати я тут прочитал вроде как CAB должен поддерживать имена файлов в кодировке UTF-8 оказывается... Можно будет потом попробовать засунуть в ANSI'шную строку UTF-8 строку и посмотреть будет ли это работать...
0
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,516
Записей в блоге: 1
24.11.2024, 17:31
Китаец молодец, ансишную тему поднял
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.11.2024, 17:42
Но почему не работает EXE осталось до сих пор загадкой, за целый день я так и не понял этого

Добавлено через 1 минуту
И почему при этом работает в версии 1.0 тоже непонятно... Вроде всё одинакого же, уже сто раз всё проверил, даже переписал на встроенную функцию IsArrayInitialized, думал может из-за этого, всё равно не помогло. Как только я переписал функцию на массивы всё сразу перестало работать в Твине. Бред какой-то.
0
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,516
Записей в блоге: 1
24.11.2024, 17:42
Здесь странно
Visual Basic
1
2
3
4
5
6
' 3. Opening a file (stream)
' Description of the macro: https://learn.microsoft.com/en-us/windows/win32/api/fdi/nf-fdi-fnopen
' Delphi: function fnOpen(pszFile: PAnsiChar; oflag: Integer; pmode: Integer; err: PInteger; pv: Pointer): Integer; cdecl;
 
Private Function fnOpen CDecl(ByVal pszFile As LongPtr, ByVal oFlag As Long, ByVal pMode As Long, ByRef ErrNo As Long, ByVal pv As LongPtr) As LongPtr
    If oFlag <> &H8302& Then ' Hack
Функция должна быть с одним аргументом вроде, причем не функция а процедура
Visual Basic
1
2
3
void FNOPEN(
  [in]  fn
);
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.11.2024, 17:49
Цитата Сообщение от testuser2 Посмотреть сообщение
Китаец молодец, ансишную тему поднял
да, он молодец, так ответь ему там

Добавлено через 1 минуту
Цитата Сообщение от testuser2 Посмотреть сообщение
Функция должна быть с одним аргументом вроде
У них не правильно. У них в описании НИГДЕ нет описаний всех параметров...

Добавлено через 2 минуты
testuser2, для любого макроса у них нет описаний нормальных. Microsoft очень плохо описали. Прям самому мне неприятно смотреть на их неправильное и не полное описание. Ты там любой макрос открой например fnRead будет тоже самое как буд-то это процедура можно подумать без множества параметров...

Добавлено через 1 минуту
Я уже кстати жаловался на это в Microsoft, нажимал пожаловаться на неполное описание, а толку!? им плевать я думаю.
1
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,516
Записей в блоге: 1
24.11.2024, 17:58
В fdi.h тоже все отличается

Добавлено через 27 секунд
C++
1
2
3
4
5
#define FNOPEN(fn) INT_PTR DIAMONDAPI fn(char *pszFile,int oflag,int pmode)
#define FNREAD(fn) UINT DIAMONDAPI fn(INT_PTR hf,void *pv,UINT cb)
#define FNWRITE(fn) UINT DIAMONDAPI fn(INT_PTR hf,void *pv,UINT cb)
#define FNCLOSE(fn) int DIAMONDAPI fn(INT_PTR hf)
#define FNSEEK(fn) __LONG32 DIAMONDAPI fn(INT_PTR hf,__LONG32 dist,int seektype)
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.11.2024, 18:51
Цитата Сообщение от testuser2 Посмотреть сообщение
да есть IsArrayInitialized()
Прикинь, я тоже самое спросил у fafalone, думал кто первый ответит тот и ответит, а он сказал, что такой функции нет наверное! он не знал, а ты знал! вот прикол!

Добавлено через 1 минуту
Но он говорит, что в Windows 10 у него работает EXE этот, а у нас с тобой не работает в Windows 7 и Windows 8

Добавлено через 26 секунд
Фафалон так же сказал, что отправит багрепорт разработчикам что в семёрке не фурычит чё-то там

Добавлено через 31 секунду
В любом случае, это косяк Твина, а не мой косяк, чтобы мне искать что-то в коде и исправлять...
0
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,516
Записей в блоге: 1
24.11.2024, 18:57
Я в коде тоже кое-что исправлял, который x64 хоть он и рабочий у итальянца
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.11.2024, 19:02
Что за итальянец
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.11.2024, 19:02
Помогаю со студенческими работами здесь

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

Распаковка архива rar без сохранения файла во временную папку
В архиве rar хранится сжатый (с паролем) файл txt, как его распаковать (пароль известен) чтобы файл не записывался на диск, а содержимому...

Создание архива с паролем средствами PB. Возможно?
Есть ли какая то библиотека что позволяет запихнуть PB кодом файлы в архив с паролем? Ну и соответственно извлекать из архива. Спасибо.

Создание cab архива
Здравствуйте! Помогите реализовать код создания cab архива с помощью CabinetAPI Код из msdn не получается скомпилировать, не понимаю...

Создание папки с датой в имени и распаковка в неё архива
Есть папка на диске С:\Arhiv в нем есть архивы по датам! надо что бы брал самый последний архив по дате и распаковывал в корень С:\Arhiv\...


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru