メモリの圧縮ファイルをメモリ上に展開する

[戻る]
田中さん 2006/07/30(日) 08:59:52
開発環境 VisualC++ SDK開発 Windows2003Server

以前UNLHA32.DLLを使ってファイルの解凍処理で、
インターネットからダウンロードしたlzhファイルをディスクに保存後、
保存したデータを解凍するという手順で解凍しています。

このままでもOKなのですが、メモリ上にあるダウンロードデータを
ファイルに保存せずに、そのまま解凍する方法があればと思い質問します。

UNLHAのAPIではUnlhaExtractMem()を使えばOKと思っていたのですが
これだとUNLHA32.DLL に渡すコマンドの文字列にファイル名が必要だと思うので
メモリ上のみで処理とはならないと思うのですがどうでしょうか?

やりたい処理としては
解凍関数に メモリ上のポインタ(もしくはファイルハンドル)を渡し、
メモリ上に展開、データの展開済みファイルのポインタ(ファイルハンドル)を
取得したいのですがいかがでしょうか?

シャノン 2006/07/30(日) 13:31:02
> UNLHAのAPIではUnlhaExtractMem()を使えばOKと思っていたのですが

NG です。
UnlhaExtractMem は、ディスク上に存在する圧縮ファイルをメモリ上に展開する関数で
あり、メモリ上に存在する圧縮データを展開する関数ではありません。

結論としては、Unlha32.dll を使う限り、お望みの処理は不可能です。
どうしてもやりたいのであれば、LHA の展開ルーチンを自分で書かなければなりませ
ん。
Unlha32.dll のソースコードは公開されていませんが、LHA for Unix という Unix 用の
ソフトウェアのソースコードならば入手できます。
基本的に、LHA の圧縮/展開ルーチンは OS に依存しない(だからこそ Unix に移植で
きた)ので、Unlha32.dll を使わずに LHA を扱う機能を持つソフトウェアは、この 
LHA for Unix のソースコードを元にしている場合が多いようです。

http://www2m.biglobe.ne.jp/~dolphin/lha/lha-unix.htm

ただし、一時ファイルと Unlha32.dll を使うほうが、遥かに労力は少なくてすみます。

> データの展開済みファイルのポインタ(ファイルハンドル)を
> 取得したいのですがいかがでしょうか?

ポインタとファイルハンドルは同一ではありません。
ファイルハンドルとアーカイブハンドル(UnlhaOpenArchive で得られる HARC)も同一
ではありません。
このあたりは、実は何を取得したいのかがわからないため、これ以上アドバイスできま
せん。

田中さん 2006/08/02(水) 08:41:15
[[解決]]
シャノンさんありがとうございました。
>UnlhaExtractMem は、ディスク上に存在する圧縮ファイルをメモリ上に展開する関数で
あり、メモリ上に存在する圧縮データを展開する関数ではありません。
>ただし、一時ファイルと Unlha32.dll を使うほうが、遥かに労力は少なくてすみま
す。

たしかにそうです。
時間があれば挑戦してみたいところではあります。
どうもありがとうございました。

古いスレッドには追加発言できません。