Почему Windows Search запрашивает у моего IFilter несколько странных интерфейсов? - PullRequest
2 голосов
/ 11 ноября 2009

Я реализовал IFilter в качестве встроенного COM-сервера VC ++ ATL in-proc. Windows Search не будет его использовать - он создает экземпляр моего IFilter, а затем выполняет несколько вызовов QueryInterface (), а именно:

  • IMarshal
  • IStdMarshalInfo
  • что-то с идентификатором интерфейса {4C1E39E1-E3E3-4296-AA86-EC938D896E92}

и пара других. Поскольку мой IFilter реализует только IFilter, IPersist и IPersistFile, большинство вызовов возвращают E_NOINTERFACE, поэтому Windows Search просто освобождает мой объект и ничего не делает.

Почему он запрашивает эти интерфейсы и как мне решить проблему?

Ответы [ 4 ]

3 голосов
/ 13 ноября 2009

Одной из причин, по которой вы время от времени видите «необычное» поведение, является совместимость приложений (appcompat). Если есть другие сломанные фильтры, которые (необоснованно) ожидают, что эти интерфейсы будут запрошены, и те, что написаны крупными компаниями, то Microsoft может продолжать запрашивать просто, чтобы эти фильтры были довольны. Этот appcompat не должен влиять на правильную реализацию, поскольку он просто будет следовать правилам COM и вернет E_NOINTERFACE.

Другая причина , любезно предоставлена ​​Рэймондом Ченом. «Это верный признак того, что вы не правильно зарегистрировали свой CLSID»

edit : И еще одна причина для запроса интерфейсов, которые на самом деле не существуют , снова объяснил Рэймонд.

2 голосов
/ 11 ноября 2009

Windows пытается проверить, поддерживает ли ваш интерфейс пользовательский маршалинг, единственный способ, которым он может это сделать, - это использовать QueryInterface(...) с этими хорошо известными интерфейсами (ну, полуизвестно). Уровень COM ожидает, что некоторые интерфейсы вернут E_NOINTERFACE, и знает, как с ним работать.

1 голос
/ 11 ноября 2009

Это проливает свет на тебя? заглушка COM прокси и зачем она нужна . IID, который вы упоминаете, является одним из IID, упомянутых в статье.

1 голос
/ 11 ноября 2009

Вы пытались объединить бесплатный многопоточный маршаллер ( CoCreateFreeThreadedMarshaller в вашем компоненте (? Этого может быть достаточно для работы вашего компонента с поиском Windows.

...