Пользовательское структурированное хранилище IPropertySetStorage
Я пытаюсь добавить IPropertySetStorage
к существующему IStorage
файл. Свойства и их значения, которые я планирую написать, будут индивидуальными для моего дизайна (я могу хранить несколько целых, несколько строк и т. Д.). Я не пытаюсь соответствовать любому существующему IStorage
тип файла.
API и его документация ориентированы на существующие форматы файлов. Это обычай, и поэтому (пока) примеры, которые я нашел, только сбивают с толку.
Вопросы)
На IPropertySetStorage::Create
- (параграф 1) Что
FMTID
пройти? Это могут быть все нули в полях данных? Могу ли я просто сделать это? - (параграф 2) Может ли CLSID быть
nullptr
? Если нет, что это должно быть? Нужно ли выяснять какие ценности у родителяIStorage
используемый? - (параграф 3) Какой флаг пропета будет лучшим? Я думаю, потому что я буду хранить строку, я должен использовать
PROPSETFLAG_DEFAULT
, - (параграф 4)
IStorage
дескриптор открыт для чтения (я работаю как плагин к существующей среде выполнения). Моя лучшая догадка сейчас заключается в использованииSTGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE
, Но я получаюSTG_E_INVALIDFLAG
Обратите внимание, я не смог создать новый IPropertySetStorage
на IStorage
на данный момент, но я успешно создал кастом 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)
Вставляя весь соответствующий код, я заметил, что я открываю свое хранилище (сначала я создаю дочернее хранилище для размещения своих деталей) в режиме 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);