Актуализирайте MSI таблицата с помощта на API за програмиране на MSI

Трябва да актуализирам колона с атрибути в MSI файл. За съжаление, не мога да намеря никаква документация (особено за 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 води до безкраен цикъл.

Благодаря за помощта,
Ованес


person ovanes    schedule 18.06.2010    source източник


Отговори (2)


Използването на C++ за това е малко пресилено. Прочетете на DTF:

person Stein Åsmul    schedule 24.08.2014

Добре, намерих проблема :(

Отворих базата данни в режим само за четене.

Ето изрезката, която работи:

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();

Надявам се това да помогне на някого.

Ованес

person ovanes    schedule 18.06.2010