Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Работа с 7-Zip.dll Добавлено: 23.08.08 22:07  

Автор вопроса:  Alex
Вот задумал на Visual Basic написать простенький архиватор с использованием библиотеки 7-Zip.dll. Так вот вопрос... Есть ли у кого-нибудь пример работы с этой библиотекой? Ну или описание её API функций? В google ничего конкретного не нашел.

Ответить

  Ответы Всего ответов: 14  

Номер ответа: 1
Автор ответа:
 Alex



Вопросов: 1
Ответов: 2
 Профиль | | #1 Добавлено: 23.08.08 22:10
Если точнее с библиотекой 7-zip32.dll

Ответить

Номер ответа: 2
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #2 Добавлено: 23.08.08 22:11
http://www.7-zip.org/sdk.html

Ответить

Номер ответа: 3
Автор ответа:
 Alex



Вопросов: 1
Ответов: 2
 Профиль | | #3 Добавлено: 24.08.08 22:31
Нет, не то. Библиотека 7-zip32.dll сделана сторонним разработчиком. После долгих поисков я всё-таки нашел что искал. Вот здесь описание API функций:
http://www.csdinc.co.jp/archiver/lib/7-zip32api-en.zip

Ответить

Номер ответа: 4
Автор ответа:
 Monah



Вопросов: 0
Ответов: 9
 Профиль | | #4 Добавлено: 01.01.09 22:23
Я хочу написать инсталятор архивов, и мне нужно работать с 7z. поделитесь кодом, и если можете, то помогите новичку.
Я ни разу не подключал библиотеку, и не работал с ней.
Связь со мной по мылу:
_fix@i.ua

Ответить

Номер ответа: 5
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #5
Добавлено: 01.01.09 22:41
Хм... интересно, а что такое "инсталятор архивов", кто нить знает?

Ответить

Номер ответа: 6
Автор ответа:
 Фенягz



ICQ: 387437448 

Вопросов: 7
Ответов: 202
 Web-сайт: atauenis.narod.ru/
 Профиль | | #6
Добавлено: 02.01.09 03:01
Хм... интересно, а что такое "инсталятор архивов", кто нить знает?

SFX наверное имел ввиду Монах. ;)

Ответить

Номер ответа: 7
Автор ответа:
 Monah



Вопросов: 0
Ответов: 9
 Профиль | | #7 Добавлено: 03.01.09 19:47
ДА, согласен, не совсем правильно выразился.

Проблемма такая:
Есть 12 архивов. Я хочу сделать программу, в которой указывалось бы папка в которую надо эти архивы распаковать, и по нажатию кнопки "распаковать" процесс бы пошёл.

Но. Я понимаю, что с помощью командной строки это сделать можно, да ещё при этом появится окно с полосой выполнения к каждому файлу.
А мне хочется, что бы только в моей программе была информация про процесс установки.

Пожалуйста, помогите новичку.

Ответить

Номер ответа: 8
Автор ответа:
 Monah



Вопросов: 0
Ответов: 9
 Профиль | | #8 Добавлено: 05.01.09 16:16
Просто раскажите, как подключать библиотеку, и как ей пользоватся.
В идеале, - пример (исходный код) рабочей программы.

Ну отзовитесь, хоть кто то.

Ответить

Номер ответа: 9
Автор ответа:
 Father



Вопросов: 0
Ответов: 159
 Профиль | | #9 Добавлено: 05.01.09 19:48
По правде, лень вникать в библу, которую я, например, первый раз увидел после
Ну отзовитесь, хоть кто то.

Ладно, давай, для затравки:
  1. Option Explicit
  2. 'int WINAPI SevenZip(const HWND _hwnd, LPCSTR _szCmdLine,LPSTR _szOutput, const DWORD _dwSize)
  3. 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
  4.  
  5. Private Sub Form_Load()
  6. Dim cmd() As Byte
  7. cmd() = StrConv("a C:\bardak\dummy.7z -ms", vbFromUnicode)
  8. Call SevenZip(Me.hwnd, VarPtr(cmd(0)), 0, 0) 'создает архив dummy.7z в папке C:\bardak и добавляет в него все файлы из этой же папки
  9. 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" не объявлено.
Допустим, эту проблему я и сам решу, а вот что потом программа с этим делает?

+ + +
После попытки подправить код самому, вот что у меня вышло:

  1. Public Class Form1
  2.  
  3.     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
  4.  
  5.     Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  6.         Call SevenZip(0, "a C:\1\dummy.7z -ms", 0, 0) 'создает архив dummy.7z в папке C:\1\ и добавляет в него все файлы из этой же папки
  7.     End Sub
  8. End Class


А точнее не вышло, вот ошибка:

System.InvalidCastException не обработано
  Message="Приведение строки "a C:\1\dummy.7z -ms" к типу "Long" является недопустимым."
  Source="Microsoft.VisualBasic"

++++++++
Я понимаю, у вас работа и всё такое, может я не туда обратился?
Дайте ссылку на место, где может мне помогут.
Простите, что я тут мусорю.

Ответить

Номер ответа: 11
Автор ответа:
 Father



Вопросов: 0
Ответов: 159
 Профиль | | #11 Добавлено: 09.01.09 20:36
Не извиняйся, нормальные вопросы.
Приведенный мной код для VB6.
Если будет время в ближайшие пару дней, напишу пример в vb.net.
Кстати, библиотека интересная.

Ответить

Номер ответа: 12
Автор ответа:
 Monah



Вопросов: 0
Ответов: 9
 Профиль | | #12 Добавлено: 09.01.09 21:39
Ну хоть что-то приятное.
Если будет интернет, буду чаще заходить.

Ответить

Номер ответа: 13
Автор ответа:
 Father



Вопросов: 0
Ответов: 159
 Профиль | | #13 Добавлено: 10.01.09 11:07
Вот такая болванка:
  1. Public Class Form1
  2.     Inherits System.Windows.Forms.Form
  3.     'в дизайне кинуть две кнопки
  4.     'используется один фиксированный файл архива для упрощения
  5.     Private Const sArh As String = "C:\bardak\MYSEVEN.7z"
  6.     Private Const FNAME_MAX32 = 512
  7.     Private Const MAX_PATH = 260
  8.  
  9.     Private Structure EXTRACTINGINFO
  10.         Dim dwFileSize As Integer
  11.         Dim dwWriteSize As Integer
  12.         <VBFixedString(FNAME_MAX32 + 1), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=FNAME_MAX32 + 1)> _
  13.         Dim szSourceFileName As String
  14.         Dim dummy11 As Byte
  15.         Dim dummy12 As Byte
  16.         Dim dummy13 As Byte
  17.         <VBFixedString(FNAME_MAX32 + 1), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=FNAME_MAX32 + 1)> _
  18.         Dim szDestFileName As String
  19.         Dim dummy21 As Byte
  20.         Dim dummy22 As Byte
  21.         Dim dummy23 As Byte
  22.     End Structure
  23.  
  24.     Private Delegate Function APC(ByVal hwnd As Integer, ByVal uMsg As Integer, ByVal nState As Integer, ByVal lpEis As IntPtr) As Integer
  25.     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
  26.     Private Declare Function SevenZipSetOwnerWindowEx Lib "C:\bardak\7-zip32.dll" (ByVal hwnd As Integer, ByVal lpArcProc As APC) As Integer
  27.     Private Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Int32
  28.     Private Declare Function CreateDirectory Lib "kernel32" Alias "CreateDirectoryA" (ByVal lpPathName As String, ByVal lpSecurityAttributes As Integer) As Integer
  29.     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
  30.  
  31.     'флаг остановки в режиме callback, false - выход, true - продолжить
  32.     Public bContinue As Boolean
  33.  
  34.     Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
  35.         If bContinue Then e.Cancel = True
  36.         bContinue = False ' stop callback
  37.     End Sub
  38.  
  39.     'добавить в архив
  40.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  41.         If bContinue Then Exit Sub
  42.         Dim OFdlg As New System.Windows.Forms.OpenFileDialog
  43.         If OFdlg.ShowDialog(Me) <> DialogResult.OK Then Exit Sub
  44.         Dim sfile As String = OFdlg.FileName()
  45.         bContinue = True
  46.         Dim bb As Boolean = ToSeven(sfile, sArh, False)
  47.         bContinue = False
  48.     End Sub
  49.  
  50.     'извлечь из архива
  51.     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  52.         If bContinue Then Exit Sub
  53.         Dim FBdlg As New System.Windows.Forms.FolderBrowserDialog
  54.         If FBdlg.ShowDialog(Me) <> DialogResult.OK Then Exit Sub
  55.         Dim sdir As String = FBdlg.SelectedPath()
  56.         bContinue = True
  57.         FromSeven(sdir, sArh, False)
  58.         bContinue = False
  59.     End Sub
  60.  
  61.     'ToSeven добавляет файл в архив
  62.     'sfile - полный путь с именем файла добавляемого в архив
  63.     'seven - полный путь с именем архива .7z
  64.     'bkgnd - true - режим callback, false - zip32.dll отображает свое окно состояния архивирования
  65.     'если архив не существует, создается новый
  66.     'возвращается false при неудаче
  67.     Private Function ToSeven(ByVal sfile As String, ByVal seven As String, ByVal bkgnd As Boolean) As Boolean
  68.         Dim shortfile As New System.Text.StringBuilder(MAX_PATH)
  69.         GetFileTitle(seven, shortfile, MAX_PATH)
  70.         CreateDirectory(seven.Substring(0, seven.Length - shortfile.ToString.Length), 0)
  71.         SetCurrentDirectory(sfile)
  72.         GetFileTitle(sfile, shortfile, MAX_PATH)
  73.         Dim comstr As String = "a " & Chr(34) & seven & Chr(34) & IIf(bkgnd, " -hide", vbNullString) & " -i!" & Chr(34) & shortfile.ToString & Chr(34)
  74.         Debug.WriteLine(comstr)
  75.         If bkgnd Then SevenZipSetOwnerWindowEx(0, AddressOf ArhiveProc)
  76.         Return Not CBool(SevenZip(Me.Handle, comstr, 0, 0))
  77.     End Function
  78.  
  79.     'FromSeven извлекает все файлы из архива
  80.     'sdir: - полный путь директории куда извлекаются файлы
  81.     'seven: - полный путь и имя архива .7z
  82.     'bkgnd: - режим callback
  83.     'если sdir не существует, создается новая
  84.     'возвращается false при неудаче
  85.     Private Function FromSeven(ByVal sdir As String, ByVal seven As String, ByVal bkgnd As Boolean) As Boolean
  86.         CreateDirectory(sdir, 0)
  87.         SetCurrentDirectory(sdir)
  88.         Dim comstr As String = "x " & Chr(34) & seven & Chr(34) & IIf(bkgnd, " -hide", vbNullString)
  89.         Debug.WriteLine(comstr)
  90.         If bkgnd Then SevenZipSetOwnerWindowEx(0, AddressOf ArhiveProc)
  91.         Return Not CBool(SevenZip(Me.Handle, comstr, 0, 0))
  92.     End Function
  93.  
  94.     'ArhiveProc вызывается из ДРУГОГО потока созданного в dll со всеми вытекающими последствиями
  95.     Private Function ArhiveProc(ByVal hwnd As Integer, ByVal uMsg As Integer, ByVal nState As Integer, ByVal lpEis As IntPtr) As Integer
  96.         'Dim ExtInf As EXTRACTINGINFO = CType(System.Runtime.InteropServices.Marshal.PtrToStructure(lpEis, GetType(EXTRACTINGINFO)), EXTRACTINGINFO)
  97.         Select Case nState
  98.             Case 0
  99.             Case 1
  100.             Case 3
  101.         End Select
  102.         ArhiveProc = bContinue 'продолжить выполнение - вернуть true, остановить - false
  103.     End Function
  104. End Class


Ответить

Номер ответа: 14
Автор ответа:
 CTFMoN



Вопросов: 0
Ответов: 1
 Профиль | | #14 Добавлено: 25.03.09 22:37
Помогите, пожалуйста, кто может! Передо мной стоит задача получить список файлов и папок архива 7z. Проблема состоит в использовании функции
  1. SevenZipFindFirst Lib "7-zip32.dll" (hArc As Long, szWildName As String, lpSubInfo As INDIVIDUALINFO)

Вот, что я делаю:

  1. Private Declare Function SevenZipGetFileCount Lib "7-zip32.dll" (ByVal szArcFile As String) As Long
  2. Private Declare Function SevenZipOpenArchive Lib "7-zip32.dll" (ByVal hwnd As Long, ByVal szFileName As String, ByVal dwMode As Long) As Long
  3. Private Declare Function SevenZipCloseArchive Lib "7-zip32.dll" (ByVal hArc As Long) As Long
  4. Private Declare Function SevenZipFindFirst Lib "7-zip32.dll" (hArc As Long, szWildName As String, lpSubInfo As INDIVIDUALINFO)
  5.  
  6. Private Type INDIVIDUALINFO
  7.     dwOriginalSize As Long
  8.     dwCompressedSize As Long
  9.     dwCRC As Long
  10.     uFlag As Long
  11.     uOSType As Long
  12.     wRatio As Long
  13.     wDate As Long
  14.     wTime As Long
  15.     szFileName As String
  16.     dummy1 As String
  17.     szAttribute As String
  18.     szMode As String
  19. End Type
  20.  
  21. Private Sub Form_Load()
  22. Dim hArc As Long
  23. Dim lpInfo As INDIVIDUALINFO
  24. hArc = SevenZipOpenArchive(Me.hwnd, "d:\test.7z", 0)
  25. ret = SevenZipFindFirst(hArc, "*.*", lpInfo)
  26. MsgBox ret
  27. ret = SevenZipCloseArchive(hArc)
  28. End Sub


Ошибка выбивает при вызове функции SevenZipFindFirst “Bad DLL calling convention”
Думаю, что нужно lpInfo передавать как-то по-другому, но как? И ещё один вопрос: что нужно подставлять вместо szWildName чтобы получить все имена файлов и папок архива?
Пожалуйста, помогите разобраться! Заранее благодарю. (код написан на VB6)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам