поэтому мне сказали, что у меня может не быть доступа к реестру или программам, с помощью которых обычно загружаются их фильтры IFilter в систему, поэтому мне приходится включать библиотеки DLL IFilter в приложение и загружать их непосредственно оттуда. В настоящее время я использую классы IFilter С# CodeProject, но у меня все еще есть несколько вещей, которые не укладываются в мою голову, когда дело доходит до filterPersistClass, persistHandlerClass и COM, и поэтому я немного потерялся в том, как я мог заставить это работать.
Я сделал все обыденные вещи, такие как получение dll, настройка файла ресурсов с «Расширением, путем DLL» и так далее, но просто не могу понять, как теперь загрузить DLL IFilter. Возможно, мне следует начать с нуля, но я подумал, что сначала попрошу помощи.
ИЗМЕНИТЬ (частичное решение)
Ну, я понял, как загрузить query.dll, используя приведенный ниже код в конструкторе FilterReader в FilterReader.cs, хотя сейчас у меня проблемы с загрузкой файла PDFFilter.dll, и я получаю следующую ошибку:
Не удалось найти точку входа с именем «LoadIFilter» в DLL «C:\Program Files\Adobe\Adobe PDF iFilter 9 для 64-разрядных платформ\bin\PDFFilter.dll»
Проблема, на которой я сейчас застрял, заключается в том, что PDFFilter.dll использует STA, а приложения C # - MTA.
[DllImport("query.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern int LoadIFilter(string pwcsPath, [MarshalAs(UnmanagedType.IUnknown)] ref object pUnkOuter, ref IFilter ppIUnk);
// --------------------------- constructor ----------------------------------
var isFilter = false;
object iUnknown = null;
LoadIFilter(fileName, ref iUnknown, ref _filter);
var persistFile = (_filter as IPersistFile);
if (persistFile != null)
{
persistFile.Load(fileName, 0);
IFILTER_FLAGS flags;
IFILTER_INIT iflags =
IFILTER_INIT.CANON_HYPHENS |
IFILTER_INIT.CANON_PARAGRAPHS |
IFILTER_INIT.CANON_SPACES |
IFILTER_INIT.APPLY_INDEX_ATTRIBUTES |
IFILTER_INIT.HARD_LINE_BREAKS |
IFILTER_INIT.FILTER_OWNED_VALUE_OK;
if (_filter.Init(iflags, 0, IntPtr.Zero, out flags) == IFilterReturnCode.S_OK)
isFilter = true;
}
if (_filter != null && isFilter) return;
if (_filter != null) Marshal.ReleaseComObject(_filter);