- 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を行う前に解放することでうまくいきました。
本当にありがとうございました。
|