2

そのため、通常 IFilter をシステムにロードするレジストリまたはプログラムにアクセスできない可能性があると言われたので、アプリケーションに IFilter dll を含めて、そこから直接ロードする必要があります。私は現在、CodeProject の C# IFilter クラスを使用していますが、filterPersistClass、persistentHandlerClass、および COM に関しては、まだ頭を悩ませていることがいくつかあります。そのため、これを機能させる方法について少し迷っています。

dll を取得し、「拡張機能、DLL パス」を使用してリソース ファイルをセットアップするなど、日常的なことはすべて実行しましたが、IFilter DLL をロードする方法を把握できないようです。ゼロから始めたほうがいいのかもしれませんが、まずは助けを求めようと思いました。

EDIT(部分的な解決策)

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);
4

1 に答える 1