View Javadoc

1   /*
2    * Copyright 2004-2008 the Seasar Foundation and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16  package org.seasar.uruma.util.win32;
17  
18  import org.eclipse.swt.internal.win32.OS;
19  import org.eclipse.swt.internal.win32.TCHAR;
20  import org.seasar.uruma.core.UrumaConstants;
21  import org.seasar.uruma.exception.Win32ApiException;
22  import org.seasar.uruma.util.AssertionUtil;
23  
24  /**
25   * Windows レジストリアクセスに関するユーティリティクラスです。<br />
26   * 
27   * @author y-komori
28   */
29  public class RegistryUtil {
30      private RegistryUtil() {
31  
32      }
33  
34      /**
35       * <code>HKEY_LOCAL_MACHINE</code> を表すハンドルです。<br />
36       */
37      public static int HKEY_LOCAL_MACHINE = OS.HKEY_LOCAL_MACHINE;
38  
39      /**
40       * <code>HKEY_CLASSES_ROOT</code> を表すハンドルです。<br />
41       */
42      public static int HKEY_CLASSES_ROOT = OS.HKEY_CLASSES_ROOT;
43  
44      /**
45       * <code>HKEY_CURRENT_USER</code> を表すハンドルです。<br />
46       */
47      public static int HKEY_CURRENT_USER = OS.HKEY_CURRENT_USER;
48  
49      private static int KEY_ALL_ACCESS = 0xF003F;
50  
51      /**
52       * レジストリをオープンします。<br />
53       * 
54       * @param hKey
55       *            ハンドル({@link #HKEY_LOCAL_MACHINE}, {@link #HKEY_CLASSES_ROOT},
56       *            {@link #HKEY_CURRENT_USER} のいずれかを指定)
57       * @param entry
58       *            レジストリエントリ
59       * @return レジストリハンドル
60       */
61      public static RegistryHandle regOpenKey(final int hKey, final String entry) {
62          AssertionUtil.assertNotNull("entry", entry);
63          RegistryHandle handle = new RegistryHandle();
64          int retCode = OS.RegOpenKeyEx(hKey, new TCHAR(OS.CP_INSTALLED, entry,
65                  true), 0, OS.KEY_READ, handle.getPhkResult());
66          if (retCode == 0) {
67              return handle;
68          } else {
69              throw new Win32ApiException("RegOpenKeyEX", retCode);
70          }
71      }
72  
73      /**
74       * レジストリをクローズします。<br />
75       * 
76       * @param handle
77       *            オープンされたレジストリハンドル
78       */
79      public static void regCloseKey(final RegistryHandle handle) {
80          AssertionUtil.assertNotNull("handle", handle);
81          if (handle.getPointer() != 0) {
82              OS.RegCloseKey(handle.getPointer());
83          }
84      }
85  
86      /**
87       * レジストリから値を読み込みます。<br />
88       * 
89       * @param handle
90       *            オープンされたレジストリハンドル
91       * @param valueName
92       *            読み込む値の名称
93       * @return 読み込んだ結果
94       */
95      public static String regQueryValue(final RegistryHandle handle,
96              final String valueName) {
97          AssertionUtil.assertNotNull("handle", handle);
98          AssertionUtil.assertNotNull("valueName", valueName);
99  
100         TCHAR buf = new TCHAR(OS.CP_INSTALLED, 256);
101         final int[] len = new int[] { 256 };
102         int retCode = OS.RegQueryValueEx(handle.getPointer(), new TCHAR(
103                 OS.CP_INSTALLED, valueName, true), 0, null, buf, len);
104         if (retCode == 0) {
105             return buf.toString(0, buf.strlen());
106         } else {
107             regCloseKey(handle);
108             throw new Win32ApiException("RegQueryValueEx", retCode);
109         }
110     }
111 
112     /**
113      * レジストリから値を読み込んで返します。<br />
114      * 
115      * @param hKey
116      *            ハンドル({@link #HKEY_LOCAL_MACHINE}, {@link #HKEY_CLASSES_ROOT},
117      *            {@link #HKEY_CURRENT_USER} のいずれかを指定)
118      * @param entry
119      *            レジストリエントリ
120      * @param key
121      *            キー
122      * @return 読み込んだ値。エントリやキーが見つからなかった場合は <code>null</code>
123      */
124     public static String getRegistryValue(final int hKey, final String entry,
125             final String key) {
126         try {
127             RegistryHandle handle = RegistryUtil.regOpenKey(hKey, entry);
128             String value = RegistryUtil.regQueryValue(handle, key);
129             RegistryUtil.regCloseKey(handle);
130             return value;
131         } catch (Win32ApiException ex) {
132             return null;
133         }
134     }
135 
136     /**
137      * レジストリから規定値を読み込んで返します。<br />
138      * 
139      * @param hKey
140      *            ハンドル({@link #HKEY_LOCAL_MACHINE}, {@link #HKEY_CLASSES_ROOT},
141      *            {@link #HKEY_CURRENT_USER} のいずれかを指定)
142      * @param entry
143      *            レジストリエントリ
144      * @return 読み込んだ値。エントリやキーが見つからなかった場合は <code>null</code>
145      */
146     public static String getRegistryValue(final int hKey, final String entry) {
147         return getRegistryValue(hKey, entry, UrumaConstants.NULL_STRING);
148     }
149 }