【问题标题】:MsiOpenDatabase does not open an MSI-file (error code 110)MsiOpenDatabase 未打开 MSI 文件(错误代码 110)
【发布时间】:2016-09-23 16:34:48
【问题描述】:

我在这里有一个奇怪的效果。 我正在尝试使用 DTF 程序集打开现有的 MSI 文件,它返回错误代码 110 (ERROR_OPEN_FAILED)。如果我试图通过 MsiGetLastErrorRecord 获取最后一个错误 - 它返回 0,即没有错误。

为了实验,我尝试直接使用 WinAPI(从 C++ 应用程序)打开同一个文件,它工作正常。

据我所知,很多人都在使用 DTF,我想它没有错误,所以应该是我的系统/配置有问题。

我正在使用带有 .NET 4.5 的 Windows 10 和 VS2012

任何提示,可能是什么?

PS:实际上,从一开始我就尝试自己互操作 WinAPI,我得到了这个结果。使用 DTF 是为了说明我最终错误的交互选项。

更新:我用 ProcessMonitor 检查了执行情况,发现 CreateFile 因共享违规而失败: 所需访问权限:通用读/写 处置: 开放 选项:同步 IO 非警报、非目录文件 属性:N 共享模式:阅读 分配大小:不适用

更新 2:这是最愚蠢的错误之一。问题是因为打开了数据库的属性是从设计模式触发的。 现在问题解决了。谢谢大家的帮助!

【问题讨论】:

  • 看起来您的更新应该是一个答案:该文件已在其他地方打开。如果这让您感到惊讶,您应该添加有关该场景的更多详细信息,包括您认为它不应该已经打开的原因。
  • 我同意迈克尔的观点,文件必须锁定。您也可以发布您使用的实际代码吗?您是否尝试以只读方式打开文件?

标签: c# .net wix windows-installer


【解决方案1】:

来自 DTF 帮助文件

using (Database db = new Database("product.msi", DatabaseOpenMode.ReadOnly))
    {        string value = (string) db.ExecuteScalar(
        "SELECT `Value` FROM `Property` WHERE `Property` = '{0}'", propName);
    }

这显然应该在只读模式下工作,无论文件是否被锁定在别处。还有一个方便的 InstallPackage 类,可以在压缩或未压缩产品布局的上下文中处理文件和文件柜:

using (InstallPackage pkg = new InstallPackage("d:\builds\product.msi",
DatabaseOpenMode.Transact))     
{
   //(find the rest of the sample in the DTF help file)
}

我会尝试使用不同的 DatabaseOpenModesReadOnlyTransactDirect创建创建直接)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    相关资源
    最近更新 更多