使用64位IFilter中的32位Com对象

时间:2010-09-28 20:56:03

标签: delphi visual-c++ com 64-bit ifilter

我有一个用Delphi编写的IFilter,我正试图在64位Windows 7桌面搜索下工作。

由于它是在Delphi中开发的,我只能将其编译为32位DLL。

要解决这个问题,我试图在Visual C ++中编写一个64位IFilter Dll,它在内部使用我的32Bit IFilter Com对象,使用了here概述的DllSurogate技术。

我已经在测试64位控制台应用程序下完成了所有这些工作。我可以创建一个64位包装器的实例,它在内部创建32位IFilter对象并委托对它的所有调用。然后,我可以检索文档的内容。

问题是当我使用WDS注册时,64位包装器不能再创建32位对象。 CoCreateInstance返回“服务器执行失败”(CO_E_SERVER_EXEC_FAILURE)。

这是我在64位包装器中创建32位对象的人

result = CoCreateInstance(clsid, 0, CLSCTX_LOCAL_SERVER , IID_IFilter, (LPVOID*)&m_pFilter);

知道为什么会这样。它是WDS中IFilters的权限限制吗?

感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:7)

是的。 IFilter在名为SearchFilterHost.exe的托管进程内运行。由于过滤器可能会打开包含恶意内容的文件,因此主机以非常有限的权限运行。肯定不会包括启动流程的能力。不知道如何覆盖这个,或者如果你甚至考虑这样做的话。谷歌搜索“searchfilterhost.exe”带来了大量的警钟。这将是一个痛苦的消息,很抱歉成为持票人。

答案 1 :(得分:1)

另请注意,每次使用后,调用应用程序都不需要卸载ifilter。它将在内存中重用ifilter来解析许多文件。但是,如果主机进程检测到问题(例如内存泄漏不断增加),它将卸载您的ifilter并再次尝试。几年前我在32位上使用过ifilter代码,但是我无法解决64位更严格的限制。如果您发现这是如何完成的,我希望您愿意在网上发布具体信息......