« プログラムでへぇ連発中 | トップページ | プログラム作成中(BlogPet) »

2006-01-28

プログラムでUNLHA32

前回いろいろと失敗したので無理矢理な処理にする。

UnlhaSetOwnerWindowEx64(hWnd, MyArchiverProc, sizeof(EXTRACTINGINFOEX32));
Unlha(hWnd, "u -d1 -n1 -t1 -jm4 -jsb1 -jso1 -jtc1 \"archive.lzh\" \"dir\"", NULL, 0);
UnlhaKillOwnerWindowEx64(hWnd);

// アーカイバプロシージャ
BOOL CALLBACK MyArchiverProc(HWND hWnd, UINT msg, UINT nMode, LPVOID lpEis)
{
    LPEXTRACTINGINFOEX32 lpExInfo;
    char szStr[512];

    lpExInfo = (LPEXTRACTINGINFOEX32)lpEis;

    switch(nMode) {
        case 5:
            // UNLHA32.DLLがファイルをサーチ中であることを表します。
            // 検索にマッチしたファイルのファイル名が得られます。
            break;

        case 3:
            // UNLHA32.DLLが該当書庫の処理を開始することを表します。
            // szSourceFileNameに書庫名が格納されます。
            wsprintf(szStr, "\r\n\r\nCreating archive : %s\r\n\r\n",
                lpExInfo->szSourceFileName);
            Edit_AddString(hEdit, szStr);
            break;

        case 0:
            // UNLHA32.DLLが該当ファイルの処理を開始することを表します。
            break;

        case 1:
            // UNLHA32.DLLが該当ファイルの処理中であることを表します。
          break;

        case 6:
            // UNLHA32.DLLが該当ファイルの格納を終えたことを表します。
            // 圧縮サイズ等はこのメッセージがきた時点で有効となります。
            wsprintf(szStr, "Frozen   ==> %3d%% %s\r\n",
                (int)(lpExInfo->wRatio / 10),
                lpExInfo->wRatio
                ? strrchr(lpExInfo->szSourceFileName, '/') + 1
                : lpExInfo->szSourceFileName);
            Edit_AddString(hEdit, szStr);
            break;

        case 7:
            // UNLHA32.DLLが書庫のチェックを開始することを表します。
            // szSourceFileNameにワークファイル名が格納されます。
            break;

        case 4:
            // UNLHA32.DLLがワークファイルの書き戻しを開始することを表します。
            // szSourceFileNameにワークファイル名が格納されます。
            break;

        case 2:
            // UNLHA32.DLLが処理を終え,lpEisのメモリを開放しようとしていることを表します。
            break;
    }

    return TRUE;    // FALSEを返すと処理中断
}

いろいろと自作関数とかが含まれているが、その辺は脳内補完して欲しい。

圧縮する場合、

  1. nMode=5 で対象ファイル検索。
  2. nMode=3 で対象書庫取得。
  3. nMode=0 で対象ファイル取得。
  4. nMode=1 で対象ファイル処理中。完了するまでこれが続く。
  5. nMode=6 で対象ファイル格納終了。
  6. なぜかここで nMode=1 が来る。
  7. nMode=2 で処理終了。

という順番でメッセージが飛んでくる。言うまでもないと思うが、7.が来るまで3.~6.が繰り返される。

ちなみに、このプロシージャを使うためには、コマンド・スイッチとして「-n1 -jsb1」を指定しなければならないようだ。あと、私の環境では UnlhaKillOwnerWindowEx64 が必ず失敗する。その辺がまだ未解明だが、とりあえず動く。まだまだ調査の余地があるだろう。

|

« プログラムでへぇ連発中 | トップページ | プログラム作成中(BlogPet) »

コンピュータ・プログラム」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/1757/8372967

この記事へのトラックバック一覧です: プログラムでUNLHA32:

» UNLHA32.DLLを用いたファイル圧縮アプリケーションについてのメモ [野望の似非ラヂヲ]
以前書いたまま放置していた問題についてのメモ。#この問題について検索を掛けてくる [続きを読む]

受信: 2006-10-05 22:45

« プログラムでへぇ連発中 | トップページ | プログラム作成中(BlogPet) »