以编程方式确定安装了哪些iFilter

时间:2009-09-08 14:32:14

标签: c# pdf ifilter

我遇到一个问题,即Adobe PDF iFilter不能始终如一地为我们工作。因此,我们希望使用Foxit中的那个。问题是,如果我们安装Foxit iFilter然后客户端决定重新安装Adobe Reader,它可能会覆盖Foxit iFilter。

我们可以使用IFilter Explorer之类的工具来查看这个,但我想在应用程序中执行此操作,并警告用户/客户端iFilter已更改。

有没有办法从代码(C#)检查iFilters?或其他可能解决这个问题的方法?

4 个答案:

答案 0 :(得分:3)

由于foxit IFilter实现了IPersistStream接口,我认为您可以尝试从IFilter获取此接口,并查询其CLSID以查看它是否来自foxit。 Foxit IFilter的CLSID为{987f8d1a-26e6-4554-b007-6b20e2680632},这是IFilter Explorer中的“Persistent Handlers Addins Registered”列。

Adob​​e的IFilter似乎没有实现此接口。

答案 1 :(得分:1)

期望 IFilter存储在注册表中,因此您可以使用Process Monitor查看IFilter Explorer正在检查的键。

然后检查MSDN这与文档是否一致。

然后在应用程序中使用.NET的注册表类型执行相同的操作。

基于寻找此答案,注册可以在系统和用户级别存在,因此您可能需要枚举多个注册表项。

答案 2 :(得分:0)

一个奇怪的答案;)但是可以使用来自Filtreg.exe的外部控制台应用Windows 7 SDK替代方式将此作业委托给它。

答案 3 :(得分:-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;
    }

}