tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルunlha32でコールバック設定を行えない
記事No10429
投稿日: 2011/02/04(Fri) 01:38
投稿者A.K
はじめまして。
unlha32.dllを使用して、VBからアーカイブを解凍するプログラムを作ろうと思っています。
解凍の際、ファイルの情報を得るためにUnlhaSetOwnerWindowEx64でコールバックを受け取りたいのですが、UnlhaSetOwnerWindowEx64を呼び出すとエラーとなり、ERROR_EXECUTABLE_FILE (0x804C)が返ります。
マニュアルを見ると、
「ERROR_EXECUTABLE_FILE (0x804C) エラーのエラーメッセージを指定します。 API に渡された各パラメータの整合性がとれていないことを示します。」
とあり、APIへの値の引き渡しがうまく行っていないということは分かったのですが、どこが間違っているのかが分からず行き詰まってしまいました。
どなたか分かる方がいらっしゃいましたら、ご教示いただければと思い投稿しました。

当方WinXP、VB2005です。
よろしくお願いします。

宣言部:
    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
    Public Structure EXTRACTINGINFO
        Public dwFileSize As Integer
        Public dwWriteSize As Integer
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=513)> _
           Public szSourceFileName As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=3)> _
           Public dummy1 As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=513)> _
           Public szDestFileName As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=3)> _
           Public dummy As String
    End Structure

    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
      Public Structure EXTRACTINGINFO64
        Public dwStructSize As Integer
        Public exinfo As EXTRACTINGINFO
        Public llFileSize As Long
        Public llCompressedSize As Long
        Public llWriteSize As Long
        Public dwAttributes As Integer
        Public dwCRC As Integer
        Public uOSType As Integer
        Public wRatio As Short
        Public ftCreateTime As Long
        Public ftAccessTime As Long
        Public ftWriteTime As Long
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=513)> _
           Public szSourceFileName As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=3)> _
           Public dummy1 As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=513)> _
           Public szDestFileName As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=3)> _
           Public dummy As String
    End Structure

    <DllImport("unlha32", _
        EntryPoint:="UnlhaSetOwnerWindowEx64", _
        ExactSpelling:=True)> _
    Private Shared Function UnlhaSetOwnerWindowEx64(ByVal _hwnd As IntPtr, _
        ByVal _lpArcProc As IntPtr, _
        ByVal _dwStructSize As Integer) As Boolean
    End Function

コード部:
        Dim struct As EXTRACTINGINFO64
        struct = New EXTRACTINGINFO64
        If Not UnlhaSetOwnerWindowEx64(me.handle, IntPtr.Zero, Marshal.SizeOf(struct)) Then
            '〜〜 ここで失敗 〜〜
        End If



〜UNLHA32 WINMES.TXTより〜
BOOL WINAPI UnlhaSetOwnerWindowEx64(
                const HWND      _hwnd,
                LPARCHIVERPROC  _lpArcProc,
                const DWORD     _dwStructSize
            )
機能
        UNLHA32.DLL の展開状況を受け取るためのコールバック関数の指定を行
        います。_lpArcProc に NULL を指定すると _hwnd で指定したウィンド
        ウに メッセージを送出します。

引数
        _hwnd           メッセージを受け取るウィンドウ。
        _lpArcProc      情報を受け取るためのコールバック関数へのポインタ。
        _dwStructSize   使用する構造体のモード。実際には EXTRACTINGINFO-
                        EX,EXTRACTINGINFOEX32, EXTRACTINGINFOEX64 の中
                        で使用するものを決定し,そのサイズを指定する必要
                        があります。

-----------------------------------------------------------------------
%4. EXTRACTINGINFO の構造
-----------------------------------------------------------------------
構造体定義
                typedef struct {
                        DWORD   dwFileSize;
                        DWORD   dwWriteSize;
                        TCHAR   szSourceFileName[FNAME32_MAX + 1];
                        TCHAR   dummy1[3];
                        TCHAR   szDestFileName[FNAME32_MAX + 1];
                        TCHAR   dummy[3];
                }  EXTRACTINGINFO

メンバーの説明
        dwFileSize              格納ファイルのサイズ。
        dwWriteSize             展開処理で書き込んだサイズ。
        szSourceFileName        処理を行う格納ファイル名。
        szDestFileName          実際に書き込まれるパス名。


-----------------------------------------------------------------------
%7. EXTRACTINGINFOEX64 の構造
-----------------------------------------------------------------------
構造体定義
                typedef struct {
                        DWORD           dwStructSize;
                        EXTRACTINGINFO  exinfo;
                        ULHA_INT64      llFileSize;
                        ULHA_INT64      llCompressedSize;
                        ULHA_INT64      llWriteSize;
                        DWORD           dwAttributes;
                        DWORD           dwCRC;
                        UINT            uOSType;
                        WORD            wRatio;
                        FILETIME        ftCreateTime;
                        FILETIME        ftAccessTime;
                        FILETIME        ftWriteTime;
                        TCHAR           szMode[8];
                        TCHAR           szSourceFileName[FNAME_MAX32 + 1];
                        TCHAR           dummy1[3];
                        TCHAR           szDestFileName[FNAME_MAX32 + 1];
                        TCHAR           dummy2[3];
                } EXTRACTINGINFOEX;

[ツリー表示へ]
タイトルRe: unlha32でコールバック設定を行えない
記事No10430
投稿日: 2011/02/04(Fri) 10:05
投稿者Hongliang
・EXTRACTINGINFOEX のメンバの szMode が抜けている
・Unlha32.dll は #pragma pack(1) が宣言されているが、VB 側で定義している構造体は
 パックサイズ未指定の既定値 8(StructLayout 属性で指定できる)。
といった辺りでしょう。

[ツリー表示へ]
タイトルRe^2: unlha32でコールバック設定を行えない
記事No10433
投稿日: 2011/02/05(Sat) 14:15
投稿者A.K
> Hongliang様
ご指摘の点を直してみたところ、正常に動作しました。
ありがとうございました!

しかし、szMode の宣言漏れはお恥ずかしい限りです。
ソースは何度も見直したつもりだったのですが… ^^;

[ツリー表示へ]