2008-11-28 75 views
1

以下代碼會產生錯誤hr = 0x80020005(錯誤類型)。Installer :: OpenDatabase()與msiOpenDatabaseModeTransact產生類型錯誤

#import <msi.dll> 
using namespace WindowsInstaller; 
main() 
{ 
    ::CoInitialize(NULL); 
    InstallerPtr pInstaller("WindowsInstaller.Installer"); 
    DatabasePtr pDB = pInstaller->OpenDatabase(
       "c:\\foo\\bar.msi", 
       msiOpenDatabaseModeTransact); 
} 

我想原因是幕後操縱者,有MsiOpenDatabase(),它 採取LPCTSTR作爲第二個參數。 這第二個參數可以是MSIDBOPEN_TRANSACT其定義爲

#define MSIDBOPEN_TRANSACT  (LPCTSTR)1 

我不知道是否有可能得到具有良好的內部類型作爲第二個參數的變體。 _variant_t構造函數會執行很多檢查,所以我不能僞裝成一個char *,因此很容易將int整理成 。

有沒有人試圖在C++中使用這種方法?

編輯:

我MSI.DLL的版本是3.1.4000.2805,我的系統是XP SP 2,代碼應該與XP或Vista的任何計算機上運行。

歡迎訪問MSDN文章。

在同一臺機器上,調用低級別相當於:

MsiOpenDatabase("c:\\foo\\bar.msi", MSIDBOPEN_TRANSACT); 

完美。

回答

2

我終於得到了答案上msdn forums

DatabasePtr pDB = pInstaller->OpenDatabase(
          "c:\\foo\\bar.msi", 
          (long)msiOpenDatabaseModeTransact); 
1

MSDN說OpenDatabase可從MSI 4.0版起,transactions一般從MSI 4.5起。只是一個預感,但是你的MSI過時了嗎?我曾經有過MSI版本的一些神祕麻煩。