2016-09-23 474 views
0

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

对于实验,我试图直接使用WinAPI打开相同的文件(从C++应用程序),它工作正常。

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

我使用的是Windows 10和VS2012与.NET 4.5

任何提示,它可能是什么? PS:实际上,从一开始我就试图互操作WinAPI,我已经得到了这个结果。使用DTF试图说明我最终错误的选择。

更新:我检查执行与和的ProcessMonitor已经看到的CreateFile失败共享冲突: 所需的访问:通用读/写 配置:打开 选项:同步IO非警觉,非目录文件 属性:N ShareMode:阅读 AllocationSize:N/A

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

+0

它看起来像你的更新应该是一个答案:该文件已经在其他地方打开。如果这让你感到意外,你应该添加更多关于该场景的细节,包括为什么你认为它不应该已经公开。 –

+0

我同意迈克尔,文件必须有一个锁。你能发布你使用的实际代码吗?您是否尝试以只读方式打开文件? –

回答

0

从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) 
} 

我会尝试用不同的DatabaseOpenModes两类只读Transact直接,创建,CreateDirect)。