┏第61号━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃         .NETプログラミング研究         ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ──<メニュー>─────────────────────── ■.NET Tips ・Orcaの入手法 ・「デスクトップにショートカットを作成するかユーザーが選択でき  るようにする」の補足 ・RemovePreviousVersionsプロパティを使ってMajor Upgradeを行う  際の注意事項 -「すべてのユーザー」がデフォルトになるようにする -「すべてのユーザー/このユーザーのみ」チェックボックスを隠す -設定ファイルの上書きを防ぐ ─────────────────────────────── ─────────────────────────────── ■.NET Tips ─────────────────────────────── 今回はVS.NETのデプロイメントプロジェクトに関する過去の記事の補 足をさせていただきます。 ─────────────────────────────── ●Orcaの入手法 いまさらですが、今まで嫌というほど登場したOrcaを入手する方法を 紹介しておきます。 残念ながらOrcaは単体では配布されていません。OrcaはPlatform SDK に含まれていますので、Platform SDKをインストールすることにより、 入手できます。よってまずはPlatform SDKをインストールする必要が あります。Platform SDKは次のページからダウンロードできます。 [URL]Platform SDK Update http://www.microsoft.com/msdownload/platformsdk/sdkupdate/ [URL]Windows Server 2003 SP1 Platform SDK Web Install http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5 [URL]Windows Server 2003 SP1 Platform SDK Full Download http://www.microsoft.com/downloads/details.aspx?FamilyID=eba0128f-a770-45f1-86f3-7ab010b398a3 [URL]Windows Server 2003 SP1 Platform SDK ISO Install http://www.microsoft.com/downloads/details.aspx?FamilyID=d8eecd75-1fc4-49e5-bc66-9da2b03d9b92 インストール後、「Orca.msi」というファイルを探し、これを使って インストールします。 しかしPlatform SDKには非常に多くのファイルが含まれていますので、 かなりのサイズになります。Orcaのみを入手するためにインストール するにしては、あまりにばかげています。 幸いにも、Windows Installer SDKの古いバージョンはサイズが小さ く、まだ配布されていますので、バージョンにこだわれなければこれ をダウンロードしてインストールするのが手軽です。 [URL]Windows Installer SDK (x86) http://www.microsoft.com/downloads/details.aspx?FamilyID=e96f8abc-62c3-4cc3-93ad-bfc98e3ae4a3 [URL]Windows Installer 1.0 SDK (x86) http://www.microsoft.com/downloads/details.aspx?FamilyID=105dfc41-801e-4441-aa75-7696d794f109 [URL]Windows Installer 1.0 SDK (Alpha) http://www.microsoft.com/downloads/details.aspx?FamilyID=be81064e-a64e-4954-878f-8d462deb94f8 ─────────────────────────────── ●「デスクトップにショートカットを作成するかユーザーが選択でき るようにする」の補足 .NETプログラミング研究第58号で「デスクトップにショートカットを 作成するかユーザーが選択できるようにする」という方法を紹介しま したが、その補足をします。 この記事では、カスタムアクションを使ってシュートカットを作成す る簡単な例を示しましたが、もう少し使えるコードに修正します。前 のコードでは「すべてのユーザー」か「このユーザーのみ」かを考慮 せずに常にユーザーのデスクトップフォルダにショートカットを作成 していましたが、これを修正します。また、アンインストール時にシ ョートカットを削除するようにします。(それ以外にも幾つかの点を 変更しています。) はじめに、ユーザーインターフェイスエディタで「チェックボックス」 ダイアログを追加する点は変わりません。 次に、インストールで使用するカスタムアクションを次のような VBScriptとします。 ‥‥▽ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 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」はショートカットのリンク先の ファイル名、「アプリケーション」はショートカットの名前とします。 次にショートカットを削除するためのカスタムアクションを作成しま す。 ‥‥▽ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 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の後になるよう にします。詳しくは、次のリンクをご覧ください。 [URL]RE: RemovePreviousVersions does not work http://groups.google.co.jp/group/microsoft.public.dotnet.framework/msg/8573500622f22a7a?hl=ja& ★「すべてのユーザー」がデフォルトになるようにする 前回説明したとおり、前のバージョンのインストールが「このユーザー のみ」で、新しいバージョンを「すべてのユーザー」としてインストー ルすると、RemovePreviousVersionsプロパティは機能しません(逆に はじめが「すべてのユーザー」で「このユーザーのみ」としてインス トールする場合もダメです)。しかも、VS.NETで作成したMSIファイ ルではデフォルトが「このユーザーのみ」に固定されており、変更で きません。まずはこのデフォルトを「すべてのユーザー」に変更する 方法を紹介します。 まずデフォルトの設定を変更するために、Windows Installerのプロ パティ、ALLUSERSを2とします(注)。 [URL]ALLUSERS Property http://msdn.microsoft.com/library/en-us/msi/setup/allusers.asp 注: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_ ┃Action┃Condition ┃ ┣━━━━━╋━━━━━━━━━╋━━━╋━━━━━━━━━┫ ┃FolderForm┃AllUsersRadioGroup┃Show ┃VersionNT>=400 ┃ ┃ ┃ ┃ ┃ AND Privileged=1 ┃ ┣━━━━━╋━━━━━━━━━╋━━━╋━━━━━━━━━┫ ┃FolderForm┃AllUsersText ┃Show ┃VersionNT>=400 ┃ ┃ ┃ ┃ ┃ AND Privileged=1 ┃ ┗━━━━━┻━━━━━━━━━┻━━━┻━━━━━━━━━┛ のAction列を「Show」から「Hide」に変更することにより、常にチェ ックボックスが隠れるようになります。 もう一つの方法は、Controlテーブルでコントロールを直接制御する 方法です。ControlConditionテーブルでShowされているため、 ControlテーブルのAttributes列でVisibleフラッグをはずしても表示 されてしまいます。よって手っ取り早く非表示にする方法は、Width を0とすることでしょう。よって、次の2つの行(Height以降の列を省 略しています) ┏━━━━━┳━━━━━━━━━┳━━━━━━━━┳━┳━━┳━━━┓ ┃Dialog_ ┃Control ┃Type ┃X ┃Y ┃Width ┃ ┣━━━━━╋━━━━━━━━━╋━━━━━━━━╋━╋━━╋━━━┫ ┃FolderForm┃AllUsersRadioGroup┃RadioButtonGroup┃24┃210 ┃342 ┃ ┣━━━━━╋━━━━━━━━━╋━━━━━━━━╋━╋━━╋━━━┫ ┃FolderForm┃AllUsersText ┃Text ┃18┃186 ┃348 ┃ ┗━━━━━┻━━━━━━━━━┻━━━━━━━━┻━┻━━┻━━━┛ のWidth列を「0」とすることにより、表示されなくなります。 もっと全うな方法で行うならば(つまりControlConditionテーブルの 設定を削除し、ControlテーブルのAttributes列の値を変更する)、 次の情報を参考にしてください。 [URL]How to use the Orca database editor to remove the "Everyone" option and the "Just me" option from a Windows Installer package that you created by using Visual Studio .NET http://support.microsoft.com/kb/835460/ 補足:VS.NET 2005からは、以上の設定はデプロイメントプロジェク トのプロパティで変更できるようになるようです。 ★設定ファイルの上書きを防ぐ 設定ファイルなどのファイルをMSIファイルで配置した場合、通常は アンインストールで削除されてしまいます。よって、 RemovePreviousVersionsプロパティを使ってアップデートした時も削 除され、新しいファイルに置き換わってしまいます。 これを防ぐためには、設定ファイルのPermanentプロパティをTrueに してアンインストールで削除しないようにするか、インストーラで配 置するのではなく、アプリケーション自身で設定ファイルを作成する ような方法があります。ただしこのような方法では、本当にアプリケー ションをアンインストールしたい時も、設定ファイルは削除されずに 残ることになります。 補足:設定ファイルをアンインストールで削除させずに残す場合、そ のファイルが新しいファイルで上書きされるかについては、前回説明 しました。 このような問題を解消する別の方法が次のリンク先で紹介されていま す。 [URL]Uninstall a Previous Application Installation When Upgrading an Application with Setups Created in VS.NET - Part1 http://www.codeproject.com/useritems/msi_upgrade_uninstall.asp ここで紹介されている方法は、RemovePreviousVersionsプロパティで 前のバージョンをアンインストールしてから新しいバージョンをイン ストールするのではなく、インストールしてからアンインストールす るという方法です。 具体的には、OrcaでMSIファイルを開き、InstallExecuteSequenceテー ブルにあるRemoveExistingProductsアクションのSequence番号を一番 最後になるように設定します。通常はInstallFinalizeアクションが 最後で、そのSequence番号は6600ですので、それ以上の数(6700など) にして、保存します。 =============================== ■ここで示したコードの多くはまずC#で書き、それを「C# to VB.NET Translator」でVB.NETのコードに変換し、修正を加えたものです。 [URL]C# to VB.NET Translator http://authors.aspalliance.com/aldotnet/examples/translate.aspx ■このマガジンの購読、購読中止、バックナンバー、説明に関しては  次のページをご覧ください。  http://www.mag2.com/m/0000104516.htm ■発行人・編集人:どぼん!  (Microsoft MVP for Visual Basic, Oct 2005-Oct 2006)  http://dobon.net  dobon_info@yahoo.co.jp ■ご質問等はメールではなく、掲示板へお願いいたします。  http://dobon.net/vb/bbs.html ■上記メールアドレスへのメールは確実に読まれる保障はありません  (スパム、ウィルス対策です)。メールは下記URLのフォームメール  から送信してください。  http://dobon.net/mail.html Copyright (c) 2003 - 2005 DOBON! All rights reserved. ===============================