Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式确定安装了哪些IFilter_C#_Pdf_Ifilter - Fatal编程技术网

C# 以编程方式确定安装了哪些IFilter

C# 以编程方式确定安装了哪些IFilter,c#,pdf,ifilter,C#,Pdf,Ifilter,我有一个问题,Adobe PDF iFilter不能始终为我们工作。因此,我们喜欢使用来自的。问题是,如果我们安装了Foxit iFilter,然后客户端决定重新安装Adobe Reader,它可能会覆盖Foxit iFilter 我们可以使用工具(例如)来查看此内容,但我想在应用程序中使用一种方法来执行此操作,并警告用户/客户端iFilter已更改 有没有办法从代码(C#)中检查iFilter?或者这个问题的其他潜在解决方案?我希望IFilter存储在注册表中,因此您可以使用它查看IFilte

我有一个问题,Adobe PDF iFilter不能始终为我们工作。因此,我们喜欢使用来自的。问题是,如果我们安装了Foxit iFilter,然后客户端决定重新安装Adobe Reader,它可能会覆盖Foxit iFilter

我们可以使用工具(例如)来查看此内容,但我想在应用程序中使用一种方法来执行此操作,并警告用户/客户端iFilter已更改

有没有办法从代码(C#)中检查iFilter?或者这个问题的其他潜在解决方案?

我希望IFilter存储在注册表中,因此您可以使用它查看IFilter Explorer正在检查哪些项

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

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


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

由于foxit IFilter实现了IPersistStream接口,我认为您可以尝试从IFilter获取此接口,并查询其CLSID以查看它是否是来自foxit的接口。Foxit IFilter的CLSID为
{987f8d1a-26e6-4554-b007-6b20e2680632}
,这是IFilter Explorer中的“已注册的持久处理程序加载项”列


Adobe的IFilter似乎没有实现这个接口。

我正在使用这个小函数给出一个列表。它只是使用扩展名,而不是文档类型!在大多数情况下,这是正常的,可以很容易地改变这里

/// <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;
    }

}
//
///实现一个函数以获取当前在此系统中注册的所有可用IFilter
///     
公共字符串GetFilterList()
{
//我们将返回一个“;”分隔的扩展名列表。
字符串结果=@“”;
字符串persistentHandlerClass;
RegistryKey rk=Registry.LocalMachine.OpenSubKey(@“软件\类”);
如果(rk==null)
返回null;
使用(rk)
{
foreach(rk.GetSubKeyNames()中的字符串subKeyName)
{
if(subKeyName[0]='.')//可能的扩展名
{
RegistryKey sk=Registry.LocalMachine.OpenSubKey(@“软件\类\”+子键名+@“\PersistentHandler”);
if(sk==null)
继续;
使用(sk)
{
persistentHandlerClass=(字符串)sk.GetValue(null);
}
if(persistentHandlerClass!=null)
{
字符串filterPersistClass=ReadStrFromHKLM(@“Software\Classes\CLSID\”+persistentHandlerClass+
@“\PersistentAddInRegistered\{89BCB740-6119-101A-BCB7-00DD010655AF}”;
字符串dllName=ReadStrFromHKLM(@“Software\Classes\CLSID\”+filterPersistClass+@“\InprocServer32”);
//跳过query.dll结果,因为它本身不是IFilter
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]
结果=结果+子关键字名.ToLower()+@“;
}
}
}
}
返回结果;
}
}

一个有点奇怪的答案;)但作为替代方法,可以使用外部控制台应用程序将此任务委托给它。

我也对这个问题的答案感兴趣!苏好。。你有没有想过如何检查代码中是否存在iFilter?@KP-没有。放弃了,而不是在代码中完成,这让用户和文档来处理,这不是一个真正的解决方案,而是我们目前所能做的最好的解决方案。我将检查这个问题的正确答案,因为它尽可能接近。似乎没有简单的方法来列举所有的iFilter,但Smithy是对的,如果你知道你在寻找什么,你可以挖掘并确定是否安装了iFilter(假设它公开了一个接口等)。谢谢你的检查。我刚刚从我的Windows SDK中发现了filtereg.exe命令行实用程序。它提供了系统上已安装iFilter的完整列表。如果你能解析它的输出。。。