2010-12-16 3 views
2

Мое требование - прочитать конкретный раздел реестра, связанный с читателем Adobe Acrobat, и принять решение на основе значения этого ключа.Обновление раздела реестра Adobe Acrobat Reader постоянно меняется

Хотя это кажется простым, так как мне нужно запросить ключ, используя класс реестра (для .NET) , а затем принять решение на основе значения.

Однако проблема, с которой я сталкиваюсь сейчас, заключается в том, что местоположение раздела реестра постоянно меняется почти в каждой новой версии Adobe Acrobat Reader.

Все, о чем я могу думать сейчас, это иметь корпус коммутатора для обработки всех различных версий Adobe в моем коде.

RegistryKey adobe = Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("Adobe"); 
      if (adobe != null) 
      { 
       RegistryKey acroRead = adobe.OpenSubKey("Acrobat Reader"); 
       if (acroRead != null) 
       { 
        string[] acroReadVersions = acroRead.GetSubKeyNames(); 
        Console.WriteLine("The following version(s) of Acrobat Reader are installed: "); 
        foreach (string versionNumber in acroReadVersions) 
        { 
         switch(versionNumber) 
         { 
          case 1.x = //do something; 
             //break;  
          case 2.x = //do something; 
             //break; 
          case 6.x = //do something; 
             //break; 
          case 9.x = //do something; 
             //break; 
         } 
        } 
       } 
      } 

Но некоторые из них не удовлетворены этим подходом. Каждый раз, когда Adobe выпускает новую версию, я должен убедиться, что мне придется обрабатывать ее по-разному. Любые предложения для лучшего подхода.

Благодаря

ответ

2

вы лучшая надежда, чтобы открыть раздел реестра, содержащий номер версии, а затем перечислить каждый вспомогательный ключ, возможно, проверкой он выглядит как номер версии, а затем посмотреть в каждом из этих подразделов за вещь, которую вы хотеть. Вы можете использовать только самую высокую версию, которую вы найдете.

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

Если вы хотите изменить имя и местоположение в каждом выпуске, тогда у вас возникнет проблема, если вы не сможете каким-то образом распознать ее из данных, и в этом случае перечислите каждый элемент и посмотрите на данные4 и попытайтесь решить, это то, что вы хотите, но этот подход, вероятно, чреват опасностью или ложными срабатываниями.

0

Ну, у меня есть точно такая же проблема и с тех пор я знаю, что Adobe не так ярко в своих решениях и задатки, я думаю, я буду попробовать этот подход:

public static string AcrobatReaderPath 
    { 
     get 
     { 
      var paths = new List<string>() 
        { 
         Registry.GetValue(@"HKEY_CLASSES_ROOT\Software\Adobe\Acrobat\Exe", "", @"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe") as string 
        }; 
      var files = Directory.GetFileSystemEntries(@"C:\Program Files (x86)\Adobe\", @"*Acr*R*d*32.exe", SearchOption.AllDirectories); 
      paths.AddRange(files); 
      foreach(var path in paths) if (File.Exists(path)) return path; 
      return ""; 
     } 
    } 

Мой реестр не имеет ничего, связанные с Acrobat в :

HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\

..so кажется Adobe движется ключи реестра по всему реестру со временем прохождения ... Я просто надеюсь, что они будут избегать перемещения самой Acrobat вне папки Program Files в т он в будущем ... (вы никогда не знаете, с этими людьми ...)

0

Я думаю, что вы можете применить следующую логику: ассоциации файлов глинобитные хранятся в реестре - вы можете прочитать их под HKEY_CLASSES_ROOT \ .pdf \ OpenWithList

Эти подразделы имена приложений (если таковые имеются):

  • Acrobat.exe
  • AcroRd32.exe
  • и т.д.

Используйте их, чтобы объединить и читать ключи (или Открыть или Read должны присутствовать)

  • HKEY_CLASSES_ROOT \ Applications \ XXXX \ оболочки \ Open \ Command
  • HKEY_CLASSES_ROOT \ Applications \ XXXX \ shell \ Read \ command

Если присутствует, они будут похожи на "C: \ Prog ram Файлы (x86) \ Adobe \ Acrobat 7.0 \ Acrobat \ Acrobat.exe ""% 1 " , где вы можете удалить% 1 и получить путь к adobe.

Вот C# код:

private void AddShellCommandDefault(List<string> lst, RegistryKey shell, string reg KeyOpenRead) 
{ 
    var shellOpen = shell.OpenSubKey(regKeyOpenRead); 
    if (shellOpen == null) return; 

    var shellOpenCommand = shellOpen.OpenSubKey("command"); 
    if (shellOpenCommand == null) return; 

    var defaultVal = shellOpenCommand.GetValue(null); 
    if (defaultVal == null) return; 

    int kex = defaultVal.ToString().LastIndexOf(".exe", StringComparison.OrdinalIgnoreCase); 
    if (kex < 0) return; 

    lst.Add(defaultVal.ToString().Substring(0, kex).Replace("\"", "") + ".exe"); 
} 

public List<string> GetAdobeApps() 
{ 
    var addobeList = new List<string>(); 

    // HKEY_CLASSES_ROOT\.pdf\OpenWithList\Acrobat.exe 
    // HKEY_CLASSES_ROOT\Applications\Acrobat.exe\shell\Open\command 
    // default "C:\Program Files (x86)\Adobe\Acrobat 7.0\Acrobat\Acrobat.exe" "%1" 

    var adobe = Registry.ClassesRoot.OpenSubKey(".pdf"); 
    if (adobe == null) return addobeList; 

    var openWith = adobe.OpenSubKey("OpenWithList"); 
    if (openWith == null) return addobeList; 

    var apps = Registry.ClassesRoot.OpenSubKey("Applications"); 
    if (apps == null) return addobeList; 

    foreach (string sLong in openWith.GetSubKeyNames()) 
    { 
     string s = sLong.Split(@"\/".ToCharArray()).Last(); 
     var adobeApp = apps.OpenSubKey(s); 
     if (adobeApp == null) continue; 

     var shell = adobeApp.OpenSubKey("shell"); 
     if (shell == null) continue; 

     AddShellCommandDefault(addobeList, shell, "Read"); 
     AddShellCommandDefault(addobeList, shell, "Open"); 
    } 

    return addobeList; 
}   

When run GetAdobeApps, it returns collection similar to Count = 2 [0]: "C:\\Program Files (x86)\\Adobe\\Acrobat 7.0\\Acrobat\\Acrobat.exe" [1]: "C:\\Program Files (x86)\\Adobe\\Reader 9.0\\Reader\\AcroRd32.exe"
Смежные вопросы