.NETプログラミング研究 第61号

.NET Tips

今回はVS.NETのデプロイメントプロジェクトに関する過去の記事の補足をさせていただきます。

Orcaの入手法

注意

この記事の最新版は「Orcaの入手法」で公開しています。

いまさらですが、今まで嫌というほど登場したOrcaを入手する方法を紹介しておきます。

残念ながらOrcaは単体では配布されていません。OrcaはPlatform SDKに含まれていますので、Platform SDKをインストールすることにより、入手できます。よってまずはPlatform SDKをインストールする必要があります。Platform SDKは次のページからダウンロードできます。

インストール後、「Orca.msi」というファイルを探し、これを使ってインストールします。

しかしPlatform SDKには非常に多くのファイルが含まれていますので、かなりのサイズになります。Orcaのみを入手するためにインストールするにしては、あまりにばかげています。

幸いにも、Windows Installer SDKの古いバージョンはサイズが小さく、まだ配布されていますので、バージョンにこだわれなければこれをダウンロードしてインストールするのが手軽です。

「デスクトップにショートカットを作成するかユーザーが選択できるようにする」の補足

.NETプログラミング研究第58号で「デスクトップにショートカットを作成するかユーザーが選択できるようにする」という方法を紹介しましたが、その補足をします。

この記事では、カスタムアクションを使ってシュートカットを作成する簡単な例を示しましたが、もう少し使えるコードに修正します。前のコードでは「すべてのユーザー」か「このユーザーのみ」かを考慮せずに常にユーザーのデスクトップフォルダにショートカットを作成していましたが、これを修正します。また、アンインストール時にショートカットを削除するようにします。(それ以外にも幾つかの点を変更しています。)

はじめに、ユーザーインターフェイスエディタで「チェックボックス」ダイアログを追加する点は変わりません。

次に、インストールで使用するカスタムアクションを次のようなVBScriptとします。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
dim arg, args, desktop, WshShell, WshShortcut
 
'CustomActionDataを分解
arg = Session.Property("CustomActionData")
args = Split(arg, ":::")
 
if args(2)="1" then
    set WshShell = CreateObject("WScript.Shell")
    'デスクトップのパスを取得
    if args(3)="1" then
        desktop = WshShell.SpecialFolders("AllUsersDesktop")
    else
        desktop = WshShell.SpecialFolders("Desktop")
    end if
    'ショートカットを作成
    On Error Resume Next
    set WshShortcut = _
        WshShell.CreateShortcut(desktop & "\" & args(1) & ".lnk")
    WshShortcut.TargetPath = args(0)
    WshShortcut.Save
end if

これを「カスタム動作」の「インストール」に追加し、CustomActionDataプロパティを

[TARGETDIR]app.exe:::アプリケーション:::[CHECKBOXA1]:::[ALLUSERS]

のようにします。ここで「app.exe」はショートカットのリンク先のファイル名、「アプリケーション」はショートカットの名前とします。

次にショートカットを削除するためのカスタムアクションを作成します。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
dim arg, args, desktop, path, WshShell, fso
 
'CustomActionDataを分解
arg = Session.Property("CustomActionData")
args = Split(arg, ":::")
 
'デスクトップのパスを取得
set WshShell = CreateObject("WScript.Shell")
if args(1)="1" then
    desktop = WshShell.SpecialFolders("AllUsersDesktop")
else
    desktop = WshShell.SpecialFolders("Desktop")
end if
'削除するファイルのパス
path = desktop & "\" & args(0) & ".lnk"
'ショートカットを削除
set fso = CreateObject("Scripting.FileSystemObject")
if (fso.FileExists(path)) then
    On Error Resume Next
    fso.DeleteFile(path)
end if

これを「カスタム動作」の「アンインストール」と「ロールバック」に追加し、それぞれのCustomActionDataプロパティを

アプリケーション:::[ALLUSERS]

のようにします。「アプリケーション」は「インストール」で指定したショートカットの名前と同じにしてください。

これで「すべてのユーザー」か「このユーザーのみ」かで適切なフォルダにショートカットが作成されるようになるでしょう。

RemovePreviousVersionsプロパティを使ってMajor Upgradeを行う際の注意事項

前回アップデートの方法について説明しましたが、幾つか注意すべき点があります。ここではその注意点と対処法を紹介します。

VS.NET 2002での注意

VS.NET 2002では、はじめのインストールで「すべてのユーザー」とした場合、アップデートでRemovePreviousVersionsプロパティが機能しないようです。これを修正するには、OrcaでInstallUISequenceテーブルのFindRelatedProductsのSequenceがWelcomeFormの後になるようにします。詳しくは、次のリンクをご覧ください。

「すべてのユーザー」がデフォルトになるようにする

注意

この記事の最新版は「「すべてのユーザー」がデフォルトになるようにする」で公開しています。

前回説明したとおり、前のバージョンのインストールが「このユーザーのみ」で、新しいバージョンを「すべてのユーザー」としてインストールすると、RemovePreviousVersionsプロパティは機能しません(逆にはじめが「すべてのユーザー」で「このユーザーのみ」としてインストールする場合もダメです)。しかも、VS.NETで作成したMSIファイルではデフォルトが「このユーザーのみ」に固定されており、変更できません。まずはこのデフォルトを「すべてのユーザー」に変更する方法を紹介します。

まずデフォルトの設定を変更するために、Windows Installerのプロパティ、ALLUSERSを2とします(注)。

注:ALLUSERSを1とした場合は「すべてのユーザー」インストールができない環境ではエラーが発生します。ALLUSERSを2とすることにより、「すべてのユーザー」としてインストールできない時に「このユーザーのみ」としてインストールされるようにできます。「すべてのユーザー」としてインストールできない環境では、「すべてのユーザー/このユーザーのみ」チェックボックスは表示されないようになっていますので、ALLUSERS=2で問題ないでしょう。

また、ダイアログのチェックボックスがデフォルトで「すべてのユーザー」となるようにするために、Propertyテーブルの「FolderForm_AllUsers」のValueを「ME」から「ALL」に変更します。

以上を変更して保存すればOKです。

補足:VS.NETで作成されるMSIファイルでは、チェックボックスで指定された設定を調べてALLUSERSの値を設定するようになっています(「すべてのユーザー」の場合はALLUSERSが2となります)。ただしこれは「次へ」ボタンが押された時に行われるため、サイレントインストールなどでは実行されません。よってここでは、FolderForm_AllUsersだけでなく、ALLUSERSのデフォルトも変更しています。

「すべてのユーザー/このユーザーのみ」チェックボックスを隠す

注意

この記事の最新版は「「すべてのユーザー/このユーザーのみ」チェックボックスを隠す」で公開しています。

デフォルトを変更したところで、ユーザーが変更できるのであれば、やはりRemovePreviousVersionsプロパティが機能しない問題は解決されません。次に「すべてのユーザー/このユーザーのみ」チェックボックスを隠して、設定を変更できないようにする方法を紹介します(注)。

注:またはサイレントインストールとし、ユーザーが設定を変更できないようにする方法もあります。サイレントインストールに関しては、第59号で説明しました。

このチェックボックス(およびその上に表示されるテキスト)はNT系OSでのみ表示されますが、これを制御しているのが、ControlConditionテーブルです。ここで次の2つの行

Dialog_Control_ActionCondition
FolderFormAllUsersRadioGroupShowVersionNT>=400 AND Privileged=1
FolderFormAllUsersTextShowVersionNT>=400 AND Privileged=1

のAction列を「Show」から「Hide」に変更することにより、常にチェックボックスが隠れるようになります。

もう一つの方法は、Controlテーブルでコントロールを直接制御する方法です。ControlConditionテーブルでShowされているため、ControlテーブルのAttributes列でVisibleフラッグをはずしても表示されてしまいます。よって手っ取り早く非表示にする方法は、Widthを0とすることでしょう。よって、次の2つの行(Height以降の列を省略しています)

Dialog_ControlTypeXYWidth
FolderFormAllUsersRadioGroupRadioButtonGroup24210342
FolderFormAllUsersTextText18186348

のWidth列を「0」とすることにより、表示されなくなります。

もっと全うな方法で行うならば(つまりControlConditionテーブルの設定を削除し、ControlテーブルのAttributes列の値を変更する)、次の情報を参考にしてください。

補足:VS.NET 2005からは、以上の設定はデプロイメントプロジェクトのプロパティで変更できるようになるようです。

設定ファイルの上書きを防ぐ

注意

この記事の最新版は「設定ファイルの上書きを防ぐ 」で公開しています。

設定ファイルなどのファイルをMSIファイルで配置した場合、通常はアンインストールで削除されてしまいます。よって、RemovePreviousVersionsプロパティを使ってアップデートした時も削除され、新しいファイルに置き換わってしまいます。

これを防ぐためには、設定ファイルのPermanentプロパティをTrueにしてアンインストールで削除しないようにするか、インストーラで配置するのではなく、アプリケーション自身で設定ファイルを作成するような方法があります。ただしこのような方法では、本当にアプリケーションをアンインストールしたい時も、設定ファイルは削除されずに残ることになります。

補足:設定ファイルをアンインストールで削除させずに残す場合、そのファイルが新しいファイルで上書きされるかについては、前回説明しました。

このような問題を解消する別の方法が次のリンク先で紹介されています。

ここで紹介されている方法は、RemovePreviousVersionsプロパティで前のバージョンをアンインストールしてから新しいバージョンをインストールするのではなく、インストールしてからアンインストールするという方法です。

具体的には、OrcaでMSIファイルを開き、InstallExecuteSequenceテーブルにあるRemoveExistingProductsアクションのSequence番号を一番最後になるように設定します。通常はInstallFinalizeアクションが最後で、そのSequence番号は6600ですので、それ以上の数(6700など)にして、保存します。

コメント



ページ情報
  • カテゴリ : .NET
  • 作成日 : 2005-10-20 (木) 18:00:00
  • 作成者 : DOBON!
  • 最終編集日 : 2010-03-22 (月) 02:51:18
  • 最終編集者 : DOBON!
[ トップ ]   [ 編集 | 凍結 | 差分 | バックアップ | 添付 | 複製 | 名前変更 | リロード ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]