我已经实现了一个IFilter作为本地VC ++ ATL进程内COM服务器。 Windowssearch不会使用它 – 它创build我的IFilter的实例,然后执行一堆QueryInterface()调用,具体为:
和其他几个人。 由于我的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之一。