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

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

11.10.2009, 19:26. Показов 12294. Ответов 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
1406 / 865 / 93
Регистрация: 08.02.2017
Сообщений: 3,694
Записей в блоге: 2
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
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
24.11.2024, 15:02
Цитата Сообщение от testuser2 Посмотреть сообщение
а Erl не работает, но я придумал lErr, который работает )
Я не знаю что это такое просто.
0
1406 / 865 / 93
Регистрация: 08.02.2017
Сообщений: 3,694
Записей в блоге: 2
24.11.2024, 15:02
Erl это встроенная функция, которая показывает последний пройденый номер строки, если есть пронумерованные строки
0
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
24.11.2024, 15:02
Ты считаешь что на этой строке кода накрылось? fci = FCICreate на этой да?
0
1406 / 865 / 93
Регистрация: 08.02.2017
Сообщений: 3,694
Записей в блоге: 2
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
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
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
1406 / 865 / 93
Регистрация: 08.02.2017
Сообщений: 3,694
Записей в блоге: 2
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
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
24.11.2024, 15:23
Да я сравнивал эту строку, в первой версии, и в версии 1.3 абсолютно одинаковое объявление API и абсолютно одинаковая строка вызова этой API. В версии 1.0 работает, а в версии 1.3 уже не хочет работать. Чудеса да и только.
0
1406 / 865 / 93
Регистрация: 08.02.2017
Сообщений: 3,694
Записей в блоге: 2
24.11.2024, 15:25
А структура ccab заполняется одинаково?
0
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
24.11.2024, 17:08
testuser2, по разному, но я пробовал уже заполнять по старому, тоже не помогло (хотя по старому заполнять не надо ибо там баг)

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

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

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

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

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

Добавлено через 1 минуту
И почему при этом работает в версии 1.0 тоже непонятно... Вроде всё одинакого же, уже сто раз всё проверил, даже переписал на встроенную функцию IsArrayInitialized, думал может из-за этого, всё равно не помогло. Как только я переписал функцию на массивы всё сразу перестало работать в Твине. Бред какой-то.
0
1406 / 865 / 93
Регистрация: 08.02.2017
Сообщений: 3,694
Записей в блоге: 2
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
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
24.11.2024, 17:49
Цитата Сообщение от testuser2 Посмотреть сообщение
Китаец молодец, ансишную тему поднял
да, он молодец, так ответь ему там

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

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

Добавлено через 1 минуту
Я уже кстати жаловался на это в Microsoft, нажимал пожаловаться на неполное описание, а толку!? им плевать я думаю.
1
1406 / 865 / 93
Регистрация: 08.02.2017
Сообщений: 3,694
Записей в блоге: 2
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
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
24.11.2024, 18:51
Цитата Сообщение от testuser2 Посмотреть сообщение
да есть IsArrayInitialized()
Прикинь, я тоже самое спросил у fafalone, думал кто первый ответит тот и ответит, а он сказал, что такой функции нет наверное! он не знал, а ты знал! вот прикол!

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

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

Добавлено через 31 секунду
В любом случае, это косяк Твина, а не мой косяк, чтобы мне искать что-то в коде и исправлять...
0
1406 / 865 / 93
Регистрация: 08.02.2017
Сообщений: 3,694
Записей в блоге: 2
24.11.2024, 18:57
Я в коде тоже кое-что исправлял, который x64 хоть он и рабочий у итальянца
0
Вернулся
 Аватар для HackerVlad
1751 / 647 / 45
Регистрация: 10.09.2021
Сообщений: 2,800
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
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru