2013-05-02 54 views
3

我所有的MSI安裝在驗證過程中都顯示相同的ICE81「故障」,但我無法弄清楚是什麼導致了它。無論使用哪個MSI編輯器運行驗證(MS Orca,Flexera InstallShield,InstEdit.com),都會發生這種情況。我的所有安裝包都使用位於正確位置(與MSI文件相同的文件夾)的外部CAB文件,並且所有CAB文件都使用與MSI文件簽名的相同數字簽名(以及Media,MsiDigitalCertificate,MsiDigitalSignature,和MsiPatchCertificate表似乎是正確創作)。MSI驗證返回「ICE81故障ICE內部錯誤1867. API返回:1615」。

ICE81 Failure ICE Internal Error 1867. API Returned: 1615.  MSIEditor_full_path\darice.cub 
ICE81 Failure Error 2228: C:\Users\my_user_name\AppData\Local\Temp\random_tmp_filename.tmp, feature_name, SELECT `DiskId`, `Cabinet` FROM `Media` WHERE (`DiskId` = cab_name.cab)  MSIEditor\darice.cub 

任何想法?

回答

3

錯誤是ERROR_BAD_QUERY_SYNTAX這意味着「SQL查詢語法無效或不受支持」。因此,ICE正在驗證您的MSI失敗的內部SQL查詢。查看查詢,唯一可能失敗的部分是查詢:WHERE DiskId=cab_name.cab

仔細看問題是,cab_name.cab是一個字符串,這意味着它應該被括在單引號中。換句話說,它應該看起來像:'cab_name.cab'。那麼爲什麼ICE沒有正確引用字符串呢?那麼,這就是答案。

Media表的DiskId列應該是一個數字。以某種方式cab_name.cab插入Media表的第一列,其中預計會有數字(如1)。 ICE不會在DiskId附近引用報價,因爲它期望的數字和數字不應被引用。

要解決的Media表的DiskId(第一)列改變爲正數(我喜歡1),並把在Cabinet(第四)列中的值cab_name.cab

我不確定什麼工具可以讓你把一個字符串放在一個整數列中,但是你可能會給它們發一個bug,因爲各種東西都不行。 :)