- PR -

MSIファイルの編集について

1
投稿者投稿内容
HIRO
常連さん
会議室デビュー日: 2004/10/28
投稿数: 41
投稿日時: 2006-01-11 17:56
Visual Studio .NET 2003にて作成したインストーラを編集するプログラムを作り、編集までうまくできたのですが、編集プログラムを終了させなければ編集したMSIファイルを使うことができません。CreateObjectにてWindowsInstaller.Installerを使用しているのですが、編集プログラムを終了しなくても編集したMSIファイルを使えるようにするにはどうすればいいのでしょうか?やはりAPIで書かないとダメなのでしょうか?

コード:
        Const msiOpenDatabaseModeTransact = 1

        Dim msiPath As String = "Setup.msi"

        Dim installer = CreateObject("WindowsInstaller.Installer")
        Dim database
        database = installer.OpenDatabase(msiPath, msiOpenDatabaseModeTransact)

        Dim query
        query = "INSERT INTO Property(Property, Value) VALUES('TEST', '123456')"
        Dim view
        view = database.OpenView(query)
        view.Execute()
        database.Commit()

        view.cose()
        view = Nothing
        database = Nothing
        installer = Nothing


わかられる方、ご教授願います。

WindowsXP Pro SP2
VB.NET2003 Framework1.1 SP1
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2006-01-11 21:22
こんばんは。

引用:

HIROさんの書き込み (2006-01-11 17:56) より:
Visual Studio .NET 2003にて作成したインストーラを編集するプログラムを作り、編集までうまくできたのですが、編集プログラムを終了させなければ編集したMSIファイルを使うことができません。CreateObjectにてWindowsInstaller.Installerを使用しているのですが、編集プログラムを終了しなくても編集したMSIファイルを使えるようにするにはどうすればいいのでしょうか?やはりAPIで書かないとダメなのでしょうか?



なんだかよくある間違いに起因しているようですね。

コード:
        view.cose()
        view = Nothing
        database = Nothing
        installer = Nothing


の部分を次のように変更してみてください。
コード:
        view.close()
        System.Runtime.InteropServices.Marshal.ReleaseComObject(view)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(database)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(installer)


私が実際テストした限りでは、
プログラムを終了させなくてもうまくMSIファイルを開くことができました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-11 22:10
型指定のないものばかりだったので、VBS だと思ってました...
よく見たら、As String なのが 1 箇所だけあった... orz
CLR の主役である型は、明示化しておきましょう!

COM オブジェクトの解放については以下を参照してください。

  COM オブジェクトを解放する

# cose は流石に転記ミスだと思ってました。
# 動きませんから。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
HIRO
常連さん
会議室デビュー日: 2004/10/28
投稿数: 41
投稿日時: 2006-01-12 11:36
Tdnr_Symさん、じゃんぬねっとさん返答有難うございます。

System.Runtime.InteropServices.Marshal.ReleaseComObjectを使用することは、知りませんでした。今回の件で勉強になりました。

引用:

型指定のないものばかりだったので、VBS だと思ってました...
よく見たら、As String なのが 1 箇所だけあった... orz
CLR の主役である型は、明示化しておきましょう!


VBSのサンプルから作ったので、見た目VBSですね・・・
型の明示化は、次回から気をつけます。
引用:

# cose は流石に転記ミスだと思ってました。
# 動きませんから。


おっしゃる通り転記ミスです。お恥ずかしいです。

で、教えていただいた通りCOMオブジェクトの解放を行った結果うまくいきました。

しかし、レコードを複数追加しようとOpenViewを複数使用すると、やはりプログラム終了までMSIファイルが使用できないようです。
コード:
    Const msiOpenDatabaseModeTransact = 1

        Dim msiPath As String = "Setup.msi"

        Dim installer As Object
        installer = CreateObject("WindowsInstaller.Installer")
        Dim database As WindowsInstaller.Database
        database = installer.OpenDatabase(msiPath, msiOpenDatabaseModeTransact)

        Dim query As String
        Dim view As WindowsInstaller.View

        query = "INSERT INTO Property(Property, Value) VALUES('TEST000', '123456')"
        view = database.OpenView(query)
        view.Execute()

        query = "INSERT INTO Property(Property, Value) VALUES('TEST001', '123456')"
        view = database.OpenView(query)
        view.Execute()

        database.Commit()

        view.close()
        System.Runtime.InteropServices.Marshal.ReleaseComObject(view)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(database)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(installer)



使い方の問題でしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-12 11:47
引用:

HIROさんの書き込み (2006-01-12 11:36) より:

使い方の問題でしょうか?


リンク先をもう 1 度ご覧ください。
新しい参照を格納するのであれば、その前に既に入っている参照を解放する必要があります。
(参照カウントが自動でデクリメントされないため)

もっとも確実なのは、それぞれ別の変数を使うことです。
同じ変数ですと、スコープの有効範囲の問題で構造的に判りにくくなってしまいます。
そのため、バグの温床になったりすることが多いです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
HIRO
常連さん
会議室デビュー日: 2004/10/28
投稿数: 41
投稿日時: 2006-01-12 12:04
引用:
リンク先をもう 1 度ご覧ください。
新しい参照を格納するのであれば、その前に既に入っている参照を解放する必要があります。



ん〜COMの勉強不足ですね。
次のOpenViewを行う前に解放することでうまくいきました。

本当にありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)