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.