自定义结构化存储IPropertySetStorage

我正在尝试添加一个 IPropertySetStorage 添加到现有 IStorage 文件。我计划编写的属性和它们的值将根据我的设计进行定制(我可能会存储几个整数,几个字符串等)。我不是想要符合任何现有的 IStorage 文件类型。

API及其文档感觉针对现有的文件格式。这是习惯性的,因此(迄今为止)我发现的例子只是令人困惑。

问题(S)

On IPropertySetStorage::Create

  1. (param 1) What FMTID do I pass? Can it be all zeros on the data fields? Can I just make it up?
  2. (param 2) Can CLSID be a nullptr? If not, what should it be? Do I need to figure out what values the parent IStorage used?
  3. (param 3) What propset flag would be best? I'm thinking because I'll be storing string, I should use PROPSETFLAG_DEFAULT.
  4. (param 4) The IStorage handle is open for read (I'm running like a plugin to an existing runtime). My best guess right now is to use STGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE. But I've been getting STG_E_INVALIDFLAG

请注意,我还没有能够在 IStorage 上创建一个新的 IPropertySetStorage ,但我已经成功创建了一个自定义 IStream ,并且在稍后打开时从它读取。

任何与我正在做的事情更相关的教程链接都会非常感谢。

EDIT Note that my code is called from an existing application, working on existing files. When my code is called, I am passed the file's root IStorage. Here is all of my code with that IStorage base.

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

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

正如我在#4中指出的那样,它返回 <�代码> STG_E_INVALIDFLAG </代码>

1
额外 编辑
意见: 3
@Xearinox当我粘贴所有相关的代码时,我注意到我正在以READ模式打开存储器(我首先创建了一个存储子容器的存储器),而不是RW(创建RW时,但不在已经存在时)。这导致道具组的创建失败。这看起来可能很愚蠢,但如果你将这个细节作为答案发布(确保在FW模式下打开你自己的存储),我想给你一个信用,因为它是你的要求,以获得更多的信息,帮助我找到它。还请注意,我仍然希望获得更多关于参数的信息,正如我在原始问题中所详述的那样。谢谢。
额外 作者 payo,
请粘贴完整的代码。我的代码适用于你的代码片段。
额外 作者 Xearinox,
Tommorow我做了一些研究。我会给你结果。 :-)
额外 作者 Xearinox,

1 答案

(特别感谢@Xearinox)

当我粘贴所有相关的代码时,我注意到我正在以READ模式打开我的存储器(我首先创建一个存储子容器),而不是RW(创建RW时,但不在已经存在时)。这导致道具组的创建失败。

// see STGM_READWRITE (fix)
rootStg->OpenStorage(name, nullptr, STGM_READWRITE | STGM_SHARE_EXCLUSIVE, nullptr, 0, &spIStg);
spIStg->QueryInterface(IID_IPropertySetStorage, reinterpret_cast(&pPropSetStg));    

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