CABの作り方

Cabの作り方をいろいろ調べた

Windows2000以降ならMakecab.exe以外に、こんな方法があるようだ。

Set cab=CreateObject("MakeCab.MakeCab.1")
cab.CreateCab "Test.cab",False,False,False
cab.AddFile "test1.txt","test1.txt"
cab.AddFile "test2.txt","test2.txt"
cab.CloseCab

http://pc5.2ch.net/test/read.cgi/win/1058829737/501-600
でできるらしいが・・・
AddFileの引数のファイル名、どっちが圧縮をかけるファイルで、どっちがCAB内ファイル名を示すのかわからん。

OLE/COM ViewerでDLLを突き止めて、VisualStudioのオブジェクトビューアで調べてみる。

DLLはこれらしい
C:\Windows\Sysem32\catsrvut.dll

オブジェクトビューアで調べた結果

public virtual void AddFile ( System.Object FileName , System.Object FileNameInCab )
public virtual void CloseCab (  )
public virtual void CopyFile ( System.Object CabName , System.Object FileNameInCab )
public virtual void CreateCab ( System.Object CabFileName , System.Object MakeSignable , System.Object ExtraSpace , System.Object Use10Format )
public MakeCabClass (  )

なんとなく、引数で意味がわかった。

AddFileの第一引数は、ローカルファイルをフルパスで渡す。

AddFileの第二引数は、Cabファイル内のファイル名。

Set cab=CreateObject("MakeCab.MakeCab.1")
cab.CreateCab "Test.cab",False,False,False
cab.AddFile "c:\test1.txt","test1.txt"
cab.AddFile "c:\dir\test1.txt","test1.txt"
cab.CloseCab

これでも、問題なく圧縮できるが、解凍する際ファイル名がバッティングしてしまいうまく解凍できない。

Set cab=CreateObject("MakeCab.MakeCab.1")
cab.CreateCab "Test.cab",False,False,False
cab.AddFile "c:\test1.txt","c:\test1.txt"
cab.AddFile "c:\dir\test1.txt","c:\dir\test1.txt"
cab.CloseCab

これだとフォルダつきで解凍してくれるようだ。

これで、圧縮解凍ソフトがない環境でも簡単に圧縮ファイルを作ることができそうだ。