Explzh


 Explzhというアーカイバがある。

 けっこう色々な圧縮方式に対応していて、普通に使ってる分には他には必要ないんじゃないかとも思うんだけど、ちょっと最近困ったことが起きた。

 RARという拡張子を持つファイル。もちろんこれも対応形式の一つで、アーカイブを開けるし、中のファイルを見ることもできる。

 しかし、ファイルを削除しようとすると「ファイルが見あたらない」とWinRARに怒られてしまう。最初はそのアーカイブが壊れているのかと思って他のファイルでも試してみたが結果は同じ。

 そこで、コマンドラインを受け取ってその内容をファイルに落とす、という簡単なプログラムを作ってWinRAR.exeにリネームして調べてみたところ、どうもレスポンスファイルに載っている、対象ファイルのパス名の区切りが / になっているのが原因らしいことがわかった。

 さっそく作者に連絡(一ヶ月ぐらい前)して、「対処します」という返事ももらったんだけれども、残念ながら今のところ直ってはいない。

 まあ忙しいこともあるだろうし、優先順位の関係かもしれないし、そのことについてぐだぐだ言いたいわけではない。

 公式で対応されるまで、とりあえずこれをなんとかしようというのが今回の話。


 やるべきことは簡単だ。WinRARの代わりにコマンドラインを受け取り、指定されたレスポンスファイルを走査して / を \ に置き換え、受け取ったコマンドラインを付けてWinRARに引き渡せばいい。

 普通ならここでC++C#Delphiといったような言語を使うんだろうけど、あいにくどの言語も使ったことがないので無理。

 というわけで選んだのがHSP。とは言っても以前から使っていたわけではなく、上に書いた「コマンドラインを受け取って〜」というプログラムを作ったのが初めて。

 なぜHSPなのかというと、すぐに覚えられそうでexeファイルが作れる物、というので思い浮かんだのがこれだったから。

 とはいっても、HSPだけでは実現できず、結局Perlも使用する羽目になってしまった。

 Perlには「exeファイルを作れない」という問題があったし、HSPには「実行したプログラムの終了コードが受け取れない」という欠点があったからだ。

 実はPerlスクリプトをexeファイルに変換するツールはあるんだけど、あれは結局、スクリプト本体とそれを実行するのに必要なライブラリなどをzipで固めて自己解凍形式に変換するものであり、実行ファイルが大きいということと、なにより起動に時間が掛かりすぎるという欠点があるため、あまり実用的ではない。


 さて、それではソースの紹介。まずはHSP部分から。HSP3を使用。ファイル名は適当に。

#packopt name "winrar"
#packopt hide 1
#include "hspext.as"

sdim in,4096
sdim buf,32000

path="C:\\perl\\script\\"			// winrar.pl を置くパス

cmdline="perl "+path+"winrar.pl "+dir_cmdline

pipeexec buf,cmdline,0
if stat : end 2

repeat
pipeget in
if stat=0 : break
wait 10
loop

end int(buf)

 パイプ付き実行で、コマンドラインをそのまま引き渡してPerlスクリプトを実行し、終了コードを得てExplzhにそれを返す。それだけ。

 8行目のパスは各自で書き換えてね。

 ではPerl部。winrar.plというファイル名で作成する。

use strict;

my $fname = $ARGV[$#ARGV] || endproc(2);
my $path = 'C:\\Program Files\\WinRAR\\';	# WinRARをインストールしたパス

$fname =~ s/@//;

my $str;
open(FH,$fname) or endproc(2);
{
	local $/;
	$str = <FH>;
}
close FH;

$str =~ s|/|\\|g;
open(FH,">$fname") or endproc(2);
print FH $str;
close FH;

my $code = system $path.'winrar.exe',@ARGV;
endproc($code);

exit;

sub endproc {
	my $code = shift;

	print $code;
	exit;
}

 渡されたコマンドラインからレスポンスファイル名を取得し、レスポンスファイル内の / を \ に書き換えてからWinRARを実行。終了コードをHSPに返す。

 これも4行目の$pathを自分の環境に合わせて書き換えてね。


 Perlがインストールされてる環境でないと実行できないんだけど、一般的にはPerlがインストールされてることは希だと思うんで、HSP部のexeファイルのアップは無し。

 もし欲しいって人が居ればアップするけど、いないよね、たぶん。


 しかし、同じ事で困ってるって人、いないんだろうか?メーリングリストでも話題になっている様子はないし…。