2011/10/24

access2010 パッケージソリューションウィザード その16 msiファイル更新

VBSでできるんだからVBAでできるだろうと。
access2010のパッケージソリューションウィザードで出力したインストールファイルは、ちょっとダメな子で、信頼できる場所に関するレジストリが2007仕様になっている。そこで、ウィザード中に正確な追加レジストリを設定してあげると問題なくインストールに使用できるのだけど、もともと生成されているレジストリ情報はそのままだからそれを更新してしまおうという魂胆。ウィザード設定ファイルに残るわけではないから、ちゃちゃっとすませたいときにでも使おうかな。
14.0 であるべきなのに 12.0 になってる。これを更新する。

Const msiOpenDatabaseModeReadOnly = 0
Const msiOpenDatabaseModeTransact = 1
Const msiViewModifyInsert = 1
Const msiViewModifyUpdate = 2
Const msiViewModifyDelete = 6

Sub Correct12to14(msiFullPath As String)
    Dim Installer As Object, _
        msiDB As Object, msiQuery As String, _
        msiView As Object, msiRecord As Object
    
    Set Installer = CreateObject("WindowsInstaller.Installer")
    
    Set msiDB = Installer.OpenDatabase(msiFullPath, _
                                       msiOpenDatabaseModeTransact)
    msiQuery = "SELECT * FROM Registry WHERE Registry = 'TrustedLocationReg'"
    Set msiView = msiDB.OpenView(msiQuery)
    msiView.Execute
    Set msiRecord = msiView.Fetch
    msiRecord.StringData(3) = Replace(msiRecord.StringData(3), _
                                      "12.0", _
                                      "14.0")
    msiView.Modify msiViewModifyUpdate, msiRecord
    msiDB.Commit
End Sub
これで 14.0 access2010用になる。なんども試してはいなけど。
ちょっとおまけ的なところで、ダイアログを調整。
Sub HideCustomControls(msiFullPath As String)
    Dim Installer As Object, _
        msiDB As Object, msiQuery As String, _
        msiView As Object, msiRecord As Object
    
    Set Installer = CreateObject("WindowsInstaller.Installer")
    Set msiDB = Installer.OpenDatabase(msiFullPath, _
                                       msiOpenDatabaseModeTransact)
    msiQuery = "SELECT Attributes FROM Control " & _
                    "WHERE Dialog_ ='SetupTypeDlg' AND (" & _
                          "Control = 'CustomButton' OR " & _
                          "Control='CustomLabel' OR " & _
                          "Control='CustomText')"
    Set msiView = msiDB.OpenView(msiQuery)
    msiView.Execute
    Do
        Set msiRecord = msiView.Fetch
        If msiRecord Is Nothing Then Exit Do
        msiRecord.StringData(1) = "0"
        msiView.Modify msiViewModifyUpdate, msiRecord
    Loop
    msiDB.Commit
End Sub
一部消してみた
その他まとめはこっち。

0 件のコメント: