Зачем Windows Search запрашивать у моего IFilter кучу странных интерфейсов?

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

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

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

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


person sharptooth    schedule 11.11.2009    source источник


Ответы (4)


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

person Shay Erlichmen    schedule 11.11.2009
comment
Но зачем ему это делать? Никакие другие потребители IFilter не пробовали этого. - person sharptooth; 11.11.2009
comment
@sharptooth, как это реализовано, я не верю, что ваша проблема заключается в том, что не реализованы эти интерфейсы. - person Shay Erlichmen; 11.11.2009

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

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

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

person MSalters    schedule 13.11.2009

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

person ReinstateMonica Larry Osterman    schedule 11.11.2009

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

person Remy Lebeau    schedule 11.11.2009