我已经将 IFilter 实现为 native VC++ ATL 进程内 COM 服务器。 Windows Search 不会使用它 - 它会创建我的 IFilter 的一个实例,然后执行一系列 QueryInterface() 调用,具体来说:
- 编码(marshal)
- IStdMarshalInfo
- 具有 {4C1E39E1-E3E3-4296-AA86-EC938D896E92} 接口(interface) ID 的东西
和其他几个。由于我的 IFilter 仅实现 IFilter、IPersist 和 IPersistFile,大多数调用返回 E_NOINTERFACE,因此 Windows Search 仅释放我的对象而不执行任何操作。
它为什么要查询这些接口(interface),我该如何解决这个问题?
最佳答案
您时常看到“异常”行为的原因之一是应用程序兼容性 (appcompat)。如果有其他损坏的过滤器(不合理地)期望查询这些接口(interface),并且这些接口(interface)是由大公司编写的,那么 Microsoft 可能会继续查询,只是为了让这些过滤器满意。正确的实现不应受到此 appcompat 的影响,因为它们只会遵循 COM 规则并返回 E_NOINTERFACE。
Another reason , 由 Raymond Chen 提供。 “这是您没有正确注册 CLSID 的明确信号”
编辑:和another reason to query for interfaces that don't actually exist ,再次由 Raymond 解释。
关于windows - 为什么 Windows Search 会在我的 IFilter 中查询一堆奇怪的界面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1714926/