2010-12-16 19 views
2

私の要件は、Adobe Acrobat Readerに関連する特定のレジストリキーを読み取り、そのキーの値に基づいて決定することです。Adob​​e 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

あなた最善の希望は、バージョン番号を含むレジストリキーを開き、おそらくそれは、バージョン番号のように見える検証し、各サブキーを列挙し、あなたの事のために、それらの各サブキーで見ることです欲しいです。あなたが見つけた最も高い番号のバージョンだけを使いたいかもしれません。

明らかにこれは、バージョンキーに関連した同じレジストリエントリに常に含まれているか、常に同じ名前のエントリに含まれている場合にのみ機能します(サブキーの下のすべての要素を列挙しなければなりませんあなたが望むもの)。

すべてのリリースで名前と場所が変更された場合は、データから何らかの形で認識できる場合を除き、問題が発生します。その場合、すべての要素を列挙し、そのデータを見て、あなたが望むものですが、このアプローチは危険や偽陽性を伴う可能性があります。

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

私のレジストリはアクロバットでに関連する何もしています:

HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\

アドビシステムズ社は、時間渡すと、すべてのレジストリを介して各自のレジストリキーを移動しているようだ..so ... 私はちょうど彼らがトンで、Program Filesフォルダの外のAcrobat自体を動かす避けることを願っています彼の将来...私はあなたが以下に適用することができると思う

0

を(あなたが...これらの人々に知っていることはありません)ロジック: 日干しファイルの関連付けがレジストリに保存されている - あなたは HKEY_CLASSES_ROOTの下でそれらを読むことができます\ .PDF \ OpenWithList

  • Acrobat.exe
  • AcroRD32.exe
  • など:

    これらのサブキーには、アプリ名(もしあれば)です

HKEY_CLASSES_ROOTの\アプリケーションがXXXX \シェル\オープン\コマンドに

  • HKEY_CLASSES_ROOTの\アプリケーションの\ \
    • (どちらかオープンまたは読むが存在しなければならない)のキーを組み合わせて、読むためにそれらを使用しますXXXX \ shell \ Read \ command

    存在する場合は、 "C:\ Progと似ていますあなたが%1をストリップしてAdobeのアプリのパスを取得できる場所から、ファイル(x86)\ Adob​​e \ Acrobat 7.0 \ Acrobat \ Acrobat.exe ""%1 " をramファイルにコピーします。ここ

    は、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"
  • 関連する問題