Windows installer Javascript MSI自动化-关闭数据库

Windows installer Javascript MSI自动化-关闭数据库,windows-installer,Windows Installer,我正在维护一些从Javascript文件(.js)中提取MSI数据库的构建脚本。守则基本上是: { var oTargetDB = g_oInstaller.openDatabase("mymsi.msi", msiOpenDatabaseModeReadOnly); var oView = oTargetDB.openView(...); oView.execute(); oView.close(); } // Later... { var oTarge

我正在维护一些从Javascript文件(.js)中提取MSI数据库的构建脚本。守则基本上是:

{
    var oTargetDB = g_oInstaller.openDatabase("mymsi.msi", msiOpenDatabaseModeReadOnly);
    var oView = oTargetDB.openView(...);
    oView.execute();
    oView.close();
}
// Later...
{
    var oTargetDB = g_oInstaller.openDatabase("mymsi.msi", msiOpenDatabaseModeTransact);
}
第二个openDatabase失败,出现了非常有用的0x80004005(E_FAIL),我认为这是因为第一个openDatabase没有关闭。但是,数据库对象没有close方法。我尝试了oTargetDB=null-没有更改任何内容

如何关闭数据库,以便再次打开

编辑:

  • 我看到句柄是使用sysinternals中的handle.exe打开的,所以这肯定是问题所在
  • 延迟没有帮助(我尝试等待了很长时间,但没有帮助)
  • 由于现有脚本结构,短期脚本不是一个选项
  • Uber黑客攻击超出了此修复的范围
  • 我将不得不修改我的代码并使用(伪单例)解决方案。布莱格
将句柄设置为null适用于VB脚本,因此我不确定为什么不适用于JS。我的最佳猜测可能是您在JS实现中发现了一个bug——特别是如果您第一次以只读方式打开它,那么就不需要调用
Commit
方法来刷新任何更改


似乎表明关闭数据库只需关闭句柄。所以我猜,即使在设置oTargetDB=null之后,Javascript也不会在您再次打开它时释放句柄。您可以尝试在释放句柄后插入延迟,以查看是否是这种情况。

在这种情况下,MS忘记实现关闭方法。真正地跛脚吧?通常,设置obj=null不会执行清理操作,例如关闭操作

当我遇到这个问题时,它是从C#调用MSIDatabase对象的。需要关闭数据库(请参阅和)。不幸的是,正如您所观察到的,MS忘记在您看到的COM对象中实现。从C#,我可以打电话解锁文件

我们最终放弃了COM对象,认为它不可靠,转而使用p/invoke

如果jscript是您唯一的选择,那么您可以让脚本保持短暂的寿命—当脚本死亡时,它们会释放句柄。或者,创建一个单例来表示对象。一些uberhacker可能知道如何从jScript调用MsiCloseHandle,并识别该COM对象使用的句柄