gpt4 book ai didi

c++ - 自定义结构化存储 IPropertySetStorage

转载 作者:太空宇宙 更新时间:2023-11-04 14:16:33 25 4
gpt4 key购买 nike

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

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

问题

关于 IPropertySetStorage::Create

  1. (param 1) 我要传递什么 FMTID?它可以在数据字段上全为零吗?我可以弥补吗?
  2. (param 2) CLSID 可以是 nullptr 吗?如果不是,那应该是什么?我是否需要弄清楚父 IStorage 使用的是什么值?
  3. (参数 3)什么 propset 标志最好?我在想,因为我要存储字符串,所以我应该使用 PROPSETFLAG_DEFAULT
  4. (param 4) IStorage 句柄已打开以供读取(我正在像现有运行时的插件一样运行)。我现在最好的猜测是使用 STGM_DIRECT | STGM_读写 | STGM_SHARE_EXCLUSIVE | STGM_CREATE。但我一直在得到 STG_E_INVALIDFLAG

请注意,到目前为止,我还不能在 IStorage 上创建一个新的 IPropertySetStorage,但我已经成功创建了一个自定义的 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 .

最佳答案

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

关于c++ - 自定义结构化存储 IPropertySetStorage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10689929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com