2016-09-23 55 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)。