使用MSI编程API更新MSI表

时间:2010-06-18 13:43:46

标签: installer windows-installer record dtf

我需要更新MSI文件中的Attributes列。不幸的是,我无法找到任何文档(尤其是C ++)。

以下是我要做的事情的代码片段:

DatabasePtr db = /* opening db succeeds*/
ViewPtr view = db->OpenView(_bstr_t("SELECT Attributes FROM Component"));
view->Execute(NULL);
RecordPtr record=view->Fetch();

record->PutIntegerData(2, record->GetIntegerData(1)|2048);

// I do not exactly understand the next 2 lines
// Should I really call Execute before Modify?
record->Execute(record);
record->Modify(msiViewModifyUpdate, record); //throws a _com_error

正如记录中所述 - >修改(...)抛出_com_error说明:IDispatch错误#1000?那是什么意思。我在哪里可以查找这些错误代码?这些不是HRESULTs ......

但更重要的问题是如何正确更新记录?如何迭代所有选定的记录?执行新的提取并将记录与NULL进行比较会导致无限循环。

感谢您的帮助,
Ovanes

2 个答案:

答案 0 :(得分:0)

好的,发现了问题:(

我以只读模式打开了数据库。

这是剪辑的作品:

InstallerPtr installer(TEXT("WindowsInstaller.Installer"));
VARIANT open_flag;
VariantInit(&open_flag);
open_flag.vt = VT_I4;
open_flag.lVal = msiOpenDatabaseModeTransact;

DatabasePtr db = installer->OpenDatabase(msi_path, open_flag);
{
  ViewPtr view = db->OpenView(_bstr_t("SELECT Attributes FROM Component"));
  view->Execute(NULL);
  RecordPtr record=view->Fetch();

  if(!record) ... //error handling

  while(record)
  {
    record->PutIntegerData(1, record->GetIntegerData(1)|2048);

    record->Modify(msiViewModifyUpdate, record);
    record=view->Fetch();
  }
} //view->Close() is called implicitly
db->Commit();

希望对某人有所帮助。

Ovanes

答案 1 :(得分:0)