2010-06-18 4 views
1

Мне нужно обновить столбец атрибутов в файле MSI. К сожалению, я не могу найти документацию (особенно для C++).Обновление таблицы MSI с использованием API программирования MSI

Вот фрагмент код, что я пытаюсь сделать:

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 приводит к бесконечному циклу.

Спасибо за помощь,
Ованес

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^