2 using System.Collections.Generic;
\r
3 using Microsoft.Win32;
\r
8 /// ICatManagerの暫定的かつピュアC#実装。レジストリを舐めてICatManagerと同等の機能を実現する。
\r
10 class GuidEnumeratorForCategories : IEnumerable<Guid>, IDisposable
\r
12 private RegistryKey key;
\r
14 private string[] subkeys;
\r
16 private Guid catGuid;
\r
18 public GuidEnumeratorForCategories(Guid category)
\r
20 key = Registry.ClassesRoot.OpenSubKey(@"CLSID", false);
\r
21 subkeys = key.GetSubKeyNames();
\r
25 public void Dispose()
\r
33 public IEnumerator<Guid> GetEnumerator()
\r
35 return _getEnumerator();
\r
38 System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
\r
40 return _getEnumerator();
\r
43 private IEnumerator<Guid> _getEnumerator()
\r
45 // レジストリ内のImplemented Category内の値と比較する値
\r
46 string strCategory = catGuid.ToString("B").ToUpper();
\r
48 foreach (string subkey in subkeys) {
\r
49 // "CLSID"、基本タイプ("...046}")は無視する
\r
50 if ((subkey == "CLSID") ||
\r
51 subkey.EndsWith("-0000-0000-C000-000000000046}", StringComparison.OrdinalIgnoreCase)) {
\r
55 // Implemented Categoryにあれば、subkeyをGUIDに変換して返す
\r
56 RegistryKey guidKey = key.OpenSubKey(string.Format(@"{0}\Implemented Categories\{1}", subkey, strCategory), false);
\r
57 if (guidKey != null) {
\r
59 yield return new Guid(subkey);
\r