Я использую IFilter для индексирования некоторых документов MS Office. загрузка из файла в порядке, все работает отлично, как и во всех руководствах и образцов:Initiliaze IFilter от IStream
HRESULT hr_f = LoadIFilter(filename, 0, (void **)&pFilter);
Однако, используя BindIFilterFromStream API не удалось, и я не могу понять, как правильно его использовать.
HRESULT hr_ss = BindIFilterFromStream(spStream/*my IStream* impl*/, 0, (void **)&pFilter);
я реализовал интерфейс IStream
, только метод (за исключением IUnknown
«S) Вызванный во время инициализации является:
HRESULT StreamFilter::Stat(STATSTG * pstatstg, DWORD grfStatFlag)
{
//Microsoft Office Ifilter from Windows Registry
const IID CLSID_IFilter = {
0xf07f3920,
0x7b8c,
0x11cf,
{ 0x9b, 0xe8, 0x00, 0xaa, 0x00, 0x4b, 0x99, 0x86 }
//{f07f3920-7b8c-11cf-9be8-00aa004b9986}
};
LARGE_INTEGER pSize;
int fl = GetFileSizeEx(_hFile, &pSize);
memset(pstatstg, 0, sizeof(STATSTG));
pstatstg->clsid = CLSID_IFilter;
pstatstg->type = STGTY_STREAM;
pstatstg->cbSize.QuadPart = pSize.QuadPart;
return S_OK;
}
После этого hr_ss
является E_FAIL
и IFilter
является NULL
.
Есть случай Using IFilter in C#, и те, метод прекрасно работает только для * .pdf в с ++ тоже, но не для MSO документы ...
Из вашей ссылки для BindIFilterFromStream: «Служба индексирования не поддерживается как Windows XP» - в какой версии Windows вы пытаетесь это сделать? –
hm, devmachine - это windows 8.1, я тестировал в win2k3 - тот же результат, что и на моем Win8 PC ... \t Кажется, я осознал свою ошибку :(Это значит, что в Windows, новее, чем WinXP, я не могу использовать этот API? Прошу прощения за мой английский ... – tomato