以下代码产生错误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);
完美无缺。
答案 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版本而遇到一些神秘的麻烦。