Используйте IFilter из VB
Вопрос
Я использую 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 для загрузки и попытается ли он его загрузить.