- PR -

圧縮ファイルの情報取得

1
投稿者投稿内容
なんとか
常連さん
会議室デビュー日: 2007/02/21
投稿数: 20
投稿日時: 2007-05-08 13:54
いつも参考にさせていただいております。

VS.NET2005 ASP.NET(VB) SQL-SEVER2005Express Edition で開発しています。

下記の宣言と処理で圧縮ファイルの情報を取得しようと思っているのですが
うまく取得できないようです。
------------------------------------------------------------
Private Structure INDIVISUALINFO
Public dwOriginalSize As Long
Public dwCompressedSize As Long
Public dwCRC As Long
Public uFlag As Long
Public uOSType As Long
Public wRatio As Integer
Public wDate As Integer
Public wTime As Integer
<VBFixedStringAttribute(513)> Public szFileName As String
<VBFixedStringAttribute(3)> Public dummy As String
<VBFixedStringAttribute(8)> Public szAttribute As String
<VBFixedStringAttribute(8)> Public szMode As String
End Structure

<System.Runtime.InteropServices.DllImport("UNLHA32.DLL")> _
Private Shared Function UnlhaOpenArchive(ByVal hwnd As Integer, ByVal szFileName As String, ByVal dwMode As Integer) As Integer
End Function

<System.Runtime.InteropServices.DllImport("UNLHA32.DLL")> _
Private Shared Function UnlhaCloseArchive(ByVal harc As Integer) As Boolean
End Function

<System.Runtime.InteropServices.DllImport("UNLHA32.DLL")> _
Private Shared Function UnlhaFindFirst(ByVal harc As Integer, ByVal szWildName As String, ByVal lpSubInfo As INDIVISUALINFO) As Integer
End Function


Protected Sub Button_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles UpLoadButton.Click
Dim hwnd As Long
Dim hwnd1 As Long
Dim hwnd2 As Long
Dim udtINDIVISUALINFO As INDIVISUALINFO = New INDIVISUALINFO

hwnd = UnlhaOpenArchive(0, archiveFile, 0)
hwmd1 = UnlhaFindFirst(hwnd, "*.*", udtINDIVISUALINFO)
hwnd2 = UnlhaCloseArchive(hwnd)
End Sub
------------------------------------------------------------
※archiveFileは圧縮ファイルのパスです。

試しに最初の1件の情報のみと思いUnlhaFindFirstで情報取得をしています。

hwmd1は0で返ってくるので正常に終了しているかと思うのですが
udtINDIVISUALINFOの値がうまく入っていないようで情報が取得できません。

何か対処方法はありませんでしょうか?
よろしくご教授のほどよろしくお願いします。

[ メッセージ編集済み 編集者: なんとか 編集日時 2007-05-08 14:30 ]

[ メッセージ編集済み 編集者: なんとか 編集日時 2007-05-08 14:39 ]
なんとか
常連さん
会議室デビュー日: 2007/02/21
投稿数: 20
投稿日時: 2007-05-08 14:38
<System.Runtime.InteropServices.DllImport("UNLHA32.DLL")> _
Private Shared Function UnlhaFindFirst(ByVal harc As Integer, ByVal szWildName As String, ByVal lpSubInfo As INDIVISUALINFO) As Integer
End Function

上記内容で
"ByVal lpSubInfo As INDIVISUALINFO"を"ByRef lpSubInfo As INDIVISUALINFO"にしたところ
数値部分は取れるようになったのですが

ユーザー定義で定義した
<VBFixedStringAttribute(513)> Public szFileName As String
<VBFixedStringAttribute(3)> Public dummy As String
<VBFixedStringAttribute(8)> Public szAttribute As String
<VBFixedStringAttribute(8)> Public szMode As String

この部分がNotingになってしまいます。
やはり、この部分の書き方が悪いのでしょうか・・・

[ メッセージ編集済み 編集者: なんとか 編集日時 2007-05-08 14:38 ]
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2007-05-08 15:01
アンマネージ コードとの相互運用
なんとか
常連さん
会議室デビュー日: 2007/02/21
投稿数: 20
投稿日時: 2007-05-08 17:54
Hongliangさんありがとうございます。
APIの呼び出しについては大丈夫かと思うのですがUNLHA32のAPIがうまく使えてないのでしょうか。

もう一度よく見て書き直したのですが
DllImportの部分のAPIの型が違っていたためIntegerからLongに変えて実行したところ
UnlhaFindFirstが正常に処理されていないようでした。

何か対処方法はありませんでしょうか。
よろしくご教授のほどよろしくお願いします。
------------------------------------------------------------
Private Structure INDIVISUALINFO
Public dwOriginalSize As Long
Public dwCompressedSize As Long
Public dwCRC As Long
Public uFlag As Long
Public uOSType As Long
Public wRatio As Integer
Public wDate As Integer
Public wTime As Integer
<VBFixedStringAttribute(513)> Public szFileName As String
<VBFixedStringAttribute(3)> Public dummy As String
<VBFixedStringAttribute(8)> Public szAttribute As String
<VBFixedStringAttribute(8)> Public szMode As String
End Structure

<System.Runtime.InteropServices.DllImport("UNLHA32.DLL")> _
Private Shared Function UnlhaOpenArchive(ByVal hwnd As Integer, ByVal szFileName As String, ByVal dwMode As Integer) As Long
End Function

<System.Runtime.InteropServices.DllImport("UNLHA32.DLL")> _
Private Shared Function UnlhaCloseArchive(ByVal harc As Integer) As Boolean
End Function

<System.Runtime.InteropServices.DllImport("UNLHA32.DLL")> _
Private Shared Function UnlhaFindFirst(ByVal harc As Integer, ByVal szWildName As String, ByVal lpSubInfo As INDIVISUALINFO) As Long
End Function


Protected Sub Button_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles UpLoadButton.Click
Dim hwnd As Long
Dim hwnd1 As Long
Dim hwnd2 As Long
Dim udtINDIVISUALINFO As INDIVISUALINFO = New INDIVISUALINFO

hwnd = UnlhaOpenArchive(0, archiveFile, 0)
hwmd1 = UnlhaFindFirst(hwnd, "*.*", udtINDIVISUALINFO)
hwnd2 = UnlhaCloseArchive(hwnd)
End Sub
------------------------------------------------------------
※archiveFileは圧縮ファイルのパスです。

[ メッセージ編集済み 編集者: なんとか 編集日時 2007-05-08 17:58 ]
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2007-05-08 18:32
アンマネージ DLL が要求する型に対応する .NET Framework の型も、
構造体の中に固定長の文字列が含まれる場合のサンプルも、
全部リンク先に書かれていますよ。
よく調べてください。

ちなみに、オブジェクトを .NET Framework とそのほか(ネイティブの DLL や COM)の間で相互変換することを、MS は「マーシャリング」と呼んでいます。
1

スキルアップ/キャリアアップ(JOB@IT)