CABファイル内のsetup.dllをサイレントインストールに対応させる方法

CABファイルは通常エクスプローラ上でダブルクリックすると自動的にインストールできる。
これは、実際にはシェルの関連付けによってCABインストーラwceload.exe)が呼ばれることで実現されている。


[HKEY_CLASSES_ROOT\.cab]
@="cabfile"

[HKEY_CLASSES_ROOT\cabfile]
@="CAB File"

[HKEY_CLASSES_ROOT\cabfile\DefaultIcon]
@="\\Windows\\wceload.exe,-101"

[HKEY_CLASSES_ROOT\cabfile\Shell\Open\Command]
@="\\Windows\\wceload.exe \"%1\""


さてwceload.exeには引数があって、自作のプログラムから呼び出す場合は引数を指定することでサイレントインストールを実行することができるようになっている。

/noaskdestインストール先ディレクトリの問合せを行わない。
CABファイルで指定されているデフォルトのインストール先が自動的に設定される。
/nouiインストール中のUI表示を行わない。
Yes/Noのような問合せ(例えばファイルを上書きするかどうかといったダイアログ)は自動的にYesが選択される。
両方のオプションを指定しておくと完全なサイレントインストールになる。

wceload /noaskdest /noui \hogehoge.CAB


ただし、自作のsetup.dll内で独自にメッセージボックスなどのUI処理を行っている場合は、当然このオプションの影響が自動的には及ばない。
オプションを認識してサイレントインストールにも対応可能にするには、setup.dll内でGetCommandLineを使ってwceload.exeが起動した際のコマンドライン文字列を取得して、/noui オプションが含まれているかどうかを判断する。で、オプションが含まれていたらUI処理をスキップするようにしておく。これでok。


参考:TheMSsForum.com >> PocketPC Developer >> Setup DLL deficiency - The Microsoft Software Forum



おまけの隠しレジストリ(未確認)

[HKEY_LOCAL_MACHINE\Software\Apps\Microsoft Application Installer]
"fAskDest"/noaskdestを指定しない時のデフォルト
(0:/noaskdest, 1:/askdest)
"fNoUI"/nouiを指定しない時のデフォルト
(0:/UIあり, 1:UIなし)
"nDynamicDelete"/delete nまたは/nodeleteを指定しない時のデフォルト
(0:CABを残す, 2:CAB削除)
"Supported"対応プラットフォームを追加?
"fEnableCef"???


おまけの隠しオプション(未確認)

/delete 0インストール後にCABファイルを削除しない
/delete 1インストール後にCABファイルを削除する
/delete 2CABファイルを削除しながらインストールする(空き容量が厳しい場合に)
/askdestインストール先ディレクトリを指定可能にする
/noaskdestCABファイルで指定されたディレクトリへインストールする
/pid???
/nouiUIを表示しない
/pbar/noui指定時でもプログレスバーだけは表示する
/nouninstallアンインストール情報を生成しない