我正在尝试编写一个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
等诊断工具,据说是一种“安全措施”。