Вопрос

Я использую VBA (в Access 2003) и хотел бы использовать механизм IFilter для извлечения текстового содержимого файлов.Я нашел хороший C++ образец кода поэтому это выглядит относительно просто, но на данный момент я даже не могу вызвать DLL к Загрузочный фильтр работать:

Declare Function LoadIFilter Lib "query.dll" (ByVal pwcsPath As String, _
    ByVal pUnkOuter As Object, ByRef ppIFilter As Object) As Integer

Public Sub DocEx()
    Dim ifilter As Object
    Dim hresult As Integer

    hresult = LoadIFilter("C:\temp\test.txt" & Chr(0), Nothing, ifilter)
    Debug.Print hresult
End Sub

hresult всегда равен E_FAIL (= 16389).

Это мой синтаксис для DLL неправильный или что-то еще?

ОТРЕДАКТИРОВАНО, ЧТОБЫ ДОБАВИТЬ: В итоге я не решил эту проблему.Но поскольку моя единственная цель — взломать внутренний скрипт, мне достаточно просто вызвать инструмент FiltDump.exe, который поставляется в комплекте с Microsoft Platform SDK, и проанализировать его выходные данные.(Хотя это немного неуклюже, особенно потому, что FiltDump.exe настаивает на выводе сообщений об ошибках на стандартный вывод, а не на стандартный вывод!)

Это было полезно?

Решение

LoadIFilter() предназначен для выполнения большой работы - он просматривает реестр, чтобы найти, какой IFilter загрузить, затем загружает его (скорее всего, вызывает CoCreateInstance() для только что найденного идентификатора класса).Все может пойти не так: в реестре не может быть сопоставления расширения .txt с идентификатором класса, или COM-сервер для этого идентификатора класса может не загрузиться.

Лучше всего использовать Монитор процессов чтобы узнать, найдет ли он какой IFilter для загрузки и попытается ли он его загрузить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top