IFilter с пользовательскими свойствами - PullRequest
0 голосов
/ 28 февраля 2019

Я разрабатываю собственный фильтр для моего формата файла.Все отлично работает, когда я использую любой из системных ключей от <propkey.h>, как PKEY_Search_Contents.

Но теперь мне нужно иметь свои пользовательские свойства для регистрации и использования с Windows Search.Представьте себе:

"SELECT * FROM SystemIndex WHERE scope ='file:C:/' AND Publisher.Item.CustomProperty LIKE '%Test%'"

Я видел про Property Handlers и уже тестировал.Я использовал проект RecipePropertyHandler из Windows 7 SDK Samples.И когда я искал с этим кодом:

// get a property store for the mp3 file
IPropertyStore* store = NULL;
HRESULT hr = SHGetPropertyStoreFromParsingName(L"SomePath",
    NULL, GPS_DEFAULT, __uuidof(IPropertyStore), (void**)&store);

hr = HRESULT_FROM_WIN32(GetLastError());

PROPVARIANT variant;
store->GetValue(PKEY_Microsoft_SampleRecipe_Difficulty, &variant);

//// very important undocumented method
store->Release();
CoUninitialize();

, я получаю правильный ответ.

Но я не понимаю, как объединить IFilter с IPropertyStore, чтобы создать свои собственные свойства,Чтобы начать IFilter, я использовал пример из Windows 7 SDK Samples.Я делаю что-то вроде:

chunkValue.SetTextValue(PKEY_SearchContents, filtered.c_str(),CHUNK_TEXT, 1046, 0, 0, CHUNK_EOS);

Я больше не нашел ссылку, но я прочитал цитату из msdn о том, что вы не можете реализовать IFilter AND IPropertyStore вместе.Это правда?Другими словами, я не могу создать собственное свойство?

Я видел все ссылки из msdn, такие как link , link2 или любые другие.Я могу делать разные вещи, но я не знаю, как объединить оба.

Любая идея, как реализовать?

РЕДАКТИРОВАТЬ

Я пытаюсь реализовать PropertyHandler.Мой файл .propdesc имеет следующее содержимое:

-->
<schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://schemas.microsoft.com/windows/2006/propertydescription"
        schemaVersion="1.0">
  <propertyDescriptionList publisher="Microsoft" product="SampleRecipe">
    <propertyDescription name="Microsoft.SampleRecipe.Difficulty" formatID="{1794C9FE-74A9-497f-9C69-B31F03CE7EF9}" propID="100">
      <description>This property indicates the preparation difficulty of a recipe.</description>
      <searchInfo inInvertedIndex="true" isColumn="true" />
      <typeInfo type="String" multipleValues="false" isViewable="true" />
      <labelInfo label="Recipe difficulty" invitationText="Specify recipe difficulty" />
      <displayInfo displayType="Enumerated" >
        <editControl control="DropList"/>
        <enumeratedList>
          <enum value="Easy" text="Easy" />
          <enum value="Medium" text="Medium" />
          <enum value="Hard" text="Hard" />
        </enumeratedList>
      </displayInfo>
    </propertyDescription>
    <propertyDescription name="Microsoft.SampleRecipe.Keywords" formatID="{16D19FCB-7654-48AB-8057-DF8E51CC0755}" propID="100">
      <description>This property indicates the preparation difficulty of a recipe.</description>
      <searchInfo inInvertedIndex="true" isColumn="True"/>
      <typeInfo type="String" multipleValues="true" isViewable="true" />
      <labelInfo label="Recipe Keywords" invitationText="Specify recipe keyword" />
    </propertyDescription>
  </propertyDescriptionList>
</schema>

В свойствах Windows:

Я получаю всю информацию из файла ... но когда я пытаюсьпоиск в Windows Искать как:

SELECT Microsoft.SampleRecipe.Keywords FROM SystemIndex 

Где каталог = 'somedirectory'

Я получаю все строки пустыми ... Любые идеи почему?

EDIT

Я вижу свои свойства в PropSchema:

Я могу использовать свой Microsoft.SampleRecipe.DifficultyV2 в моем WSSQL-запросекак:

SELECT Microsoft.SampleRecipe.KeywordsV2 FROM SystemIndex WHERE directory='C:\users\step\documents\rvffilter\'

Но все содержимое пусто

...