Installer :: OpenDatabase () выдает ошибку типа с помощью msiOpenDatabaseModeTransact - PullRequest
1 голос
/ 28 ноября 2008

Следующий код выдает ошибку 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 в символ * так легко.

Кто-нибудь пытался использовать этот метод в C ++?

Изменить:

Моя версия msi.dll - 3.1.4000.2805, моя система - XP SP 2, и код должен работать на любой машине с XP или Vista.

приветствуются ссылки на статьи MSDN.

На той же машине вызов низкоуровневого эквивалента:

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

отлично работает.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2009

Я наконец получил ответ на форумах MSDN

DatabasePtr pDB = pInstaller->OpenDatabase(
                            "c:\\foo\\bar.msi", 
                            (long)msiOpenDatabaseModeTransact);
1 голос
/ 08 декабря 2008

MSDN сообщает, OpenDatabase доступен начиная с MSI версии 4.0 и выше, транзакции в целом, начиная с MSI 4.5 и выше Просто догадка, но может ли быть так, что ваш MSI устарел? Однажды у меня возникли загадочные проблемы с устаревшей версией MSI.

...