我正在尝试编写一个 C# 实用程序来模仿 Windows Search SDK 中 filtdump.exe
的行为(因为 filtdump
本身似乎不可再分发.) 我遇到了相互矛盾和/或不存在的文档以及我似乎无法追踪的技术问题的组合。我希望有人可以帮助消除这些障碍中的一个或另一个...
根据 MSDN,filtdump
使用 ILoadFilter::LoadIFilter
加载它的 IFilter。我认为 MSDN 在撒谎,因为它还声称 ILoadFilter::LoadIFilter
仅存在于 Windows 7 上,但 filtdump
在较早的操作系统上运行良好。 Process Monitor 表明它实际上是从 query.dll
调用 LoadIFilter()
,所以这就是我正在做的:
public static class NativeMethods
{
// From Windows SDK v7.1, NTQuery.h
[DllImport("query.dll", CharSet = CharSet.Unicode)]
public static extern int LoadIFilter(
string pwcsPath,
[MarshalAs(UnmanagedType.IUnknown)]
ref object pUnkOuter,
ref IFilter ppIUnk);
}
object iUnknown = null;
IFilter filter = null;
var result = NativeMethods.LoadIFilter(args[0], ref iUnknown, ref filter);
if (result != ResultCodes.S_OK)
{
Console.WriteLine("Failed to load an IFilter for {0}: {1}", args[0], result);
return;
}
在大多数情况下,此应用程序和 filtdump
给我相同的结果——它们都可以从文本、Word 文档和 Outlook 电子邮件中打开和提取文本,并且都在同一组上失败没有 IFilter 的其他文档。但是,PDF 给我带来了问题。 Filtdump
设法打开并从我扔给它的大多数 PDF 中提取文本,但我尝试使用自己的应用程序尝试的每一个 PDF 都给我一个 0x80004005 的 HRESULT,E_FAIL。
这与 this question 中的错误相同但我在每个 PDF 上都得到它,而filtdump
不是,所以我知道IFilter 至少在处理一些文档。以前有没有人用 PDF 做过这种事情,可以看到我做错了什么?
最佳答案
你可能想看看 this blog post .简而言之,Adobe 的 PDF 过滤器 v10 使用允许使用过滤器的应用程序白名单,包括 Microsoft 的诊断工具,如 filtdump.exe
,据称是一种“安全措施”。
关于c# - LoadIFilter() 在所有 PDF 上都失败(但 MS 的 filtdump.exe 没有。),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7177953/