对于某些PDF文件,LoadIFilter()返回-2147467259

我正在尝试使用Adobe IFilter来搜索PDF文件。 我的代码是用C#编写的,我使用p / invoke来获取IFilter的一个实例:

[DllImport("query.dll", SetLastError = true, CharSet = CharSet.Unicode)] private extern static int LoadIFilter( string pwcsPath, [MarshalAs(UnmanagedType.IUnknown)] object pUnkOuter, ref IFilter ppIUnk); 

这适用于大多数PDF文件,除了少数此方法返回-2147467259且ppIUnk为空。 有没有人有这种类型的错误或有任何建议如何解决这个问题?

请参阅有关LoadIFilter函数的MSDN文档 – 您应该获取其中一个错误代码,至少根据该页面。

  • E_ACCESSDENIED = 0x80070005 – 该函数被拒绝访问filter文件。
  • E_HANDLE = 0x80070006 – 函数遇到无效句柄,可能是因为内存不足。
  • E_INVALIDARG = 0x80070057 – 函数收到无效参数。
  • E_OUTOFMEMORY = 0x8007000E – 该函数没有足够的内存或其他资源来完成操作。
  • E_FAIL = 0x80000008 – 该函数遇到未知错误。

(此外, 此处列出了完整的常量值集,这似乎比MSDN上列出的更长。)现在,有趣的是,您的错误代码对应于hex中的80004005 ,它未在任何一个上列出或那些页面。 我怀疑pinvoke.net可能有它错了,因为许多其他网站(例如这个 )将其列为E_FAIL …并不是它真的有帮助。 对于不确定的答案感到抱歉,但也许它会指出你至少在正确的轨道上。

编辑:这个错误似乎已在其他地方记录,并导致很多人混淆,没有简单的解决方案。 事实上似乎原因可能是其中之一…这里有各种各样的建议,你可能想尝试,但我认为我不能再帮助你了,因为我从未遇到过这个错误在这种背景下我自己。 祝你好运…

这是我解决它的方式:

卸载Adobe Reader / Acrobat。 安装最新版本(再次)。 它应该修复pdffilter。 祝好运。

要了解Adobe 10.x的E_FAIL,请参阅https://stackoverflow.com/a/8841476/455322

我在运行LoadIFilter时得到了相同的结果,直到我发现这篇文章指出了我的解决方案:

确保您的构建平台目标是x86并避免在Visual Studio中运行该应用程序。

此外,如果您可以将与IFilter交互的代码移动到名为filtdump.exe的单独.exe应用程序中,您将大大简化代码。