我正在尝试将IPropertySetStorage
添加到现有的IStorage
文件中。我计划编写的属性和它们的值将根据我的设计进行定制(我可能会存储几个整数,几个字符串等)。我不是想要符合任何现有的IStorage
文件类型。自定义结构化存储IPropertySetStorage
该API及其文档感觉针对的是现有的文件格式。这是习惯性的,因此(迄今为止)我发现的例子只是令人困惑。
问题(S)
- (参数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
。
请粘贴全部代码。我的代码适用于你的代码片段。 – Xearinox
@Xearinox当我粘贴所有相关的代码时,我注意到我正在以READ模式打开存储器(我首先创建了一个存储子容器的存储器),而不是RW(创建RW时,但当它已经存在时不会) 。这导致道具组的创建失败。这看起来可能很愚蠢,但如果你将这个细节作为答案发布(确保在FW模式下打开你自己的存储),我想给你一个信用,因为它是你的要求,以获得更多的信息,帮助我找到它。还请注意,我仍然希望获得更多关于参数的信息,正如我在原始问题中所详述的那样。谢谢。 – payo
Tommorow我做了一些研究。我会给你结果。 :-) – Xearinox