我正在嘗試將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