winregistrywrapper.java
来自「jdic,显著提高swing性能的插件」· Java 代码 · 共 663 行 · 第 1/2 页
JAVA
663 行
/* * Copyright (C) 2004 Sun Microsystems, Inc. All rights reserved. Use is * subject to license terms. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Lesser GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */ package org.jdesktop.jdic.filetypes.internal;import java.io.DataInputStream;import java.io.IOException;import java.net.URL;/** * Bottom layer java wrapper for Windows registry relevant APIs */public class WinRegistryWrapper { static { System.loadLibrary("jdic"); } /** * Windows handles to <tt>HKEY_CURRENT_USER</tt> and * <tt>HKEY_LOCAL_MACHINE</tt> hives. */ public final static int HKEY_CLASSES_ROOT = 0x80000000; public final static int HKEY_CURRENT_USER = 0x80000001; public final static int HKEY_LOCAL_MACHINE = 0x80000002; public final static int HKEY_USERS = 0x80000003; public final static int HKEY_CURRENT_CONFIG = 0x80000005; /* Windows error or status codes. */ public static final int ERROR_SUCCESS = 0; public static final int ERROR_FILE_NOT_FOUND = 2; public static final int ERROR_ACCESS_DENIED = 5; public static final int ERROR_ITEM_EXIST = 0; public static final int ERROR_ITEM_NOTEXIST = 9; /* Constants for Windows registry element size limits */ public static final int MAX_KEY_LENGTH = 255; public static final int MAX_VALUE_NAME_LENGTH = 255; /* Constants used to interpret returns of native functions */ private static final int OPENED_KEY_HANDLE = 0; private static final int ERROR_CODE = 1; private static final int SUBKEYS_NUMBER = 0; private static final int VALUES_NUMBER = 2; /* Windows security masks */ public static final int DELETE = 0x10000; public static final int KEY_QUERY_VALUE = 1; public static final int KEY_SET_VALUE = 2; public static final int KEY_CREATE_SUB_KEY = 4; public static final int KEY_ENUMERATE_SUB_KEYS = 8; public static final int KEY_READ = 0x20019; public static final int KEY_WRITE = 0x20006; public static final int KEY_ALL_ACCESS = 0xf003f; /** * Java wrapper for Windows registry API RegOpenKey() * @param hKey Windows registry folder * @param subKey key name * @return ERROR_SUCCESS if succeed, or error code if fail */ private static native int[] RegOpenKey(int hKey, byte[] subKey, int securityMask); /** * Java wrapper for Windows registry API RegCloseKey() */ private static native int RegCloseKey(int hKey); /** * Java wrapper for Windows registry API RegCreateKeyEx() */ private static native int[] RegCreateKeyEx(int hKey, byte[] subKey); /** * Java wrapper for Windows registry API RegDeleteKey() */ private static native int RegDeleteKey(int hKey, byte[] subKey); /** * Java wrapper for Windows registry API RegFlushKey() */ private static native int RegFlushKey(int hKey); /** * Java wrapper for Windows registry API RegQueryValueEx() */ private static native byte[] RegQueryValueEx(int hKey, byte[] valueName); /** * Java wrapper for Windows registry API RegSetValueEx() */ private static native int RegSetValueEx(int hKey, byte[] valueName, byte[] value); /** * Java wrapper for Windows registry API RegDeleteValue() */ private static native int RegDeleteValue(int hKey, byte[] valueName); /** * Java wrapper for Windows registry API RegQueryInfoKey() */ private static native int[] RegQueryInfoKey(int hKey); /** * Java wrapper for Windows registry API RegEnumKeyEx() */ private static native byte[] RegEnumKeyEx(int hKey, int subKeyIndex, int maxKeyLength); /** * Java wrapper for Windows registry API RegEnumValue() */ private static native byte[] RegEnumValue(int hKey, int valueIndex, int maxValueNameLength); /** * Java wrapper for Windows API FindMimeFromData() */ private static native byte[] FindMimeFromData(byte[] url, byte[] data); /* * Java wrapper for Windows API ExpandEnvironmentStrings() */ private static native byte[] ExpandEnvironmentStrings(byte[] envBytes); /** * Returns this java string as a null-terminated byte array */ private static byte[] stringToByteArray(String str) { if (str == null) { return null; } byte[] srcByte = str.getBytes(); int srcLength = srcByte.length; byte[] result = new byte[srcLength + 1]; System.arraycopy(srcByte, 0, result, 0, srcLength); result[srcLength] = 0; return result; } /** * Converts a null-terminated byte array to java string */ private static String byteArrayToString(byte[] array) { if (array != null) { String temString = new String(array); if (temString != null) { return temString.substring(0, temString.length() - 1); } } return null; } /** * Suppress default constructor for noninstantiability. */ private WinRegistryWrapper() {} /** * Creates the specified subkey under the parent key(hKey). * <p> * If the subkey already exists in the registry, the function just returns successfully. * An application can create a subkey several levels deep at the same time. Such as the * three preceding subkeys by specifying a string of the following form for the subKey * parameter: subkey1\subkey2\subkey3\subkey4 * </p> * @param hKey specified windows registry folder constant * @param subKey given sub key (not null) * @return ERROR_SUCCESS if succedd, or error code if fail */ public static int WinRegCreateKeyEx(int hKey, String subKey) { byte[] lpSubKey = stringToByteArray(subKey); int[] createResult = RegCreateKeyEx(hKey, lpSubKey); if (createResult == null) { return -1; } if (createResult[ERROR_CODE] == ERROR_SUCCESS) { RegCloseKey(createResult[OPENED_KEY_HANDLE]); } return createResult[ERROR_CODE]; } /** * Removes the specified subkey under the parent key(hKey) from the registry. * The entire sub key, including all of its values, is removed. * @param hKey specified windows registry folder constant * @param subKey given sub key (not null) * @return ERROR_SUCCESS if succedd, or error code if fail */ public static int WinRegDeleteKey(int hKey, String subKey) { int result; byte[] lpSubKey = stringToByteArray(subKey); result = RegDeleteKey(hKey, lpSubKey); if (result == ERROR_SUCCESS) { return result; } else { int res = WinRegSubKeyExist(hKey, subKey); if (res == ERROR_ITEM_NOTEXIST) { return result; } else { String subSubKey; String[] subSubKeys = WinRegGetSubKeys(hKey, subKey, MAX_KEY_LENGTH); for (int keyIndex = 0; keyIndex < subSubKeys.length; keyIndex++) { subSubKey = subKey + "\\" + subSubKeys[keyIndex]; if (subSubKey != null) { WinRegDeleteKey(hKey, subSubKey); } } result = RegDeleteKey(hKey, lpSubKey); return result; } } } /** * Writes all the attributes of the specified sub key into the registry. * @param hKey specified windows registry folder constant * @param subKey given sub key (not null) * @return ERROR_SUCCESS if succedd, or error code if fail */ public static int WinRegFlushKey(int hKey, String subKey) { byte[] lpSubKey = stringToByteArray(subKey); int[] openResult = RegOpenKey(hKey, lpSubKey, KEY_WRITE); if (openResult == null) { return -1; } if (openResult[ERROR_CODE] != ERROR_SUCCESS) { return openResult[ERROR_CODE]; } else { int flushResult = RegFlushKey(openResult[OPENED_KEY_HANDLE]); RegCloseKey(openResult[OPENED_KEY_HANDLE]); return flushResult; } } /** * Retrieves the data associated with the default or unnamed value of a specified * registry key. The data must be a null-terminated string. * @param hKey specified windows registry folder constant * @param subKey given sub key (not null) * @param valueName given value name (not null) * @return content of the value, or null if fail or not exist */ public static String WinRegQueryValueEx(int hKey, String subKey, String valueName) { byte[] lpSubKey = stringToByteArray(subKey); int[] openResult = RegOpenKey(hKey, lpSubKey, KEY_READ); if (openResult == null) { return null; } if (openResult[ERROR_CODE] != ERROR_SUCCESS) { return null; } else { byte[] valueBytes; byte[] lpValueName = stringToByteArray(valueName); valueBytes = RegQueryValueEx(openResult[OPENED_KEY_HANDLE], lpValueName); RegCloseKey(openResult[OPENED_KEY_HANDLE]); if (valueBytes != null) { if ((valueBytes.length == 1) && (valueBytes[0] == 0) && (valueName.equals("")) ){ return null; } else { return byteArrayToString(valueBytes); } } else { return null; } } } /** * Sets the data and type of a specified value under a registry key. * @param hKey specified windows registry folder constant * @param subKey given sub key (not null) * @param valueName given value name (not null) * @param value given value (not null) * @return ERROR_SUCCESS if succedd, or error code if fail */ public static int WinRegSetValueEx(int hKey, String subKey, String valueName, String value) { byte[] lpSubKey = stringToByteArray(subKey); int[] openResult = RegOpenKey(hKey, lpSubKey, KEY_SET_VALUE); if (openResult == null) { return -1; } if (openResult[ERROR_CODE] != ERROR_SUCCESS) { return openResult[ERROR_CODE]; } else { byte[] lpValueName = stringToByteArray(valueName); byte[] lpValue = stringToByteArray(value); int setResult = RegSetValueEx(openResult[OPENED_KEY_HANDLE], lpValueName, lpValue); RegCloseKey(openResult[OPENED_KEY_HANDLE]);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?