Страница: 1 |
|
Вопрос: Работа с 7-Zip.dll
|
Добавлено: 23.08.08 22:07
|
|
Автор вопроса: Alex
|
Вот задумал на Visual Basic написать простенький архиватор с использованием библиотеки 7-Zip.dll. Так вот вопрос... Есть ли у кого-нибудь пример работы с этой библиотекой? Ну или описание её API функций? В google ничего конкретного не нашел.
Ответить
|
Номер ответа: 9 Автор ответа: Father
Вопросов: 0 Ответов: 159
|
Профиль | | #9
|
Добавлено: 05.01.09 19:48
|
По правде, лень вникать в библу, которую я, например, первый раз увидел после Ну отзовитесь, хоть кто то.
Ладно, давай, для затравки:
- Option Explicit
- Private Declare Function SevenZip Lib "C:\bardak\7-zip32.dll" (ByVal hwnd As Long, ByVal szCmdLine As Long, ByVal szOutput As Long, ByVal dwSize As Long) As Long
-
- Private Sub Form_Load()
- Dim cmd() As Byte
- cmd() = StrConv("a C:\bardak\dummy.7z -ms", vbFromUnicode)
- Call SevenZip(Me.hwnd, VarPtr(cmd(0)), 0, 0)
- End Sub
Думаю, если есть документация к длл, то разобраться можно.
Ответить
|
Номер ответа: 10 Автор ответа: Monah
Вопросов: 0 Ответов: 9
|
Профиль | | #10
|
Добавлено: 09.01.09 18:40
|
Спасибо, что отозвался хоть кто-то.
Да вот только у меня ничего не вышло. Я понимаю, что у специалистов нет времени объяснять новичкам всё. Код действительно обьяснил принцип работы библиотеки, да только результата нет.
Я прошу, ещё раз. Кто может помочь новичку, дайте не только основную часть программы, но и всё, что там надо объявить перед выполнением приведённых операторов.
Относительно выше излоденого, у меня вышли такие ошибки:
cmd()
- Ошибка 1 Число индексов меньше числа измерений индексированного массива.
Нет слов.
vbFromUnicode
- Ошибка 2 Имя "vbFromUnicode" не объявлено.
Обявлю, и что потом с этим делать ?
Очень беспокоит это:
Me.hwnd
- Ошибка 3 "hwnd" не является членом "WindowsApplication1.Form1".
Ну не является и что, там этих "hwnd" около 10 штук в разных классах?
VarPtr
в строчке
VarPtr(cmd(0)
- Ошибка 4 Имя "VarPtr" не объявлено.
Допустим, эту проблему я и сам решу, а вот что потом программа с этим делает?
+ + +
После попытки подправить код самому, вот что у меня вышло:
-
- Public Class Form1
-
- Private Declare Function SevenZip Lib "C:\1\7-zip32.dll" (ByVal hwnd As Long, ByVal szCmdLine As Long, ByVal szOutput As Long, ByVal dwSize As Long) As Long
-
- Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
- Call SevenZip(0, "a C:\1\dummy.7z -ms", 0, 0)
- End Sub
- End Class
А точнее не вышло, вот ошибка:
System.InvalidCastException не обработано
Message="Приведение строки "a C:\1\dummy.7z -ms" к типу "Long" является недопустимым."
Source="Microsoft.VisualBasic"
++++++++
Я понимаю, у вас работа и всё такое, может я не туда обратился?
Дайте ссылку на место, где может мне помогут.
Простите, что я тут мусорю.
Ответить
|
Номер ответа: 13 Автор ответа: Father
Вопросов: 0 Ответов: 159
|
Профиль | | #13
|
Добавлено: 10.01.09 11:07
|
Вот такая болванка:
- Public Class Form1
- Inherits System.Windows.Forms.Form
-
-
- Private Const sArh As String = "C:\bardak\MYSEVEN.7z"
- Private Const FNAME_MAX32 = 512
- Private Const MAX_PATH = 260
-
- Private Structure EXTRACTINGINFO
- Dim dwFileSize As Integer
- Dim dwWriteSize As Integer
- <VBFixedString(FNAME_MAX32 + 1), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=FNAME_MAX32 + 1)> _
- Dim szSourceFileName As String
- Dim dummy11 As Byte
- Dim dummy12 As Byte
- Dim dummy13 As Byte
- <VBFixedString(FNAME_MAX32 + 1), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=FNAME_MAX32 + 1)> _
- Dim szDestFileName As String
- Dim dummy21 As Byte
- Dim dummy22 As Byte
- Dim dummy23 As Byte
- End Structure
-
- Private Delegate Function APC(ByVal hwnd As Integer, ByVal uMsg As Integer, ByVal nState As Integer, ByVal lpEis As IntPtr) As Integer
- Private Declare Function SevenZip Lib "C:\bardak\7-zip32.dll" (ByVal hwnd As IntPtr, ByVal szCmdLine As String, ByVal szOutput As Integer, ByVal dwSize As Integer) As Integer
- Private Declare Function SevenZipSetOwnerWindowEx Lib "C:\bardak\7-zip32.dll" (ByVal hwnd As Integer, ByVal lpArcProc As APC) As Integer
- Private Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Int32
- Private Declare Function CreateDirectory Lib "kernel32" Alias "CreateDirectoryA" (ByVal lpPathName As String, ByVal lpSecurityAttributes As Integer) As Integer
- Private Declare Function GetFileTitle Lib "comdlg32.dll" Alias "GetFileTitleA" (ByVal lpszFile As String, ByVal lpszTitle As System.Text.StringBuilder, ByVal cbBuf As Integer) As Integer
-
-
- Public bContinue As Boolean
-
- Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
- If bContinue Then e.Cancel = True
- bContinue = False
- End Sub
-
-
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- If bContinue Then Exit Sub
- Dim OFdlg As New System.Windows.Forms.OpenFileDialog
- If OFdlg.ShowDialog(Me) <> DialogResult.OK Then Exit Sub
- Dim sfile As String = OFdlg.FileName()
- bContinue = True
- Dim bb As Boolean = ToSeven(sfile, sArh, False)
- bContinue = False
- End Sub
-
-
- Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
- If bContinue Then Exit Sub
- Dim FBdlg As New System.Windows.Forms.FolderBrowserDialog
- If FBdlg.ShowDialog(Me) <> DialogResult.OK Then Exit Sub
- Dim sdir As String = FBdlg.SelectedPath()
- bContinue = True
- FromSeven(sdir, sArh, False)
- bContinue = False
- End Sub
-
-
-
-
-
-
-
- Private Function ToSeven(ByVal sfile As String, ByVal seven As String, ByVal bkgnd As Boolean) As Boolean
- Dim shortfile As New System.Text.StringBuilder(MAX_PATH)
- GetFileTitle(seven, shortfile, MAX_PATH)
- CreateDirectory(seven.Substring(0, seven.Length - shortfile.ToString.Length), 0)
- SetCurrentDirectory(sfile)
- GetFileTitle(sfile, shortfile, MAX_PATH)
- Dim comstr As String = "a " & Chr(34) & seven & Chr(34) & IIf(bkgnd, " -hide", vbNullString) & " -i!" & Chr(34) & shortfile.ToString & Chr(34)
- Debug.WriteLine(comstr)
- If bkgnd Then SevenZipSetOwnerWindowEx(0, AddressOf ArhiveProc)
- Return Not CBool(SevenZip(Me.Handle, comstr, 0, 0))
- End Function
-
-
-
-
-
-
-
- Private Function FromSeven(ByVal sdir As String, ByVal seven As String, ByVal bkgnd As Boolean) As Boolean
- CreateDirectory(sdir, 0)
- SetCurrentDirectory(sdir)
- Dim comstr As String = "x " & Chr(34) & seven & Chr(34) & IIf(bkgnd, " -hide", vbNullString)
- Debug.WriteLine(comstr)
- If bkgnd Then SevenZipSetOwnerWindowEx(0, AddressOf ArhiveProc)
- Return Not CBool(SevenZip(Me.Handle, comstr, 0, 0))
- End Function
-
-
- Private Function ArhiveProc(ByVal hwnd As Integer, ByVal uMsg As Integer, ByVal nState As Integer, ByVal lpEis As IntPtr) As Integer
-
- Select Case nState
- Case 0
- Case 1
- Case 3
- End Select
- ArhiveProc = bContinue
- End Function
- End Class
Ответить
|
Номер ответа: 14 Автор ответа: CTFMoN
Вопросов: 0 Ответов: 1
|
Профиль | | #14
|
Добавлено: 25.03.09 22:37
|
Помогите, пожалуйста, кто может! Передо мной стоит задача получить список файлов и папок архива 7z. Проблема состоит в использовании функции - SevenZipFindFirst Lib "7-zip32.dll" (hArc As Long, szWildName As String, lpSubInfo As INDIVIDUALINFO)
Вот, что я делаю:
- Private Declare Function SevenZipGetFileCount Lib "7-zip32.dll" (ByVal szArcFile As String) As Long
- Private Declare Function SevenZipOpenArchive Lib "7-zip32.dll" (ByVal hwnd As Long, ByVal szFileName As String, ByVal dwMode As Long) As Long
- Private Declare Function SevenZipCloseArchive Lib "7-zip32.dll" (ByVal hArc As Long) As Long
- Private Declare Function SevenZipFindFirst Lib "7-zip32.dll" (hArc As Long, szWildName As String, lpSubInfo As INDIVIDUALINFO)
-
- Private Type INDIVIDUALINFO
- dwOriginalSize As Long
- dwCompressedSize As Long
- dwCRC As Long
- uFlag As Long
- uOSType As Long
- wRatio As Long
- wDate As Long
- wTime As Long
- szFileName As String
- dummy1 As String
- szAttribute As String
- szMode As String
- End Type
-
- Private Sub Form_Load()
- Dim hArc As Long
- Dim lpInfo As INDIVIDUALINFO
- hArc = SevenZipOpenArchive(Me.hwnd, "d:\test.7z", 0)
- ret = SevenZipFindFirst(hArc, "*.*", lpInfo)
- MsgBox ret
- ret = SevenZipCloseArchive(hArc)
- End Sub
Ошибка выбивает при вызове функции SevenZipFindFirst “Bad DLL calling convention”
Думаю, что нужно lpInfo передавать как-то по-другому, но как? И ещё один вопрос: что нужно подставлять вместо szWildName чтобы получить все имена файлов и папок архива?
Пожалуйста, помогите разобраться! Заранее благодарю. (код написан на VB6)
Ответить
|
Страница: 1 |
Поиск по форуму