1

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

record-> Modified(...)で述べたように、次のように_com_errorをスローします。IDispatchエラー#1000?どういう意味ですか。これらのエラーコードはどこで検索できますか?これらはHRESULTではありません...

しかし、もっと重要な質問は、レコードを適切に更新するにはどうすればよいですか?選択したすべてのレコードを反復処理するにはどうすればよいですか?新しいフェッチを実行し、レコードをNULLと比較すると、無限ループが発生します。

助けてくれてありがとう、
Ovanes

4

2 に答える 2

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

于 2010-06-18T14:26:35.870 に答える
0

これにC++を使用するのは、少しやり過ぎです。DTFを読んでください:

于 2014-08-24T07:10:57.387 に答える