Я пытаюсь написать утилиту C #, которая имитирует поведение filtdump.exe
из Windows Search SDK (поскольку filtdump
сам по себе не является распространяемым). Я столкнулся с сочетанием противоречивой и / или несуществующей документации и технических проблем, которые я не могу кажется, выследить. Я надеюсь, что кто-то может помочь устранить одно из этих препятствий ...
Согласно MSDN, filtdump
использует ILoadFilter :: LoadIFilter
для загрузки своего IFilter. Я утверждаю, что MSDN лжет, поскольку он также утверждает, что ILoadFilter :: LoadIFilter
существует только в Windows 7, но filtdump
отлично работает в более ранних ОС. Монитор процессов показывает, что на самом деле он вызывает 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.
Это та же ошибка из этого вопроса , но я получаю ее на каждый PDF, а filtdump
нет, поэтому я знаю, что IFilter работает хотя бы по некоторым документам. Кто-нибудь делал подобное раньше с PDF-файлами, чтобы увидеть, что я делаю неправильно?