Почему Windows поиск запросит мой ifilter для куча странных интерфейсов?
-
19-09-2019 - |
Вопрос
Я реализовал iFilter как нативный VC ++ ATL-сервер Com. Поиск Windows не будет использовать его - он создает экземпляр моего iFilter, а затем выполняет кучу вызовов QueryInterface (), в частности:
- Имаршал
- ISTDMARSHALINFO
- Что-то с {4C1E39E1-E3E3-4296-AA86-EC938D896E92} Идентификатор интерфейса
и пара других. Поскольку мой iFilter только реализует ifilter, ipersist и ipersistfile, большинство вызовов возвращают e_naterface, поэтому поиск Windows просто выпускает мой объект и ничего не делает.
Почему это запрашивает эти интерфейсы и как мне решить проблему?
Решение
Windows пытается проверить, поддерживает ли ваш интерфейс пользовательский маршалинг, единственный способ сделать это - это использование QueryInterface(...)
для тех хорошо известных интерфейсов (ну, полу хорошо известны).
Com Layer ожидает, что некоторые интерфейсы вернутся E_NOINTERFACE
и знает, как с этим справиться.
Другие советы
Одна из причин, по которой вы видите «необычное» поведение, время от времени - совместимость приложений (AppCompat). Если есть другие, сломанные фильтры, которые (необоснованно) ожидают запросить эти интерфейсы, и они написаны крупными компаниями, то Microsoft может продолжать запрашивать, чтобы эти фильтры были счастливы. Надлежащие реализации не должны зависеть от этого AppCompat, потому что они просто следуют правилам COM и возвращают E_NTERFACE.
Еще одна причина, Предоставлено Рэймондом Чен. "Это верный признак того, что вы не зарегистрировали свой CLSID должным образом"
редактировать : А также Еще одна причина запроса на интерфейсы, которых на самом деле не существует, снова объяснил Рэймонд.
Вы пробовали собрать бесплатный резьбовой маршаллер (Cocreatefreethreadedmarshaller В вашем компоненте (? Этого может быть достаточно, чтобы ваш компонент работал с поиском Windows.
Это проливает вам свет? Com Proxy Stub dll и зачем вам это нужно. Анкет IID, который вы упомянули, является одним из IID, упомянутых в статье.