なんとなくオブジェクトブラウザでライブラリ探ってたら、「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」で試してみたら、ようやくインスタンスを取得できた。
先にあげた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のプロセスそのものが異常終了。おっかねー。これは要調査だな。
セコメントをする