2010-06-18 22 views
1

J'ai besoin de mettre à jour une colonne Attributs dans un fichier MSI. Malheureusement, je suis incapable de trouver de la documentation (en particulier pour C++).Mise à jour de la table MSI à l'aide de l'API de programmation MSI

Voici un extrait de code de ce que je suis en train de faire:

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 

Comme indiqué sur Record-> Modifier (...) jeter un _com_error indiquant: erreur IDispatch # 1000? Qu'est-ce que ça veut dire. Où puis-je rechercher ces codes d'erreur? Ce ne sont pas des HRESULT ...

Mais des questions plus importantes sont comment mettre à jour l'enregistrement correctement? Comment puis-je parcourir tous les enregistrements sélectionnés? Faire une nouvelle extraction et comparer l'enregistrement avec des résultats NULL dans une boucle infinie.

Merci pour l'aide,
Ovanes

Répondre

0

Ok, a trouvé le problème :(

J'ai ouvert la base de données dans le mode lecture seule

Voici le Snipped qui fonctionne.:

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

Espérons que ça aide à quelqu'un

Ovanes