代码之家  ›  专栏  ›  技术社区  ›  Jamie

使用64位iFilter中的32位COM对象

  •  4
  • Jamie  · 技术社区  · 14 年前

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

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

    为了解决这个问题,我尝试在VisualC++中编写一个64位IFLTER DLL,它内部使用我的32位iFielter COM对象,使用了DLL技术。 here .

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

    问题是,当我注册为wds时,64位包装器无法再创建32位对象。coCreateInstance返回“服务器执行失败”(coCreateInstance返回“服务器执行失败”(coCreateInstance返回“服务器执行失败”)。

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

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

    知道为什么会这样吗?它是一个在wds中使用ifilters的权限限制吗?

    谢谢你在这方面的帮助。

    2 回复  |  直到 14 年前
        1
  •  7
  •   Hans Passant    14 年前

    是的。ifilters在名为searchfilterhost.exe的宿主进程内运行。由于过滤器可能打开带有恶意内容的文件,因此主机以非常受限的权限运行。当然不包括启动流程的能力。不知道如何克服这个问题,也不知道是否应该考虑这样做。谷歌搜索“searchfilterhost.exe”会发出大量警报。这肯定是一个痛苦的消息,很抱歉我是来送信的。

        2
  •  1
  •   Marco    14 年前

    同时记住,调用应用程序在每次使用后都不需要卸载您的iFilter。它将重用内存中的ifilter来解析许多文件。但是,如果主机进程检测到一个问题(例如不断增长的内存泄漏),它将卸载IFilter并重试。几年前,我在32位上使用了ifilter代码,但我还不能解决64位上更严格的限制。如果你知道这是怎么做到的,我希望你愿意在网上公布具体情况…

    推荐文章