Installer :: OpenDatabase()使用msiOpenDatabaseModeTransact生成类型错误

时间:2008-11-28 12:44:47

标签: c++ com windows-installer

以下代码产生错误hr = 0x80020005(错误类型)。

#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构造函数执行了很多检查,因此我无法将int伪装成 一个char *很容易。

有没有人试图在C ++中使用这种方法?

修改

我的msi.dll版本是3.1.4000.2805,我的系统是XP SP 2,代码应该在任何装有XP或Vista的机器上运行。

欢迎来到MSDN文章的网址。

在同一台机器上,调用低级别的等价物:

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

完美无缺。

2 个答案:

答案 0 :(得分:2)

我终于得到了msdn forums

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

答案 1 :(得分:1)

MSDN表示OpenDatabase可从MSI版本4.0开始提供,transactions通常从MSI 4.5开始提供。只是预感,但可能是你的MSI已经过时了吗?我曾经因过时的MSI版本而遇到一些神秘的麻烦。