Comments
Description
Transcript
Windows Installer Programming
Installation Technology Overview -Ⅱ Masato Hirai System Engineer Microsoft Co., Ltd. Windows Installer Agenda Windows Installer Overview Windows Installer SDK Windows Installer Programming Visual Studio Installer Questions and Answers Windows Installer Overview Windows Installer 概要 OSでサポートさせるインストレーション サービス Windows NT のシステム サービス(NT4.0, Win2000) Windows 95/98 は個別プロセスとして起動 標準的なインストール機能を提供 インストール時のトラブルを防ぎ、メンテナンスを容易にする セットアップ ロジックの再利用性を高める トランザクションベースのインストール ロールバック機能による中断、失敗時の完全復元 上書き・削除ファイルの復活やレジストリの復元 インストールの拡張性 カスタムアクションによりインストール時のカスタマイズが可能 トランスフォームによるインストール パッケージのカスタマイズが容易 機能の有効化・無効化 Installer API, COM インターフェイスを提供 Windows Installerのすべての機能へアクセス可能 アプリケーション自身によるインストール状態の問い合わせ・変更や セットアップ、再インストール、修復セットアップ、アップデート…が可能 Windows Installer アーキテクチャー User 権限 Client Install Engine インストール トランザクション インストレーション データベース xxx.MSI ロールバック ロールバック用 ディスクスペース Install Service MSIServer (Windows Installer) Administrator 権限 Windows Installer 用語 プロダクト ~Product~ インストールする対象 = 製品 フィーチャー ~Feature~ ユーザーが選択できる最小単位 "非表示"・"必須"の指定が可能 フィーチャーはネストできる 機能レベルを決めることによりフィーチャーはインストールされる 最小、標準、完全、カスタム インストール コンポーネント ~Component~ 開発者から見たインストール・削除の最小単位(ユーザには不可視) フィーチャー間で共有される 1つ以上のファイル、ショートカット、レジストリエントリをもつ ランタイム モジュールなど コンポーネント内のすべてのファイルは同じディレクトリへ Windows Installer プロダクト・フィーチャー・コンポーネント プロダクト フィーチャー A フィーチャー B フィーチャー C コンポーネントA a1.exe フィーチャー X コンポーネントB b1.dll b2.dll コンポーネントC c1.exe コンポーネントD d1.exe c1.dll d1.tlb Shortcut CLSID ODBC NT Service Font Windows Installer フィーチャーのインストール状態 INSTALLSTATE_LOCAL ローカルマシンにインストールされている [マイ コンピュータから実行] よく使用する機能やパフォーマンスを重視する機能 INSTALLSTATE_SOURCE CDまたはネットワークから実行される [ネットワークから実行] または [CD-ROMから実行] 膨大なメディアファイルやデータファイル INSTALLSTATE_ABSENT インストールされていない [インストールしない] INSTALLSTATE_ADVERTESED アドバタイズ状態 フィーチャーは利用可能だがインストールされていない [初めて実行するときにインストール] 使用頻度の少ない機能 Windows Installer インストレーション データベース インストールに関する情報・実態を格納するファイル プロダクト・フィーチャー・コンポーネントの情報を含んでいる インストール時のダイアログ、スクリプトを含んでいる 複数のテーブルによるリレーショナル データベース 情報はすべて各テーブルに収められている MSI ファイル拡張子 MSIEXEC.EXEと関連付けされている xxx.MSI ファイルから直接起動できる OLEのストレージ ファイル構造 SDK付属のツールで作成・閲覧できる xxx.MSI Feature Feature Component Feature Class Feature Shortcut Feature File Windows Installer インストレーション データベース テーブル Property プロダクトのプロパティ Feature フィーチャーに関する情報 Component コンポーネントの情報 FeatureComponents FeatureとCompornentの対応関係 File インストールするファイルの情報 多対1でComponentにリンク Class COMサーバーについての情報 1対1でComponentにリンク Registry コンポーネントのレジストリエントリ 多対1でComponentにリンク SelfReg COMの登録(下位互換性) Shortcut 作成するショートカット 多対1でComponentにリンク TypeLib タイプライブラリの登録 多対1でComponentにリンク Windows Installer マージモジュール インスト-ルの再利用ライブラリ 再配布可能ランタイムのインストールを標準化する ランタイムモジュールの配布に最適 MSM 拡張子を持つ1つのファイル VB, VCなどのランタイム モジュール 各OCX, MDAC など 単体インストールとしては実行できない パッケージの中に取り込むような形で利用する 特徴 マージ モジュールは1つの GUID を持つ カスタム アクションとダイアログの構成が可能 フィーチャーを構成することはできない Windows Installer SDK Windows Installer SDK Windows Installer 1.0 SDK Platform SDK Components for Windows Installer Developers http://msdn.microsoft.com/developer/sdk/wininst.asp Redistributables (2.6MB) Windows NT4.0, Windows95/98用のMSIEXEC ランタイム Windows Installer Help (1.1MB) Windows Installer, Tools ドキュメント (HTML-Help) Validation Tool (0.5MB) MSI データベース検証ツール Database Files (0.9MB) スキーマ用、サンプル用のインストレーション データベース(.MSIファイル) Database Tool (1.9MB) Databaseオーサリングツール、テーブルエディタ Development Tools (1.8MB) includeファイル、LIBファイル、ヘッダーファイル VBScript Tools (0.2MB) Windows Scripting Host サンプル Sample Products (2.5MB) MsiSpy ツール Code Sample (52KB) Installer API を使ったサンプル Windows Installer SDK SDK Tools Orca グラフィカルな MSIテーブル エディタ MsiDb MSIデータベースの インポート、エクスポート ツール MsiSpy MSIデータベース ブラウザ ツール Windows Installer Programming Windows Installer Programming 準備 ~はじめに~ API, COM Interface のリファレンス Windows Installer 1.0 SDK ヘルプ "MSI.CHM" API COM → ヘルプの[Installer Functions] → ヘルプの[Automation Interface] Visual C++ インクルード ファイル ライブラリ ファイル サンプル コード → ¥MsiIntel.SDK¥Include → ¥MsiIntel.SDK¥Lib → ¥MsiIntel.SDK¥Samples Visual Basic, VBA, VBSctript… ProgID → "WindowsInstaller.Installer" 参照設定 → "Microsoft Windows Installer Object Library" タイプライブラリ → "msi.dll" サンプル、API 宣言 → なし Windows Installer Programming Windows Installer API (一部) MsiInstallProduct MsiConfigureProduct MsiReinstallProduct MsiConfigureFeature MsiReinstallFeature MsiInstallMissingComponent MsiInstallMissingFile MsiProvideComponent MsiProvideQualifiedComponent MsiProvideQualifiedComponentEx MsiGetComponentPath MsiLocateComponent MsiCollectUserInfo MsiUseFeature MsiUseFeatureEx MsiGetProductCode MsiOpenProduct MsiOpenPackage MsiGetProductProperty MsiGetFeatureInfo MsiVerifyPackage MsiEnumProducts MsiEnumFeatures MsiEnumComponents MsiEnumClients MsiEnumComponentQualifiers MsiQueryFeatureState MsiGetFileVersion MsiQueryProductState MsiGetFeatureUsage MsiGetProductInfo MsiGetUserInfo MsiSetInternalUI MsiSetExternalUI MsiEnableLog MsiCloseHandle MsiCloseAllHandles MsiApplyPatch Windows Installer Programming オブジェクト モデル Installer 最上位のオブジェクト Windows Installer の機能を管理する Session FeatureInfo Database View SummaryInfo UIPreview Record SummaryInfo StringList Record 文字列のコレクション Record Windows Installer Programming インストール 'MsiSpy Const MSI_FILE = "c:¥MsiIntel.SDK¥SampProd¥MsiSpy.msi" '-------------------------------------------------' Windows Installer API '-------------------------------------------------Private Declare Function MsiInstallProduct Lib "msi.dll" _ Alias "MsiInstallProductA" (ByVal szPackagePath As String, _ ByVal szCommandLine As String) As Long Private Declare Function MsiSetInternalUI Lib "msi.dll" _ (ByVal dwUILevel As WindowsInstaller.MsiUILevel, _ phWnd As Long) As Long Dim n As Long, hw As Long hw = Me.hWnd n = MsiSetInternalUI(msiUILevelFull, hw) n = MsiInstallProduct(MSI_FILE, vbNullString) n = MsiSetInternalUI(msiUILevelNoChange, ByVal 0&) '-------------------------------------------------' Windows Installer COM Interface '-------------------------------------------------- Dim oWI As WindowsInstaller.Installer Set oWI = CreateObject("WindowsInstaller.Installer") oWI.UILevel = msiUILevelFull oWI.InstallProduct MSI_FILE, "" Windows Installer Programming アプリケーションの自動修復 Const guidPROD = "{9BBF15D0-1985-11D1-9A9D-006097C4E489}" 'MsiSpy '-------------------------------------------------' Windows Installer API '-------------------------------------------------Private Declare Function MsiReinstallProduct Lib "msi.dll" _ Alias "MsiReinstallProductW" (ByVal szProduct As Long, _ ByVal dwReinstallMode As Long) As Long Dim n As Long, hw As Long hw = Me.hWnd n = MsiSetInternalUI(msiUILevelFull, hw) n = MsiReinstallProduct(StrPtr(guidPROD), _ msiReinstallModeFileMissing) n = MsiSetInternalUI(msiUILevelNoChange, ByVal 0&) '-------------------------------------------------' Windows Installer COM Interface '-------------------------------------------------- Dim oWI As WindowsInstaller.Installer Set oWI = CreateObject("WindowsInstaller.Installer") oWI.UILevel = msiUILevelBasic oWI.ReinstallProduct guidPROD, msiReinstallModeFileMissing '-------------------------------------------------' MSIEXEC.EXE '-------------------------------------------------- Shell "MSIEXEC.EXE /fp " & guidPROD & " /qb", vbNormalFocus Windows Installer Programming プロダクトの列挙 '-------------------------------------------------' Windows Installer API '-------------------------------------------------Private Declare Function MsiEnumProducts Lib "msi.dll" _ Alias "MsiEnumProductsW" (ByVal iProductIndex As Long, _ ByVal lpProductBuf As Long) As Long Const ERROR_SUCCESS = 0 Dim k As Long, buf As String Do buf = String$(40, vbNullChar) If MsiEnumProducts(k, StrPtr(buf)) <> ERROR_SUCCESS Then Exit Do List1.AddItem buf k = k + 1 Loop '-------------------------------------------------' Windows Installer COM Interface '-------------------------------------------------Dim oWI As WindowsInstaller.Installer Dim oST As WindowsInstaller.StringList, lst As Variant Set oWI = CreateObject("WindowsInstaller.Installer") Set oST = oWI.Products For Each lst In oST List1.AddItem lst Next lst Windows Installer Programming プロダクト情報の取得 Const guidPROD = "{00000411-78E1-11D2-B60F-006097C998E7}" 'Office2000 '-------------------------------------------------' Windows Installer API '-------------------------------------------------Private Declare Function MsiGetProductInfo Lib "msi.dll" _ Alias "MsiGetProductInfoA" (ByVal szProduct As String, _ ByVal szProperty As String, ByVal lpValueBuf As String, _ pcchValueBuf As Long) As Long Dim n As Long, p As Long, buf As String buf = String$(128, vbNullChar): p = 128 n = MsiGetProductInfo(guidPROD, "ProductID", buf, p) List1.AddItem buf buf = String$(128, vbNullChar): p = 128 n = MsiGetProductInfo(guidPROD, "VersionString", buf, p) List1.AddItem buf '-------------------------------------------------' Windows Installer COM Interface '-------------------------------------------------Dim oWI As WindowsInstaller.Installer Set oWI = CreateObject("WindowsInstaller.Installer") List1.AddItem oWI.ProductInfo(guidPROD, "InstalledProductName") List1.AddItem oWI.ProductInfo(guidPROD, "VersionString") List1.AddItem oWI.ProductInfo(guidPROD, "RegOwner") List1.AddItem oWI.ProductInfo(guidPROD, "RegCompany") Windows Installer Programming フィーチャーの使用頻度 Const guidPROD = "{00000411-78E1-11D2-B60F-006097C998E7}" 'Office2000 '-------------------------------------------------' Windows Installer API '-------------------------------------------------- Dim n As Long, uc As Long, du As Integer MsiUseFeatureEx guidPROD, "WORDFiles", _ msiInstallModeNoDetection, 0 MsiGetFeatureUsage guidPROD, "WORDFiles", uc, du Text1 = uc Text2 = CDate((du And &H3E00) / (2 ^ 9) + 1980 & "/" & _ (du And &H1E0) / (2 ^ 5) & "/" & _ (du And &H1F)) '-------------------------------------------------' Windows Installer COM Interface '-------------------------------------------------- Dim oWI As WindowsInstaller.Installer Set oWI = CreateObject("WindowsInstaller.Installer") Text1 = oWI.FeatureUsageCount(guidPROD, "WORDFiles") Text2 = oWI.FeatureUsageDate(guidPROD, "WORDFiles") oWI.UseFeature guidPROD, "WORDFiles", _ msiInstallModeNoDetection Set oWI = Nothing Windows Installer Programming コンポーネントのPathの取得 Const guidPROD = "{9BBF15D0-1985-11D1-9A9D-006097C4E489}" Const guidCOMP = "{5CB2D5F3-19DD-11D1-9A9D-006097C4E489}" 'MsiSpy 'MsiSpy.exe '-------------------------------------------------' Windows Installer API '-------------------------------------------------- Dim buf As String, p As Long, FileName As String buf = String$(256, vbNullChar): p = 256 MsiGetComponentPath guidPROD, guidCOMP, buf, p FileName = Left$(buf, InStr(buf, vbNullChar) - 1) buf = String$(256, vbNullChar): p = 256 MsiProvideComponent guidPROD, "UserInterface", _ guidCOMP, msiInstallModeDefault, buf, p FileName = Left$(buf, InStr(buf, vbNullChar) - 1) '-------------------------------------------------' Windows Installer COM Interface '-------------------------------------------------- Dim oWI As WindowsInstaller.Installer, FileName As String Set oWI = CreateObject("WindowsInstaller.Installer") oWI.UILevel = msiUILevelNone FileName = oWI.ComponentPath(guidPROD, guidCOMP) FileName = oWI.ProvideComponent( _ guidPROD, "UserInterface", _ guidCOMP, msiInstallModeDefault) Windows Installer Programming フィーチャーの列挙とステータス情報 Const guidPROD = "{00000411-78E1-11D2-B60F-006097C998E7}" 'Office2000 '-------------------------------------------------' Windows Installer COM Interface '-------------------------------------------------Dim oWI As WindowsInstaller.Installer, lst As Variant Set oWI = CreateObject("WindowsInstaller.Installer") For Each lst In oWI.Features(guidPROD) If GetFeatureInfo(oWI, guidPROD, lst) = "ASSISTANTFiles" Then List1.AddItem lst & vbTab _ & FrendlyName(oWI.FeatureState(guidPROD, lst)) End If Next Function GetFeatureInfo(oWinInst As WindowsInstaller.Installer, _ ByVal sGUID As String, ByVal FeatureName) As String GetFeatureInfo = oWinInst.FeatureParent(sGUID, FeatureName) End Function Function FrendlyName(ByVal State As Select Case State Case msiInstallStateAbsent: Case msiInstallStateAdvertised: Case msiInstallStateLocal: Case msiInstallStateSource: Case Else: End Select End Function MsiInstallState) As String FrendlyName FrendlyName FrendlyName FrendlyName FrendlyName = = = = = "インストールしない" "初めて実行するときにインストール" "マイ コンピュータから実行" "CD-ROMまたはネットワークから実行" "不明" Windows Installer Programming フィーチャーのステータス変更 'Office2000 Const guidPROD = "{00000411-78E1-11D2-B60F-006097C998E7}" '-------------------------------------------------' Windows Installer COM Interface '-------------------------------------------------- Dim oWI As WindowsInstaller.Installer Dim StateArr As Variant Dim idx As Long StateArr = Array(msiInstallStateLocal, _ msiInstallStateSource, _ msiInstallStateAdvertised, _ msiInstallStateAbsent) For idx = 0 To 3 If Option1(idx).Value = True Then Exit For Next Set oWI = CreateObject("WindowsInstaller.Installer") oWI.UILevel = msiUILevelNone oWI.ConfigureFeature guidPROD, "EXCELFiles", StateArr(idx) Set oWI = Nothing Visual Studio Installer Visual Studio Installer 1.0 Visual Studio Installer 1.0 紹介 Windows Installer に対応したオーサリングツール 入手方法 Windows 2000 Developer's Readiness Kit Free Download (18.3MB) 英語版 http://msdn.microsoft.com/vstudio/downloads/vsi/default.asp Visual Studio 6.0 製品の Professional 版以上の ライセンスが必要 VS 6.0 SP3が必要 日本語版は年内に リリース予定! Visual Studio Installer 1.0 機能と制限 機能 Visual Studio (VID/ VJ) のシェルにインテクグレート VB, VC のみの環境用にシェルを提供 Mix Languageのサポート Visual Basic、Visual C++ & Visual J++ (.exe, .dll) ウィザード ライクなテンプレート Visual Basicのプロジェクト(*.vbp)から作成 制限 サポートしていない機能 カスタム UI, ダイアログ、カスタム スクリプトの実行 インストール後のアクション(Readme の表示、オンライン登録…) フィーチャーは1つのみ コンポーネントの最大数は800 FDで Bootstrap Loader を含めることは不可 Backslash(¥)と DBCS はレジストリキーに使えない Windows Installer Action Windows Installer SDKを入手しましょう! http://msdn.microsoft.com/developer/sdk/wininst.asp セットアップ オーサリング ツールを入手しましょう! Wise for Windows Installer http://www.wisesolutions.com/wfwi InstallShield for Windows Installer http://www.InstallShield.com/iswi Visual Studio Installer http://msdn.microsoft.com/vstudio/downloads/vsi/default.asp インストール パッケージを作ってみましょう! Installer の機能をアプリにインプリメントしましょう! Thanks For Attending ! Masato Hirai System Engineer Microsoft Co., Ltd.