所以我被告知我可能无法访问通常将其 IFilter 加载到系统上的注册表或程序,因此我必须在应用程序中包含 IFilter dll 并直接从那里加载它们。我目前正在使用 CodeProject 的 C# IFilter 类,但是当涉及到 filterPersistClass、persistentHandlerClass 和 COM 时,它们仍然是我头疼的一些事情,因此我对如何让它工作有点迷茫。
我已经完成了所有平凡的事情,例如获取 dll,使用“扩展,DLL 路径”设置资源文件等等,但似乎无法掌握现在如何加载 IFilter DLL。也许我应该从头开始,但我想我会先寻求帮助。
编辑(部分解决方案)
好吧,我想出了如何在 FilterReader.cs 的 FilterReader 构造函数中使用下面的代码来加载 query.dll,尽管我现在在加载 PDFFilter.dll 文件时遇到了问题并且收到以下错误:
在 DLL 'C:\Program Files\Adobe\Adobe PDF iFilter 9 for 64-bit platforms\bin\PDFFilter.dll' 中找不到名为“LoadIFilter”的入口点
我认为我现在遇到的问题是 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);