1

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

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

问题)

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

请注意,到目前为止,我还无法创建一个新IPropertySetStorageIStorage,但我已经成功创建了一个 custom 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

0

(特别感谢@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<void**>(&pPropSetStg));    

pPropSetStg->Create(
  ::FMTID_UserDefinedProperties, 
  nullptr, 
  PROPSETFLAG_DEFAULT, 
  STGM_CREATE|STGM_READWRITE|STGM_DIRECT|STGM_SHARE_EXCLUSIVE , 
  &pPropStg);
于 2012-05-30T17:44:09.377 回答