使用32位Com对象从64位IFilter中进行操作

4

我有一个用Delphi编写的IFilter,我正在尝试在64位Windows 7桌面搜索中使其正常工作。

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

为了解决这个问题,我正在尝试使用Visual C ++编写64位IFilter Dll,该Dll在内部使用我的32位IFilter Com对象,使用此处概述的DllSurogate技术。

我已经在测试的64位控制台应用程序下将所有这些都运行良好。我可以创建我的64位包装器的实例,该实例在内部创建32位IFilter对象并将所有调用委托给它。然后我就可以检索文档的内容。

问题是当我将其注册到WDS时,64位包装器无法再创建32位对象。CoCreateInstance返回“Server Execution Failed”(CO_E_SERVER_EXEC_FAILURE)。

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

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

有什么想法这是为什么。这是WDS中IFilters的权限限制吗?
谢谢你的帮助。
2个回答

7

是的,IFilters运行在名为SearchFilterHost.exe的托管进程中。由于过滤器可能会打开包含恶意内容的文件,因此主机以非常受限的权限运行。启动进程的能力肯定不会被包括在内。不知道如何覆盖这个问题,或者说你是否应该考虑这样做。谷歌搜索“searchfilterhost.exe”会带来很多警报。这肯定是令人痛苦的消息,很抱歉成为这个消息的传递者。


你(或其他人)知道SQL Server和SharePoint是否有相同的限制吗?我现在无法测试它们,也找不到任何关于它们的信息。我主要是为了SharePoint而做这个,也许还有一些希望!否则我需要重新考虑一下。 - Jamie

1

还要记住,调用应用程序并不一定会在每次使用后卸载您的ifilter。它将重复使用内存中的ifilter来解析许多文件。但是,如果主机进程检测到问题(例如内存泄漏增加),它将卸载您的ifilter并重试。我几年前曾经使用过32位ifilter代码,但我无法解决64位严格限制的问题。如果您找到了解决方法,希望您愿意在网络上发布具体细节...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接