2009-09-08 3 views
4

У меня проблема, из-за которой Adobe PDF iFilter не работает последовательно для нас. Таким образом, мы любим использовать один из Foxit. Проблема в том, что если мы установим Foxit iFilter, а затем клиент решает переустановить Adobe Reader, он может перезаписать Foxit iFilter.Программно определить, какие iFilters установлены

Для этого можно использовать такие инструменты, как IFilter Explorer, но я хотел бы сделать это в приложении и предупредить пользователя/клиента, что iFilter изменился.

Есть ли способ проверить iFilters из кода (C#)? Или другие возможные решения этой проблемы?

+0

Мне тоже будет интересен ответ! –

+0

Sooooo .. Вы когда-нибудь выяснили, как проверить, существует ли iFilter из кода? – Skadoosh

+0

@ KP - Нет, я этого не делал. Оказалось, и вместо того, чтобы делать это в коде, оно оставило его пользователю и документации для обработки, а не реальному решению, но самое лучшее, что мы можем сделать сейчас. –

ответ

3

Поскольку foxit IFilter реализует интерфейс IPersistStream, я думаю, вы можете попробовать получить этот интерфейс от IFilter и запросить его CLSID, чтобы узнать, является ли он одним из foxit. Foxit IFilter имеет CLSID {987f8d1a-26e6-4554-b007-6b20e2680632}, который является столбцом «Постоянный обработчик Addins Registered» в IFilter Explorer.

Adobe IFilter, похоже, не реализует этот интерфейс.

+0

Я дам этому проверку на правильный ответ, поскольку он как можно ближе. Кажется, нет простого способа перечислить все iFilters, но Смити прав, если вы знаете, что ищете, вы можете выкопать и определить, установлен ли этот (при условии, что он предоставляет интерфейс и т. Д.). –

+1

Благодарим вас за проверить. И я только что открыл утилиту командной строки FiltReg.exe из моего Windows SDK. Он дает вам полный список установленных IFilters в системе. Если вы можете просто разобрать свой вывод ... – Smithy

1

Я хотел бы ожидать, что IFilters хранятся в реестре, поэтому вы можете использовать Process Monitor, чтобы узнать, какие ключи проверяет IFilter Explorer.

Затем проверьте MSDN, что это соответствует документации.

Затем выполните то же самое, используя типы реестра .NET в своем приложении.

Основываясь на поиске ответа, регистрация может существовать как на уровне системы, так и на уровне пользователя, поэтому вам, вероятно, потребуется перечислить несколько разделов реестра.

-1

Я использую эту небольшую функцию, чтобы выдать список. Он просто использует расширение НЕ тип документа! В большинстве случаев это нормально, и его можно легко изменить здесь.

/// <summary> 
/// Implements a Function to get all available IFilters currently registered in this system 
/// </summary>  
public string GetFilterList() 
{ 
    //Our resulting string. We give back a ';' seperated list of extensions. 
    string result = @""; 
    string persistentHandlerClass; 

    RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"Software\Classes"); 
    if (rk == null) 
     return null; 

    using (rk) 
    { 
     foreach(string subKeyName in rk.GetSubKeyNames()) 
     { 
      if (subKeyName[0] == '.') //possible Extension 
      { 
       RegistryKey sk = Registry.LocalMachine.OpenSubKey(@"Software\Classes\" + subKeyName + @"\PersistentHandler"); 
       if (sk == null) 
        continue; 

       using (sk) 
       { 
        persistentHandlerClass = (string)sk.GetValue(null); 
       } 

       if (persistentHandlerClass != null) 
       { 
        string filterPersistClass = ReadStrFromHKLM(@"Software\Classes\CLSID\" + persistentHandlerClass + 
         @"\PersistentAddinsRegistered\{89BCB740-6119-101A-BCB7-00DD010655AF}"); 
        string dllName = ReadStrFromHKLM(@"Software\Classes\CLSID\" + filterPersistClass + @"\InprocServer32"); 

        // skip query.dll results, cause it's not an IFilter itself 
        if (dllName != null && filterPersistClass != null && (dllName.IndexOf("query.dll") < 0)) 
        { 
         //result = result + subKeyName + @"[" + dllName + @"] - persistentHandlerClassAddin: " + persistentHandlerClass + "\r\n"; //[C:\Windows\system32\query.dll] 
         //result = result + subKeyName + @"[" + dllName + @"];"; //[C:\Windows\system32\query.dll] 
         result = result + subKeyName.ToLower() + @";"; 
        } 
       } 

      } 
     } 

     return result; 
    } 

} 
0

Немного странный ответ;), но как альтернативный способ можно использовать внешнее консольное приложение Filtreg.exe из Windows 7 SDK делегировать эту работу к нему.

Смежные вопросы