2010-04-16 4 views
2

Одна из наших программ записывает информацию о программе (название окна, память и т. Д.) В настройках Java. В окнах это доступно в реестре. Как я могу прочитать значения, написанные программой Java, с помощью c (или C++).win32 read java preference from C++ code

Похоже, что API должен использовать RegGetValue. Гарантируется ли работа на 32-битной Windows XP?

Строка, написанная java, кодируется в кодировке UTF-8. Как я прочитал такие строки в окнах (win32 или VC++)

Приветствия, Джаян

ответ

2

Я впился в это немного. RegGetValue() - это новый вызов реестра, который заботится о некоторой скрытой гадости традиционного способа запроса реестра (RegQueryValueEx). Здесь есть некоторая хорошая информация о различии: http://blogs.msdn.com/larryosterman/archive/2006/01/12/512115.aspx

Если вам нужна обратная совместимость, RegGetValue() не будет работать, поэтому вы должны использовать RegQueryValueEx для чтения данных из реестра.

А теперь к тому, что я думаю, что это реальный вопрос:

  1. Что вы получите обратно, когда вы используете RegQueryValueEx()?
  2. Как вы знаете, что значения, хранящиеся в реестре, находятся в кодировке utf-8? Сохраняется ли он как массив байтов в реестре или как REG_SZ?
  3. Вы посмотрели на значение с помощью regedit? Что ты видишь?

Так что, если вопрос заключается в том, как преобразовать закодированную строку UTF-8 в строку с завершающим символом ascii, то вам, вероятно, следует изменить заголовок вашего вопроса. Для справки, я нашел эту библиотеку, которая может быть полезно:

http://utfcpp.sourceforge.net

Когда я попытался ссылка несколько минут назад, сервер таймаута - возможно обслуживание SF происходит.

Но я бы предположил, что вы действительно уверены, что значения в реестре не сохраняются как записи REG_SZ.

+0

Что заставляет вас думать, что RegGetValue работает в Windows XP? Вы сами это испытали? На каком пакете обновления? В документации MSDN указано, что требуется Vista или XP SP1. –

+0

достаточно справедливо - я думал, что OP должен был написать RegQueryValue() - я обновил свой пост соответственно. –

0

Для доступа к реестру в C++, вы можете быть заинтересованы в CRegKey ATL class.

1

RegGetValue - это новейший API. Если вы хотите, чтобы ваша программа работала на XP 32-разрядной (фактически, до Windows 2000), используйте RegQueryValueEx

Строка UTF-8 имеет NUL-конец, как и любая однобайтная строка ASCII. Однако вам может быть интересно преобразовать его в UTF-16. Для этого вы хотите использовать MultiByteToWideChar, установив CodePage на CP_UTF8. Из UTF-16 вы можете конвертировать любую другую кодовую страницу с помощью WideCharToMultiByte.