2012-05-21 46 views
1

我正在尝试将IPropertySetStorage添加到现有的IStorage文件中。我计划编写的属性和它们的值将根据我的设计进行定制(我可能会存储几个整数,几个字符串等)。我不是想要符合任何现有的IStorage文件类型。自定义结构化存储IPropertySetStorage

该API及其文档感觉针对的是现有的文件格式。这是习惯性的,因此(迄今为止)我发现的例子只是令人困惑。

问题(S)

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

注意,我一直没能建立在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

+1

请粘贴全部代码。我的代码适用于你的代码片段。 – Xearinox

+0

@Xearinox当我粘贴所有相关的代码时,我注意到我正在以READ模式打开存储器(我首先创建了一个存储子容器的存储器),而不是RW(创建RW时,但当它已经存在时不会) 。这导致道具组的创建失败。这看起来可能很愚蠢,但如果你将这个细节作为答案发布(确保在FW模式下打开你自己的存储),我想给你一个信用,因为它是你的要求,以获得更多的信息,帮助我找到它。还请注意,我仍然希望获得更多关于参数的信息,正如我在原始问题中所详述的那样。谢谢。 – payo

+1

Tommorow我做了一些研究。我会给你结果。 :-) – Xearinox

回答

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);