IPropertySetStorage
既存のファイルに a を追加しようとしていIStorage
ます。私が書く予定のプロパティとその値は、私のデザインに合わせてカスタマイズされます (いくつかの int やいくつかの文字列などを保存する場合があります)。IStorage
既存のファイル タイプに準拠しようとしているわけではありません。
API とそのドキュメントは、既存のファイル形式を対象としているように感じます。これはカスタムであるため、(これまでのところ) 私が見つけた例は混乱を招くだけでした。
質問
- (param 1) 何
FMTID
を渡しますか? データ フィールドをすべてゼロにすることはできますか? 私はそれを補うことができますか? - (param 2) CLSID は
nullptr
? そうでない場合、それは何ですか?親が使用した値を把握する必要がありIStorage
ますか? - (param 3) どの propset フラグが最適でしょうか? 文字列を格納するので、 を使用する必要があると考えています
PROPSETFLAG_DEFAULT
。 - (param 4)
IStorage
ハンドルは読み取り用に開いています (既存のランタイムへのプラグインのように実行しています)。今のところ私の最善の推測は、を使用することSTGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE
です。しかし、私は得ていますSTG_E_INVALIDFLAG
現時点ではまだ新しいを作成できていませIPropertySetStorage
んIStorage
が、カスタムを正常に作成し、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
。