
Some Object

Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007
Репутация: 4 Всего: 4
|
Мультиплатформенную автозагрузку, ты сделать не сможешь. не везде же есть реестр в таком виде как у МС. во вторых для обращения к реестру нужно использовать нэйтивные методы, что уже говорит о не независимости программы от ОС. Добавлено @ 10:58Вот тебе пример обращения к реестру. в коде изменишь на нужный раздел и все. Это для длл ки Код | #include "Win32RegKey.h" #include "Win32RegKeyNameEnumeration.h" #include <string.h> #include <stdlib.h> #include <windows.h>
JNIEXPORT jobject JNICALL Java_Win32RegKey_getValue(JNIEnv* env, jobject this_obj, jobject name) { const char* cname; jstring path; const char* cpath; HKEY hkey; DWORD type; DWORD size; jclass this_class; jfieldID id_root; jfieldID id_path; HKEY root; jobject ret; char* cret;
/* get the class */ this_class = (*env)->GetObjectClass(env, this_obj);
/* get the field IDs */ id_root = (*env)->GetFieldID(env, this_class, "root", "I"); id_path = (*env)->GetFieldID(env, this_class, "path", "Ljava/lang/String;");
/* get the fields */ root = (HKEY) (*env)->GetIntField(env, this_obj, id_root); path = (jstring)(*env)->GetObjectField(env, this_obj, id_path); cpath = (*env)->GetStringUTFChars(env, path, NULL);
/* open the registry key */ if (RegOpenKeyEx(root, cpath, 0, KEY_READ, &hkey) != ERROR_SUCCESS) { (*env)->ThrowNew(env, (*env)->FindClass(env, "Win32RegKeyException"), "Open key failed"); (*env)->ReleaseStringUTFChars(env, path, cpath); return NULL; }
(*env)->ReleaseStringUTFChars(env, path, cpath); cname = (*env)->GetStringUTFChars(env, name, NULL);
/* find the type and size of the value */ if (RegQueryValueEx(hkey, cname, NULL, &type, NULL, &size) != ERROR_SUCCESS) { (*env)->ThrowNew(env, (*env)->FindClass(env, "Win32RegKeyException"), "Query value key failed"); RegCloseKey(hkey); (*env)->ReleaseStringUTFChars(env, name, cname); return NULL; }
/* get memory to hold the value */ cret = (char*)malloc(size);
/* read the value */ if (RegQueryValueEx(hkey, cname, NULL, &type, cret, &size) != ERROR_SUCCESS) { (*env)->ThrowNew(env, (*env)->FindClass(env, "Win32RegKeyException"), "Query value key failed"); free(cret); RegCloseKey(hkey); (*env)->ReleaseStringUTFChars(env, name, cname); return NULL; }
/* depending on the type, store the value in a string, integer or byte array */ if (type == REG_SZ) { ret = (*env)->NewStringUTF(env, cret); } else if (type == REG_DWORD) { jclass class_Integer = (*env)->FindClass(env, "java/lang/Integer"); /* get the method ID of the constructor */ jmethodID id_Integer = (*env)->GetMethodID(env, class_Integer, "<init>", "(I)V"); int value = *(int*) cret; /* invoke the constructor */ ret = (*env)->NewObject(env, class_Integer, id_Integer, value); } else if (type == REG_BINARY) { ret = (*env)->NewByteArray(env, size); (*env)->SetByteArrayRegion(env, (jarray) ret, 0, size, cret); } else { (*env)->ThrowNew(env, (*env)->FindClass(env, "Win32RegKeyException"), "Unsupported value type"); ret = NULL; }
free(cret); RegCloseKey(hkey); (*env)->ReleaseStringUTFChars(env, name, cname);
return ret; }
JNIEXPORT void JNICALL Java_Win32RegKey_setValue(JNIEnv* env, jobject this_obj, jstring name, jobject value) { const char* cname; jstring path; const char* cpath; HKEY hkey; DWORD type; DWORD size; jclass this_class; jclass class_value; jclass class_Integer; jfieldID id_root; jfieldID id_path; HKEY root; const char* cvalue; int ivalue;
/* get the class */ this_class = (*env)->GetObjectClass(env, this_obj);
/* get the field IDs */ id_root = (*env)->GetFieldID(env, this_class, "root", "I"); id_path = (*env)->GetFieldID(env, this_class, "path", "Ljava/lang/String;");
/* get the fields */ root = (HKEY)(*env)->GetIntField(env, this_obj, id_root); path = (jstring)(*env)->GetObjectField(env, this_obj, id_path); cpath = (*env)->GetStringUTFChars(env, path, NULL);
/* open the registry key */ if (RegOpenKeyEx(root, cpath, 0, KEY_WRITE, &hkey) != ERROR_SUCCESS) { (*env)->ThrowNew(env, (*env)->FindClass(env, "Win32RegKeyException"), "Open key failed"); (*env)->ReleaseStringUTFChars(env, path, cpath); return; }
(*env)->ReleaseStringUTFChars(env, path, cpath); cname = (*env)->GetStringUTFChars(env, name, NULL);
class_value = (*env)->GetObjectClass(env, value); class_Integer = (*env)->FindClass(env, "java/lang/Integer"); /* determine the type of the value object */ if ((*env)->IsAssignableFrom(env, class_value, (*env)->FindClass(env, "java/lang/String"))) { /* it is a string--get a pointer to the characters */ cvalue = (*env)->GetStringUTFChars(env, (jstring) value, NULL); type = REG_SZ; size = (*env)->GetStringLength(env, (jstring) value) + 1; } else if ((*env)->IsAssignableFrom(env, class_value, class_Integer)) { /* it is an integer--call intValue to get the value */ jmethodID id_intValue = (*env)->GetMethodID(env, class_Integer, "intValue", "()I"); ivalue = (*env)->CallIntMethod(env, value, id_intValue); type = REG_DWORD; cvalue = (char*)&ivalue; size = 4; } else if ((*env)->IsAssignableFrom(env, class_value, (*env)->FindClass(env, "[B"))) { /* it is a byte array--get a pointer to the bytes */ type = REG_BINARY; cvalue = (char*)(*env)->GetByteArrayElements(env, (jarray) value, NULL); size = (*env)->GetArrayLength(env, (jarray) value); } else { /* we don't know how to handle this type */ (*env)->ThrowNew(env, (*env)->FindClass(env, "Win32RegKeyException"), "Unsupported value type"); RegCloseKey(hkey); (*env)->ReleaseStringUTFChars(env, name, cname); return; }
/* set the value */ if (RegSetValueEx(hkey, cname, 0, type, cvalue, size) != ERROR_SUCCESS) { (*env)->ThrowNew(env, (*env)->FindClass(env, "Win32RegKeyException"), "Set value failed"); }
RegCloseKey(hkey); (*env)->ReleaseStringUTFChars(env, name, cname);
/* if the value was a string or byte array, release the pointer */ if (type == REG_SZ) { (*env)->ReleaseStringUTFChars(env, (jstring) value, cvalue); } else if (type == REG_BINARY) { (*env)->ReleaseByteArrayElements(env, (jarray) value, (jbyte*) cvalue, 0); } }
/* helper function to start enumeration of names */ static int startNameEnumeration(JNIEnv* env, jobject this_obj, jclass this_class) { jfieldID id_index; jfieldID id_count; jfieldID id_root; jfieldID id_path; jfieldID id_hkey; jfieldID id_maxsize;
HKEY root; jstring path; const char* cpath; HKEY hkey; DWORD maxsize = 0; DWORD count = 0;
/* get the field IDs */ id_root = (*env)->GetFieldID(env, this_class, "root", "I"); id_path = (*env)->GetFieldID(env, this_class, "path", "Ljava/lang/String;"); id_hkey = (*env)->GetFieldID(env, this_class, "hkey", "I"); id_maxsize = (*env)->GetFieldID(env, this_class, "maxsize", "I"); id_index = (*env)->GetFieldID(env, this_class, "index", "I"); id_count = (*env)->GetFieldID(env, this_class, "count", "I");
/* get the field values */ root = (HKEY)(*env)->GetIntField(env, this_obj, id_root); path = (jstring)(*env)->GetObjectField(env, this_obj, id_path); cpath = (*env)->GetStringUTFChars(env, path, NULL);
/* open the registry key */ if (RegOpenKeyEx(root, cpath, 0, KEY_READ, &hkey) != ERROR_SUCCESS) { (*env)->ThrowNew(env, (*env)->FindClass(env, "Win32RegKeyException"), "Open key failed"); (*env)->ReleaseStringUTFChars(env, path, cpath); return -1; } (*env)->ReleaseStringUTFChars(env, path, cpath);
/* query count and max length of names */ if (RegQueryInfoKey(hkey, NULL, NULL, NULL, NULL, NULL, NULL, &count, &maxsize, NULL, NULL, NULL) != ERROR_SUCCESS) { (*env)->ThrowNew(env, (*env)->FindClass(env, "Win32RegKeyException"), "Query info key failed"); RegCloseKey(hkey); return -1; }
/* set the field values */ (*env)->SetIntField(env, this_obj, id_hkey, (DWORD) hkey); (*env)->SetIntField(env, this_obj, id_maxsize, maxsize + 1); (*env)->SetIntField(env, this_obj, id_index, 0); (*env)->SetIntField(env, this_obj, id_count, count); return count; }
JNIEXPORT jboolean JNICALL Java_Win32RegKeyNameEnumeration_hasMoreElements(JNIEnv* env, jobject this_obj) { jclass this_class; jfieldID id_index; jfieldID id_count; int index; int count; /* get the class */ this_class = (*env)->GetObjectClass(env, this_obj);
/* get the field IDs */ id_index = (*env)->GetFieldID(env, this_class, "index", "I"); id_count = (*env)->GetFieldID(env, this_class, "count", "I");
index = (*env)->GetIntField(env, this_obj, id_index); if (index == -1) /* first time */ { count = startNameEnumeration(env, this_obj, this_class); index = 0; } else count = (*env)->GetIntField(env, this_obj, id_count); return index < count; }
JNIEXPORT jobject JNICALL Java_Win32RegKeyNameEnumeration_nextElement(JNIEnv* env, jobject this_obj) { jclass this_class; jfieldID id_index; jfieldID id_hkey; jfieldID id_count; jfieldID id_maxsize;
HKEY hkey; int index; int count; DWORD maxsize;
char* cret; jstring ret;
/* get the class */ this_class = (*env)->GetObjectClass(env, this_obj);
/* get the field IDs */ id_index = (*env)->GetFieldID(env, this_class, "index", "I"); id_count = (*env)->GetFieldID(env, this_class, "count", "I"); id_hkey = (*env)->GetFieldID(env, this_class, "hkey", "I"); id_maxsize = (*env)->GetFieldID(env, this_class, "maxsize", "I");
index = (*env)->GetIntField(env, this_obj, id_index); if (index == -1) /* first time */ { count = startNameEnumeration(env, this_obj, this_class); index = 0; } else count = (*env)->GetIntField(env, this_obj, id_count);
if (index >= count) /* already at end */ { (*env)->ThrowNew(env, (*env)->FindClass(env, "java/util/NoSuchElementException"), "past end of enumeration"); return NULL; }
maxsize = (*env)->GetIntField(env, this_obj, id_maxsize); hkey = (HKEY)(*env)->GetIntField(env, this_obj, id_hkey); cret = (char*)malloc(maxsize);
/* find the next name */ if (RegEnumValue(hkey, index, cret, &maxsize, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) { (*env)->ThrowNew(env, (*env)->FindClass(env, "Win32RegKeyException"), "Enum value failed"); free(cret); RegCloseKey(hkey); (*env)->SetIntField(env, this_obj, id_index, count); return NULL; }
ret = (*env)->NewStringUTF(env, cret); free(cret);
/* increment index */ index++; (*env)->SetIntField(env, this_obj, id_index, index);
if (index == count) /* at end */ { RegCloseKey(hkey); }
return ret; }
|
Это класс для работы с реестром Код | import java.util.*;
/** A Win32RegKey object can be used to get and set values of a registry key in the Windows registry. */ public class Win32RegKey { /** Construct a registry key object. @param theRoot one of HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_CONFIG, HKEY_DYN_DATA @param thePath the registry key path */ public Win32RegKey(int theRoot, String thePath) { root = theRoot; path = thePath; }
/** Enumerates all names of registry entries under the path that this object describes. @return an enumeration listing all entry names */ public Enumeration<String> names() { return new Win32RegKeyNameEnumeration(root, path); }
/** Gets the value of a registry entry. @param name the entry name @return the associated value */ public native Object getValue(String name);
/** Sets the value of a registry entry. @param name the entry name @param value the new value */ public native void setValue(String name, Object value);
public static final int HKEY_CLASSES_ROOT = 0x80000000; public static final int HKEY_CURRENT_USER = 0x80000001; public static final int HKEY_LOCAL_MACHINE = 0x80000002; public static final int HKEY_USERS = 0x80000003; public static final int HKEY_CURRENT_CONFIG = 0x80000005; public static final int HKEY_DYN_DATA = 0x80000006;
private int root; private String path;
static { System.loadLibrary("Win32RegKey"); } }
class Win32RegKeyNameEnumeration implements Enumeration<String> { Win32RegKeyNameEnumeration(int theRoot, String thePath) { root = theRoot; path = thePath; }
public native String nextElement(); public native boolean hasMoreElements();
private int root; private String path; private int index = -1; private int hkey = 0; private int maxsize; private int count; }
class Win32RegKeyException extends RuntimeException { public Win32RegKeyException() {} public Win32RegKeyException(String why) { super(why); } }
|
А это пример юзания Код | import java.util.*;
public class Win32RegKeyTest { public static void main(String[] args) { Win32RegKey key = new Win32RegKey( Win32RegKey.HKEY_LOCAL_MACHINE, "SOFTWARE\\JavaSoft\\Java Development Kit\\1.6");
key.setValue("default user", "user"); key.setValue("number", new Integer(13)); key.setValue("small primes", new byte[] { 2, 3, 5, 7, 11 });
Enumeration<String> e = key.names();
while (e.hasMoreElements()) { String name = e.nextElement(); System.out.print(name + "=");
Object value = key.getValue(name);
if (value instanceof byte[]) for (byte b : (byte[]) value) System.out.print((b & 0xFF) + " "); else System.out.print(value);
System.out.println(); } } }
|
Это сообщение отредактировал(а) duk - 22.8.2008, 11:19
|