Используйте IFilter из VB

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

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 настаивает на выводе сообщений об ошибках на стандартный вывод вместо стандартного stderr!)


person Todd Owen    schedule 04.12.2009    source источник


Ответы (1)


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

Лучше всего использовать Process Monitor, чтобы увидеть, находит ли он то, что IFilter загрузить и если хотя бы попытается его загрузить.

person sharptooth    schedule 04.12.2009
comment
Хорошая идея, спасибо. Чтобы сравнить правильную реализацию, я нашел инструменты тестирования в Windows SDK: msdn.microsoft.com/en-us/library/ms692563(VS.85).aspx - person Todd Owen; 10.12.2009