我需要更新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
答案 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)
使用C ++有点矫枉过正。阅读DTF: