Aggiornamento tabella MSI utilizzando MSI API programmazione
-
28-09-2019 - |
Domanda
Ho bisogno di aggiornare un Attributi colonna in un file MSI. Purtroppo, non riesco a trovare alcuna documentazione (esp. Per C ++).
Ecco un frammento di codice di quello che sto cercando di fare:
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
Come indicato sul record-> Modifica (...) gettare un _com_error affermando: errore IDispatch # 1000? Cosa significa. Dove posso cercare questi codici di errore? Questi non sono HRESULT ...
Ma le domande più importanti sono come faccio aggiornare il record correttamente? Come faccio a scorrere tutti i record selezionati? Facendo un nuovo prendere e confrontando il record con risultati NULL in un ciclo infinito.
Grazie per l'aiuto,
Ovanes
Soluzione 2
Ok, trovato il problema: (
Ho aperto il database in modalità di sola lettura .
Questa è la snipped che funziona:
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();
La speranza che aiuta a qualcuno.
Ovanes
Altri suggerimenti
con C ++ per questo è un po 'eccessivo. Avere una lettura su DTF: