我遇到問題,Adobe PDF iFilter不能一直爲我們工作。因此,我們喜歡使用Foxit中的那個。問題是,如果我們安裝Foxit iFilter,然後客戶決定重新安裝Adobe Reader,它可能會覆蓋Foxit iFilter。以編程方式確定安裝哪些iFilters
我們可以使用諸如IFilter Explorer這樣的工具來查看這個,但我想在應用程序中這樣做,並警告用戶/客戶端iFilter已經改變。
有沒有辦法從代碼(C#)中檢查iFilters?或者解決這個問題的其他方法?
我遇到問題,Adobe PDF iFilter不能一直爲我們工作。因此,我們喜歡使用Foxit中的那個。問題是,如果我們安裝Foxit iFilter,然後客戶決定重新安裝Adobe Reader,它可能會覆蓋Foxit iFilter。以編程方式確定安裝哪些iFilters
我們可以使用諸如IFilter Explorer這樣的工具來查看這個,但我想在應用程序中這樣做,並警告用戶/客戶端iFilter已經改變。
有沒有辦法從代碼(C#)中檢查iFilters?或者解決這個問題的其他方法?
由於福祿的IFilter實現IPersistStream接口,我認爲你可以嘗試從IFilter獲取這個接口,並查詢它的CLSID來查看它是否是來自foxit的接口。 Foxit IFilter的CLSID爲{987f8d1a-26e6-4554-b007-6b20e2680632}
,它是IFilter Explorer中的「Persistent Handlers Addins Registered」列。
Adobe的IFilter似乎沒有實現這個接口。
我會給這個檢查正確的答案,因爲它儘可能接近。似乎沒有簡單的方法來枚舉所有的iFilters,但Smithy是對的,如果你知道你在找什麼,你可以挖掘並確定它是否被安裝(假設它暴露了一個接口等) – 2011-02-12 18:43:18
謝謝你的檢查。我剛剛從我的Windows SDK中發現了FiltReg.exe命令行實用程序。它爲您提供了系統中已安裝的IFilter的完整列表。如果你可以解析它的輸出...... – Smithy 2011-02-14 15:55:04
我會預計 IFilter存儲在註冊表中,因此您可以使用Process Monitor來查看IFilter資源管理器正在檢查的鍵。
然後檢查MSDN,這與文檔一致。
然後在您的應用程序中使用.NET註冊表類型做同樣的事情。
基於尋找此答案,註冊可以存在於系統和用戶級別,因此您可能需要枚舉多個註冊表項。
我正在使用這個小函數來給出一個列表。它只是使用擴展名而不是文檔類型!在大多數情況下,這是好的,可以在這裏輕鬆更改。
/// <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;
}
}
有點怪的答案;),但作爲替代方式,可以從Windows 7 SDK使用外部控制檯應用程序Filtreg.exe到這項工作委託給它。
我也會對這個問題的答案感興趣! – 2009-10-28 14:37:37
Sooooo ..你有沒有想過如何檢查代碼中是否存在iFilter? – Skadoosh 2010-10-19 17:23:18
@KP - 不,我沒有。放棄了,而不是在代碼中完成它已經留給用戶和文檔來處理,而不是一個真正的解決方案,但我們現在可以做的最好。 – 2010-10-20 00:38:29