我已经将IFilter实现为本机VC ++ ATL进程内COM服务器。 Windows Search不会使用它 - 它会创建我的IFilter实例,然后执行一堆QueryInterface()调用,具体来说:
和其他几个人。由于我的IFilter只实现IFilter,IPersist和IPersistFile大部分调用返回E_NOINTERFACE,因此Windows Search只释放我的对象并且什么也不做。
为什么要查询这些接口,我该如何解决这个问题呢?
答案 0 :(得分:3)
您不时会看到“异常”行为的原因之一是应用程序兼容性(appcompat)。如果有其他破坏的过滤器(不合理地)期望查询这些接口,并且这些过滤器是由大公司编写的,那么微软可能会继续查询以保持这些过滤器的快乐。正确的实现不应受此appcompat的影响,因为它们只会遵循COM规则并返回E_NOINTERFACE。
Another reason,由Raymond Chen提供。 “这是您没有正确注册CLSID的明确信号”
编辑:和another reason to query for interfaces that don't actually exist,Raymond再次解释。
答案 1 :(得分:2)
Windows尝试检查您的界面是否支持自定义编组,他唯一可以做的就是将QueryInterface(...)
用于那些众所周知的界面(嗯,众所周知)。
COM层期望某些接口将返回E_NOINTERFACE
并知道如何处理它。
答案 2 :(得分:1)
您是否尝试过聚合组件中的免费线程编组器(CoCreateFreeThreadedMarshaller(?这可能足以让您的组件使用Windows搜索。
答案 3 :(得分:1)
这会为你揭开光明吗? COM proxy stub dll and why do you need it。你提到的IID是文章中提到的IID之一。