我正在尝试编写一个C#实用程序,该程序模仿Windows Search SDK中filtdump.exe的行为(因为filtdump似乎本身无法重新发行。)我似乎无法追踪的技术问题。我希望有人可以帮助消除这些障碍中的一个或另一个...

根据MSDN,filtdump使用 ILoadFilter::LoadIFilter 加载它的IFilter。我认为MSDN在说谎,因为它还声称ILoadFilter::LoadIFilter仅存在于Windows 7上,但是filtdump在较早的OS上可以正常工作。 Process Monitor表示它实际上是从LoadIFilter()调用query.dll,所以这就是我正在做的事情:

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都给我HRESULT 0x80004005,E_FAIL。

这是来自this question的相同错误,但是我在每个PDF上都得到了它,而filtdump不是,所以我知道IFilter至少在处理某些文档。有没有人以前用PDF做过这样的事情,可以看到我做错了什么?

最佳答案

您可能想看看this blog post。简而言之,Adobe PDF过滤器的v10版使用了允许使用该过滤器的应用程序白名单,其中包括Microsoft的filtdump.exe等诊断工具,据说是一种“安全措施”。

09-26 12:29