1

IPropertySetStorage既存のファイルに a を追加しようとしていIStorageます。私が書く予定のプロパティとその値は、私のデザインに合わせてカスタマイズされます (いくつかの int やいくつかの文字列などを保存する場合があります)。IStorage既存のファイル タイプに準拠しようとしているわけではありません。

API とそのドキュメントは、既存のファイル形式を対象としているように感じます。これはカスタムであるため、(これまでのところ) 私が見つけた例は混乱を招くだけでした。

質問

の上IPropertySetStorage::Create

  1. (param 1) 何FMTIDを渡しますか? データ フィールドをすべてゼロにすることはできますか? 私はそれを補うことができますか?
  2. (param 2) CLSID はnullptr? そうでない場合、それは何ですか?親が使用した値を把握する必要がありIStorageますか?
  3. (param 3) どの propset フラグが最適でしょうか? 文字列を格納するので、 を使用する必要があると考えていますPROPSETFLAG_DEFAULT
  4. (param 4)IStorageハンドルは読み取り用に開いています (既存のランタイムへのプラグインのように実行しています)。今のところ私の最善の推測は、を使用することSTGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATEです。しかし、私は得ていますSTG_E_INVALIDFLAG

現時点ではまだ新しいを作成できていませIPropertySetStorageIStorageが、カスタムを正常に作成し、IStream後で開いてから読み取ることに注意してください。

私がやっていることにより関連するチュートリアルへのリンクは、非常に高く評価されます。

編集私のコードは既存のアプリケーションから呼び出され、既存のファイルで作業していることに注意してください。コードが呼び出されると、ファイルの root が渡されますIStorage。これが、そのベースを使用したすべてのコードですIStorage

rootStg->OpenStorage(name, nullptr, STGM_READ | STGM_SHARE_EXCLUSIVE, nullptr, 0, &spIStg);
spIStg->QueryInterface(IID_IPropertySetStorage, reinterpret_cast<void**>(&pPropSetStg));    

pPropSetStg->Create(
  ::FMTID_UserDefinedProperties, 
  nullptr, 
  PROPSETFLAG_DEFAULT, 
  STGM_CREATE|STGM_READWRITE|STGM_DIRECT|STGM_SHARE_EXCLUSIVE , 
  &pPropStg);

#4 で指摘したように、これは を返しますSTG_E_INVALIDFLAG

4

1 に答える 1