Index: WindowsRegistry.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/WindowsRegistry.java,v retrieving revision 1.2 diff -u -r1.2 WindowsRegistry.java --- WindowsRegistry.java 3 Apr 2006 14:12:03 -0000 1.2 +++ WindowsRegistry.java 7 Apr 2006 02:21:35 -0000 @@ -44,4 +44,15 @@ */ public native String getLocalMachineValue(String subkey, String name); + /** + * Given a subkey of HKEY_LOCAL_MACHINE, and an index (starting from 0) + * to the key's array of values, return the name of the indexed value. + * The return value is null on any error or when the index is invalid. + * The value name can be used in the above getLocalMachineValue() to retrieve + * the value data. + * @param subkey subkey of HKEY_LOCAL_MACHINE + * @param index index to the subkey's array of values, starting from 0. + * @return name of registry value or null if not found + */ + public native String getLocalMachineValueName(String subkey, int index); } Index: winreg.cpp =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core.win32/library/winreg.cpp,v retrieving revision 1.2 diff -u -r1.2 winreg.cpp --- winreg.cpp 3 Apr 2006 14:12:04 -0000 1.2 +++ winreg.cpp 7 Apr 2006 02:45:01 -0000 @@ -28,3 +28,43 @@ return result; } + +/* + * Given a subkey (string) under HKEY_LOCAL_MACHINE, and an index (starting from 0) + * to the key's array of values, return the name of the indexed value. + * The return value is null on any error or when the index is invalid. + */ + +extern "C" +JNIEXPORT jstring Java_org_eclipse_cdt_utils_WindowsRegistry_getLocalMachineValueName( + JNIEnv * env, jobject obj, jstring subkey, jint index) +{ + const jchar * csubkey = env->GetStringChars(subkey, NULL); + jstring result = NULL; + + HKEY key; + LONG rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (const wchar_t *)csubkey, 0, KEY_READ, &key); + if (rc != ERROR_SUCCESS) + return NULL; + + wchar_t valueName[256]; + DWORD nameSize = sizeof(valueName) + 2; + + rc = RegEnumValue(key, index, + valueName, // UNICODE string + &nameSize, + NULL, NULL, + NULL, // data string + NULL); // size in BYTE of data. + + if (rc == ERROR_SUCCESS) + { + result = env->NewString((jchar *)valueName, nameSize); + } + + RegCloseKey(key); + + env->ReleaseStringChars(subkey, csubkey); + + return result; +}