Пользовательское структурированное хранилище IPropertySetStorage

Я пытаюсь добавить IPropertySetStorage к существующему IStorage файл. Свойства и их значения, которые я планирую написать, будут индивидуальными для моего дизайна (я могу хранить несколько целых, несколько строк и т. Д.). Я не пытаюсь соответствовать любому существующему IStorage тип файла.

API и его документация ориентированы на существующие форматы файлов. Это обычай, и поэтому (пока) примеры, которые я нашел, только сбивают с толку.

Вопросы)

На IPropertySetStorage::Create

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