Используйте 32-битную и / или 64-битную DLL IFilter из 64-битного приложения - PullRequest
0 голосов
/ 21 октября 2019

У меня есть приложение, которое анализирует текст из файлов, используя встроенные фильтры IFilters. Этот подход идеален, поскольку он позволяет мне анализировать текст из большинства типов файлов при условии, что на моем компьютере установлен IFilter.

Мой класс загрузки / синтаксического анализа IFilter основан на коде из статьи 'codeproject' https://www.codeproject.com/Articles/13391/Using-IFilter-in-C

Доступно здесь на GitHub https://github.com/Sicos1977/IFilterTextReader

Обычно я анализирую текст из файлов MS Office, Excel, Word, PowerPoint, PDF и т. Д. Все работает очень хорошо, когда все фильтры IFilter либо32-битная или 64-битная, поскольку у меня есть как 64-битная, так и 32-битная версия моего программного обеспечения, но я все чаще обнаруживаю, что установленные фильтры IFilter поставляются с 32 или 64 бит, а не с обоими. Например, установленный pdf IFilter может быть 32-битным, но служебные IFilter могут быть 64-битными.

Я могу взломать (и иметь) реестр для указания 64-битных IFilter на 32-битные библиотеки DLL, но это просто взлом,Я хочу избежать этого. Я понятия не имею, какие IFilter будут установлены на клиентском компьютере, и нужно ли иметь возможность вызывать 32-битные DLL-файлы IFilter из 64-битной версии приложения.

Вот заголовки того, что делает IFilterLoader, когда онработает:

Загрузка DLL и создание экземпляра реализации фильтра

ОК, поэтому у нас есть имя DLL и идентификатор класса, реализующего наш фильтр, как это сделатьмы создаем экземпляр этого класса? Большая часть работы выполняется классом ComHelper. Для этого необходимо выполнить следующие шаги:
• Загрузить DLL с помощью LoadLibrary Win32 API.
• Вызвать GetProcAddress Win32 API, чтобы получить указатель на функцию DllGetClassObject.
• ИспользоватьMarshal.GetDelegateForFunctionPointer() для преобразования указателя этой функции в делегат.
Примечание: это доступно только в .NET 2.0. Эквивалентный метод в .NET 1.1 см. В разделе «Ссылки».
• Вызовите функцию DllGetClassObject, чтобы получить объект IClassFactory.

Я много читал о межпроцессных коммуникациях (IPC), ноЯ просто не понимаю, как это реализовать. Это похоже на углубленную статью: https://docs.microsoft.com/en-gb/windows/win32/ipc/interprocess-communications?redirectedfrom=MSDN, но я просто не понимаю, сработает ли это для моего сценария, и если да, то где и как мне начать его реализовывать?

Кто-то, у кого возникла та же проблема, написал, что они «закончили писать процесс-заглушку, который собирает запросы IFilter с 32-разрядных на 64-разрядные и возвращает результаты», но я понятия не имею, что это значит. https://superuser.com/questions/349052/32-bit-program-using-office-ifilters-when-64-bit-office-is-installed

DLL-библиотека IFilter загружается с помощью LoadLibrary Win32 API. Есть ли способ, что если 32-битная библиотека IFilter не загружается, я могу попытаться загрузить и запустить 64-битный фильтр как 32-битный код в эмуляторе WoW64?

Если есть возможность загружать как 32, так и 64-битные фильтры IFilterиз 64-битного приложения, кто-нибудь может дать мне пример, на котором я могу учиться?

...