2012-05-21 49 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);