タイトル | : VB.NET で、UnLha32 |
記事No | : 10803 |
投稿日 | : 2012/05/15(Tue) 18:57 |
投稿者 | : じょば |
言語 : Visual Basic 2010 Express OS : Windows 7 / Windows XP
UnLha32.DLL を使用して、LHA形式の書庫から格納ファイル名の一覧を取得 しようとしています。
途中の、UnlhaFindFirst で、以下のようなエラーメッセージが出ます。 ----- 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。 他のメモリが壊れていることが考えられます。 -----
VB6では、同じような流れのコーディングをして、動作していますが、.NETに 移行しようとして、足踏みしている状況です。
INDIVIDUALINFO構造体の使い方が悪いのか、DllImportが悪いのか、色々試して みたのですが、上手くいきません。
このクラスを、別のフォームから使用し、GetLhaInfo でファイル一覧を取得 しようとしています。取得値を呼び出し元に戻す部分は省略しています。
他のもTry Catch などは省略していますが、現在のコーディングを掲載してみます。 間違っているところを指摘して頂ければ、ありがたいのですが。
よろしくお願いいたします。
Imports System.Runtime.InteropServices
Public Class ComUnLha Private Const FNAME_MAX As Integer = 512 Private Const FNAME_MAXPLUS1 As Integer = FNAME_MAX + 1
' INDIVIDUALINFO構造体 Private Structure typINDIVIDUALINFO Public dwOriginalSize As Integer ' ファイルのサイズ Public dwCompressedSize As Integer ' 圧縮後のサイズ Public dwCRC As Integer ' 格納ファイルのチェックサム Public uFlag As Integer ' 処理結果 Public uOSType As Integer ' 書庫作成に使われたOS Public wRatio As Short ' 圧縮率 Public wDate As Short ' 格納ファイルの日付(DOS 形式) Public wTime As Short ' 格納ファイルの時刻(〃) Public szFilename As String ' 書庫名 Public dummy1 As String Public szAttribute As String ' 格納ファイルの属性 書庫固有 Public szMode As String ' 格納ファイルの格納モード 〃
Public Sub New(ByVal intFnLen As Integer) szFilename = Strings.LSet(" ", intFnLen) dummy1 = Strings.LSet(" ", 3) szAttribute = Strings.LSet(" ", 8) szMode = Strings.LSet(" ", 8) End Sub End Structure
' LHAファイル情報取得用 ' ハンドルと書庫ファイルを結び付ける <DllImport("UnLha32")> _ Private Shared Function UnlhaOpenArchive( _ ByVal hwnd As Integer, _ ByVal szFilename As String, _ ByVal dwMode As Integer) As Integer End Function
' UnLhaOpenArchive() で割り付けたハンドルを解放する <DllImport("UnLha32")> _ Private Shared Function UnlhaCloseArchive( _ ByVal harc As Integer) As Integer End Function
' 最初の格納ファイルの情報を得る <DllImport("UnLha32")> _ Private Shared Function UnlhaFindFirst( _ ByVal harc As Integer, _ ByVal szWildName As String, _ ByRef lpSubInfo As typINDIVIDUALINFO) As Integer End Function
' 2番目以降の格納ファイルの情報を得る <DllImport("UnLha32")> _ Private Shared Function UnlhaFindNext( _ ByVal harc As Integer, _ ByRef lpSubInfo As typINDIVIDUALINFO) As Integer End Function
''' <summary> ''' LHAファイル情報取得 ''' </summary> Public Function GetLhaInfo( _ ByVal inthWnd As Integer, _ ByVal strFileName As String) As Integer
GetLhaInfo = -1
Dim intArcHandle As Integer = UnlhaOpenArchive(inthWnd, strFileName, 0)
Dim intIdx As Integer = -1
If intArcHandle <> 0 Then Dim udtIndInfo As New typINDIVIDUALINFO(FNAME_MAXPLUS1)
' 最初の書庫内のファイルの情報を取り出す。 Dim intFindRes As Integer = UnlhaFindFirst(intArcHandle, "*.*", udtIndInfo)
Do While intFindRes = 0 intIdx = intIdx + 1
' ファイル名 Dim strFileName As String = _ udtIndInfo.szFilename.Substring(0, udtIndInfo.szFilename.IndexOf(vbNullChar) System.Diagnostics.Debug.Print(strFileName)
' 次の格納ファイルの情報を取り出す。 intFindRes = UnlhaFindNext(intArcHandle, udtIndInfo) Loop
Dim intResult As Integer = UnlhaCloseArchive(intArcHandle) End If
GetLhaInfo = intIdx End Function End Class
|