C++ 自定义结构化存储IPropertySetStorage

C++ 自定义结构化存储IPropertySetStorage,c++,com,structured-storage,C++,Com,Structured Storage,我正在尝试将添加到现有文件。我计划编写的属性及其值将根据我的设计进行自定义。我可能会存储一些int、一些字符串等。我不会尝试符合任何现有的IStorage文件类型 API及其文档似乎针对现有的文件格式。这是一种习惯,到目前为止,我发现的例子只是令人困惑 问题 在 参数1我应该通过什么FMTID?数据字段上是否可以全部为零?我能弥补一下吗? 参数2 CLSID可以是空PTR吗?如果没有,应该是什么?我是否需要找出父IStorage使用的值? 参数3什么样的propset标志最好?我在想,因为我要存

我正在尝试将添加到现有文件。我计划编写的属性及其值将根据我的设计进行自定义。我可能会存储一些int、一些字符串等。我不会尝试符合任何现有的IStorage文件类型

API及其文档似乎针对现有的文件格式。这是一种习惯,到目前为止,我发现的例子只是令人困惑

问题

参数1我应该通过什么FMTID?数据字段上是否可以全部为零?我能弥补一下吗? 参数2 CLSID可以是空PTR吗?如果没有,应该是什么?我是否需要找出父IStorage使用的值? 参数3什么样的propset标志最好?我在想,因为我要存储字符串,我应该使用PROPSETFLAG\u默认值。 param 4 IStorage句柄已打开以供读取,我正在像现有运行时的插件一样运行。我现在最好的猜测是使用STGM|u DIRECT | STGM|u READWRITE | STGM|u SHARE | u EXCLUSIVE | STGM|u CREATE。但我一直在 注意,到目前为止,我还无法在IStorage上创建新的IPropertySetStorage,但我已成功创建了自定义IStream,并在以后打开时从中读取

任何与我所做工作更相关的教程链接都将不胜感激

请注意,我的代码是从现有应用程序调用的,处理现有文件。调用我的代码时,会向我传递文件的根历史。这是我的所有代码与该IStorage基础


正如我在第4节中指出的,它又回来了。

特别感谢@Xearinox

当我粘贴所有相关代码时,我注意到我正在打开我的存储,我首先创建一个子存储,以在读取模式下存储我的部件,而不是在创建时创建RW RW,但不是在它已经存在时创建。这导致创建道具集失败

// see STGM_READWRITE (fix)
rootStg->OpenStorage(name, nullptr, STGM_READWRITE | 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);

请粘贴完整的代码。我的代码与您的代码片段配合得很好。@Xerarinox在粘贴所有相关代码时,我注意到我正在打开存储,我首先创建了一个子存储,以在读取模式下存储我的部件,而不是在创建时创建RW RW,但当它已经存在时,就不会了。这导致创建道具集失败。这可能看起来很傻,但是如果你把这个细节作为一个答案,请确保在FW模式下打开你自己的存储,我想给你点奖励,因为是你对更多信息的要求帮助我找到了它。另外,请注意,我仍然希望获得更多关于参数的信息,如我在原始问题中所详述的。谢谢。明天我做一些调查。我会给你结果-
// see STGM_READWRITE (fix)
rootStg->OpenStorage(name, nullptr, STGM_READWRITE | 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);