【发布时间】:2012-05-31 01:44:09
【问题描述】:
我正在尝试将IPropertySetStorage 添加到现有的IStorage 文件中。我计划编写的属性及其值将根据我的设计进行定制(我可能会存储一些整数、一些字符串等)。我没有尝试遵循任何现有的 IStorage 文件类型。
API 及其文档感觉是针对现有文件格式的。这是惯例,因此(到目前为止)我发现的示例只是令人困惑。
问题
- (参数 1)我通过什么
FMTID?数据字段上可以全为零吗?我可以弥补吗? - (参数 2)CLSID 可以是
nullptr吗?如果不是,应该是什么?我是否需要弄清楚父IStorage使用了哪些值? - (参数 3)最好的 propset 标志是什么?我在想,因为我要存储字符串,我应该使用
PROPSETFLAG_DEFAULT。 - (参数 4)
IStorage句柄已打开以供读取(我正在像现有运行时的插件一样运行)。我现在最好的猜测是使用STGM_DIRECT | STGM_READWRITE | 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。
【问题讨论】:
-
请粘贴完整代码。我的代码适用于您的 sn-p。
-
@Xearinox 在粘贴所有相关代码时,我注意到我正在以读取模式打开我的存储(我首先创建一个子存储来存放我的零件),而不是 RW(创建时 RW,但不是当它已经存在时)。这导致道具集的创建失败。这可能看起来很傻,但是如果您将此详细信息作为答案发布(确保在 FW 模式下打开您自己的存储),我想给您功劳,因为正是您对更多信息的请求帮助我找到了它.另请注意,我仍然希望获得有关参数的更多信息,正如我在原始问题中详述的那样。谢谢。
-
明天我做一些研究。我会给你结果。 :-)
标签: c++ com structured-storage