为什么Windows Search会查询我的IFilter是否有一些奇怪的接口?

我已经实现了一个IFilter作为本地VC ++ ATL进程内COM服务器。 Windowssearch不会使用它 – 它创build我的IFilter的实例,然后执行一堆QueryInterface()调用,具体为:

  • IMarshal
  • IStdMarshalInfo
  • 与{4C1E39E1-E3E3-4296-AA86-EC938D896E92}接口ID

和其他几个人。 由于我的IFilter只实现了IFilter,IPersist和IPersistFile,所以大多数调用都返回E_NOINTERFACE,所以Windows Search只是释放我的对象而什么也不做。

为什么要查询这些接口,以及如何解决这个问题?

Windows会尝试检查你的界面是否支持自定义封送处理,唯一的办法就是使用QueryInterface(...)到那些众所周知的界面(好的,半熟悉的)。
COM层期望一些接口将返回E_NOINTERFACE并知道如何处理它。

应用程序兼容性(appcompat)是您不时看到“不寻常”行为的原因之一。 如果还有其他破坏的过滤器(不合理地)希望查询这些接口,并且这些过滤器是由大公司编写的,那么微软可能会继续查询,以保持这些过滤器的快乐。 适当的实现不应该受到这个appcompat的影响,因为它们只会遵循COM规则并返回E_NOINTERFACE。

另一个原因 ,Raymond Chen的礼貌。 “这是一个肯定的迹象,你没有正确注册你的CLSID”

编辑 : 另一个原因查询实际上不存在的接口,雷蒙德再次解释。

你有没有尝试过聚合免费的线程编组( CoCreateFreeThreadedMarshaller在你的组件(?这可能足以让你的组件与Windows搜索工作。

这是否为你摆脱了光? COM代理存根DLL,你为什么需要它 。 你提到的IID是这篇文章中提到的IID之一。