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