JNIEXPORT jstring JNICALL Java_net_rubygrapefruit_platform_internal_jni_WindowsRegistryFunctions_getStringValue(JNIEnv *env, jclass target, jint keyNum, jstring subkey, jstring valueName, jobject result) { HKEY key = get_key_from_ordinal(keyNum); wchar_t* subkeyStr = java_to_wchar(env, subkey, result); wchar_t* valueNameStr = java_to_wchar(env, valueName, result); DWORD size = 0; LONG retval = SHRegGetValueW(key, subkeyStr, valueNameStr, SRRF_RT_REG_SZ, NULL, NULL, &size); if (retval != ERROR_SUCCESS) { free(subkeyStr); free(valueNameStr); if (retval != ERROR_FILE_NOT_FOUND) { mark_failed_with_code(env, "could not determine size of registry value", retval, NULL, result); } return NULL; } wchar_t* value = (wchar_t*)malloc(sizeof(wchar_t) * (size+1)); retval = SHRegGetValueW(key, subkeyStr, valueNameStr, SRRF_RT_REG_SZ, NULL, value, &size); free(subkeyStr); free(valueNameStr); if (retval != ERROR_SUCCESS) { free(value); mark_failed_with_code(env, "could not get registry value", retval, NULL, result); return NULL; } jstring jvalue = wchar_to_java(env, value, wcslen(value), result); free(value); return jvalue; }
static void init_logging() { InitializeCriticalSection(&debug_file_section); WCHAR path[MAX_PATH]; DWORD path_size = MAX_PATH; DWORD err; if ((err = SHRegGetValueW(HKEY_LOCAL_MACHINE, L"Software\\Google\\WebP Codec", L"DebugPath", SRRF_RT_REG_SZ, NULL, path, &path_size)) != ERROR_SUCCESS) { StringCchCopyW(path, MAX_PATH, L"C:\\DebugOut"); } WCHAR filename[MAX_PATH]; time_t timestamp; time(×tamp); StringCchPrintfW(filename, MAX_PATH, L"%s\\webp-codec-debug-%010Ld-%08x.txt", path, (LONGLONG)timestamp, GetCurrentProcessId()); debug_file = _wfopen(filename, L"w"); }