Использование 32-битного объекта Com из 64-битного IFilter - PullRequest
4 голосов
/ 29 сентября 2010

У меня в Delphi написан IFilter, который я пытаюсь заставить работать под 64-битной Windows 7 Desktop Search.

Благодаря тому, что он разрабатывается в Delphi, я могу скомпилировать его только как 32-битную DLL.

Чтобы обойти это, я пытаюсь написать 64-битный IFilter Dll в Visual C ++, который внутренне использует мой 32-битный объект IFilter Com, используя технику DllSurogate, описанную здесь .

У меня все это работает нормально в тестовом 64-битном консольном приложении. Я могу создать экземпляр моей 64-битной оболочки, которая внутренне создает 32-битный объект IFilter и делегирует ему все вызовы. Затем я могу получить содержимое моего документа.

Проблема в том, что когда я регистрируюсь в WDS, 64-битная оболочка больше не может создавать 32-битный объект. CoCreateInstance возвращает «Ошибка выполнения сервера» (CO_E_SERVER_EXEC_FAILURE).

Это я создаю 32-битный объект в стороне от 64-битной оболочки

result = CoCreateInstance(clsid, 0, CLSCTX_LOCAL_SERVER , IID_IFilter, (LPVOID*)&m_pFilter);

Любая идея, почему это происходит. Это ограничение разрешений с IFilters в WDS?

Спасибо за любую помощь в этом.

Ответы [ 2 ]

7 голосов
/ 29 сентября 2010

Да, это так. IFilters запускаются в процессе хостинга с именем SearchFilterHost.exe. Поскольку фильтры могут потенциально открывать файлы с вредоносным содержимым, хост работает с очень ограниченными правами. Возможность начать процесс, конечно, не будет включена. Не знаю, как это переопределить, или, если уж на то пошло, стоит подумать. Погуглив "searchfilterhost.exe", выдает много тревожных звонков. Это должно быть печальная новость, извините за то, что вы предъявитель.

1 голос
/ 29 сентября 2010

Также имейте в виду, что вызывающее приложение не будет обязательно выгружать ваш ifilter после каждого использования.Он будет повторно использовать ifilter в памяти для анализа многих файлов.Однако, если хост-процесс обнаружит проблему (такую ​​как растущая утечка памяти), он разгрузит ваш ifilter и попытается снова.Несколько лет назад я работал с 32-битным кодом ifilter, но мне не удалось преодолеть гораздо более строгие ограничения на 64-битные.Если вы узнаете, как это делается, я надеюсь, что вы захотите опубликовать подробности в сети ...

...