makecabのヘルプオプションは英語表記で分かりにくいし、インターネット上の情報も少なかったので、ここで試行錯誤のメモを残す。
makecabで圧縮したcabファイルをexpandで展開したときのエラー0x80070032
c:\>expand hoge.cab -F:* .
Microsoft (R) File Expansion Utility
Copyright (c) Microsoft Corporation. All rights reserved.
ファイル hoge.cab の解凍は完了していません。エラー コード = 0x80070032
エラーの説明: この要求はサポートされていません。
【原因】
どうやらmakecabが出力するcabファイルのサイズの初期値はそれほど大きくないらしい。
合わせて数M程度のファイル群であっても、規定サイズを超えた部分を切り捨てたcabファイルを作り、これをexpandしようとしてもファイルが変だよと0x80070032を返した模様。
【対策】
MaxDiskSize変数で最大値を指定する。
makecab /D MaxDiskSize=1024000000
とコマンドラインのDオプションで指定してもよいし、
ddfファイルを使うならば、その中に
.Set MaxDiskSize=1024000000
と書いてもいい。
ファイル階層構造の指定の仕方。
ddfファイルを使う。
例えば、
uno\dos\tres.dll
uno\cuatro\cinco.inf
uno\seis ciete\ocho.exe
という階層構造のファイルを圧縮し、解凍したら再現したい場合。
.Set DestinationDir=uno\dos
uno\dos\tres.dll
.Set DestinationDir=uno\cuatro
uno\cuatro\cinco.inf
.Set DestinationDir="uno\seis ciete"
"uno\seis ciete\ocho.exe"
DestinationDir変数で作成して欲しいフォルダ名を指定する。
スペース等が入ったパスの場合は、例のごとくダブルクォテーションで囲う。
setup.infとsetup.rtn(makecabの実行ログ)
makecabを実行するとデフォルトではsetup.infとsetup.rtnを出力する。
これを抑止するにはRptFileName、InfFileName変数を使う。
コマンドラインであれば
/D RptFileName=NUL /D InfFileName=NUL
DDFファイルであれば
.Set RptFileName=NUL
.Set InfFileName=NUL
など。