2009-09-08 69 views
4

我遇到問題,Adobe PDF iFilter不能一直爲我們工作。因此,我們喜歡使用Foxit中的那個。問題是,如果我們安裝Foxit iFilter,然後客戶決定重新安裝Adobe Reader,它可能會覆蓋Foxit iFilter。以編程方式確定安裝哪些iFilters

我們可以使用諸如IFilter Explorer這樣的工具來查看這個,但我想在應用程序中這樣做,並警告用戶/客戶端iFilter已經改變。

有沒有辦法從代碼(C#)中檢查iFilters?或者解決這個問題的其他方法?

+0

我也會對這個問題的答案感興趣! – 2009-10-28 14:37:37

+0

Sooooo ..你有沒有想過如何檢查代碼中是否存在iFilter? – Skadoosh 2010-10-19 17:23:18

+0

@KP - 不,我沒有。放棄了,而不是在代碼中完成它已經留給用戶和文檔來處理,而不是一個真正的解決方案,但我們現在可以做的最好。 – 2010-10-20 00:38:29

回答

3

由於福祿的IFilter實現IPersistStream接口,我認爲你可以嘗試從IFilter獲取這個接口,並查詢它的CLSID來查看它是否是來自foxit的接口。 Foxit IFilter的CLSID爲{987f8d1a-26e6-4554-b007-6b20e2680632},它是IFilter Explorer中的「Persistent Handlers Addins Registered」列。

Adob​​e的IFilter似乎沒有實現這個接口。

+0

我會給這個檢查正確的答案,因爲它儘可能接近。似乎沒有簡單的方法來枚舉所有的iFilters,但Smithy是對的,如果你知道你在找什麼,你可以挖掘並確定它是否被安裝(假設它暴露了一個接口等) – 2011-02-12 18:43:18

+1

謝謝你的檢查。我剛剛從我的Windows SDK中發現了FiltReg.exe命令行實用程序。它爲您提供了系統中已安裝的IFilter的完整列表。如果你可以解析它的輸出...... – Smithy 2011-02-14 15:55:04

1

我會預計 IFilter存儲在註冊表中,因此您可以使用Process Monitor來查看IFilter資源管理器正在檢查的鍵。

然後檢查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; 
    } 

} 
相關問題