Следующий код выдает ошибку 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);
отлично работает.