自定义结构化存储IPropertySetStorage

时间:2012-05-21 17:38:53

标签: c++ com structured-storage

我正在尝试向现有IPropertySetStorage文件添加IStorage。我计划编写的属性及其值将根据我的设计进行自定义(我可以存储一些内容,一些字符串等)。我不是要遵循任何现有的IStorage文件类型。

API及其文档针对现有文件格式。这是定制的,因此(到目前为止)我发现的例子只是令人困惑。

问题(S)

IPropertySetStorage::Create

  1. (参数1)我通过了什么FMTID?可以在数据字段上全部为零吗?我可以补上吗?
  2. (参数2)CLSID可以是nullptr吗?如果不是,它应该是什么?我是否需要确定父IStorage使用的值是什么?
  3. (参数3)什么propset标志最好?我在想因为我将存储字符串,我应该使用PROPSETFLAG_DEFAULT
  4. (参数4)IStorage句柄打开以供阅读(我像现有运行时的插件一样运行)。我现在最好的猜测是使用STGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE。但我一直在STG_E_INVALIDFLAG
  5. 注意,到目前为止,我还无法在IPropertySetStorage上创建新的IStorage,但我已成功创建了自定义IStream,并在稍后打开时从中读取

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

    编辑请注意,我的代码是从现有应用程序调用的,处理现有文件。当我的代码被调用时,我传递了文件的根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

1 个答案:

答案 0 :(得分:0)

(特别感谢@Xearinox)

当我粘贴所有相关代码时,我注意到我在READ模式下打开我的存储空间(我首先创建一个子存储来容纳我的部件),而不是RW(创建时的RW,但是当它已经存在时) 。这导致prop集的创建失败。

// 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);