開発環境 VisualC++ SDK開発 Windows2003Server
以前UNLHA32.DLLを使ってファイルの解凍処理で、
インターネットからダウンロードしたlzhファイルをディスクに保存後、
保存したデータを解凍するという手順で解凍しています。
このままでもOKなのですが、メモリ上にあるダウンロードデータを
ファイルに保存せずに、そのまま解凍する方法があればと思い質問します。
UNLHAのAPIではUnlhaExtractMem()を使えばOKと思っていたのですが
これだとUNLHA32.DLL に渡すコマンドの文字列にファイル名が必要だと思うので
メモリ上のみで処理とはならないと思うのですがどうでしょうか?
やりたい処理としては
解凍関数に メモリ上のポインタ(もしくはファイルハンドル)を渡し、
メモリ上に展開、データの展開済みファイルのポインタ(ファイルハンドル)を
取得したいのですがいかがでしょうか?
> 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)も同一
ではありません。
このあたりは、実は何を取得したいのかがわからないため、これ以上アドバイスできま
せん。
シャノンさんありがとうございました。
>UnlhaExtractMem は、ディスク上に存在する圧縮ファイルをメモリ上に展開する関数で
あり、メモリ上に存在する圧縮データを展開する関数ではありません。
>ただし、一時ファイルと Unlha32.dll を使うほうが、遥かに労力は少なくてすみま
す。
たしかにそうです。
時間があれば挑戦してみたいところではあります。
どうもありがとうございました。