我正在尝试将 a 添加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
请注意,到目前为止,我还无法创建一个新IPropertySetStorage
的IStorage
,但我已经成功创建了一个 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
.