JScriptでCABファイル2007年08月22日 03時12分27秒

CABが作れそうなタイプライブラリを見つけた

なんとなくオブジェクトブラウザでライブラリ探ってたら、「COM MakeCab 1.0 Type Library」なんてのを見つけた。いかにもCABファイルが作成できそう。

クラスは「MakeCab」オブジェクトがあるだけで、このクラス自体も「AddFile」「CloseCab」「CopyFile」「CreateCab」と4つのメソッドが実装されているだけのいたってシンプルなもの。

このタイプライブラリ自体は %SystemRoot%\system32\catsrvut.dll がファイル本体で、バージョン情報を見るとMicrosoft製のものでコピーライトも「Copyright (C) Microsoft Corp. 1995-1999」となっていることから、少なくともWin2K以降のNT系列のOSでは標準DLLと思われる。

さて、使い方だが

JScriptから使ってみたいので、ともかくnew ActiveXObjectできなきゃ話にならない。とりあえず「new ActiveXObject("COMMKCABLib.MakeCab")」だの「new ActiveXObject("MakeCab")」だのと試してみたが「オートメーション サーバーはオブジェクトを作成できません。」と蹴られる。

「COM MakeCab 1.0 Type Library」でぐぐってみたらこんなのが見つかった。どうやらPythonWinで試してるようで、

c = Dispatch('MakeCab.MakeCab')
なんてコードが載っている。

さっそく「new ActiveXObject("MakeCab.MakeCab")」してみるも、これまたオブジェクトを作成できないと蹴られる。むぅ。

レジストリを眺めてみると

先の記事中にIn a key named for the CLSID {8E17FFF3-...you get the picture}なんて記述があるのでregeditで HKCR\CLSID から 8E17FFF3- で始まるキーを捜してみたところ、ProgIDが「MakeCab.MakeCab.1」、VersionIndependentProgIDが「MakeCab.MakeCab」となっていた。後者はさっきNGになったので「~.1」で試してみたら、ようやくインスタンスを取得できた。

CABを作ってみよう

先にあげた4つのメソッドの中で、最初に使えそうなのはやはり「CreateCab」だろう。シグニチャは以下のようになっている。

Sub CreateCab(CabFileName, MakeSignable, ExtraSpace)
「CabFileName」はまんまだが、ほかの2つは型もわからんしどういう作用になるのかもよくわからないので、「CabFileName」のみで挑戦してみた。
var cab = new ActiveXObject("MakeCab.MakeCab.1");
cab.CreateCab( "test.cab" );
// → 引数の数が一致していません。または不正なプロパティを指定しています。
ふむ、引数は省略できないか。さてどんなデータを渡せばよいのか。

もう一度「COM MakeCab 1.0 Type Library」でぐぐってみたら、cabMaker.CreateCab(cabFile, false, 0, false); なんてコードが見つかった。4番目の引数はメソッドシグニチャでは定義されていないので無視することとして、

var cab = new ActiveXObject("MakeCab.MakeCab.1");
cab.CreateCab( "test.cab", false, 0 );
としてみたところ、今度はエラーがでない。うし!

ファイルの追加とクローズ

いかにもな名前なので、CreateCabしたCABにAddFileメソッドでファイルを追加してみることに。AddFileメソッドのシグニチャは以下のとおり。

Sub AddFile(FileName, FileNameInCab)
なので、
var cab = new ActiveXObject("MakeCab.MakeCab.1");
cab.CreateCab( "test.cab", false, 0 );
cab.AddFile("test.txt", "text.txt");
とあてずっぽうで試してみたらエラーがでない。これで閉じればいいのか?「cab.CloseCab();」これもエラーなし。

どうやら上のコードの流れでよかったみたいで、しっかりと「test.cab」が作成され、中に「text.txt」が追加されていた。

しかし、CAB内にディレクトリを作成/コピーする方法がよくわからん。「cab.AddFile( "mydir", "mydir" );」とかやってみたらcscriptのプロセスそのものが異常終了。おっかねー。これは要調査だな。

まとめ

  • 「COM MakeCab 1.0 Type Library」を使うことで、JScript(またはVBScript、その他のActiveスクリプト言語)で圧縮ファイルに固めることができる
  • しかしディレクトリの追加方法がまだ不明。
  • そもそもCABファイル作れてうれしいか?

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://dara-j.asablo.jp/blog/2007/08/22/1742692/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。