2

我们的一个程序在 Java 首选项中写入程序信息(窗口标题、内存等)。在 Windows 上,这在注册表下可用。如何读取 Java 程序使用 c(或 c++)编写的值。

看起来我应该使用的 API 是 RegGetValue。这能保证在 Windows XP 32 位上运行吗?

java写的String是UTF-8编码的。如何在 Windows(win32 或 vc++)中读取此类字符串

干杯,贾扬

4

3 回答 3

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 条目。

于 2010-04-17T05:17:18.663 回答
1

RegGetValue是一个较新的 API。如果您希望您的程序在 XP 32 位(实际上早于 Windows 2000)上运行,请使用RegQueryValueEx

与任何单字节 ASCII 字符串一样,UTF-8 字符串以 NUL 结尾。但是,您可能有兴趣将其转换为 UTF-16。为此,您需要使用MultiByteToWideChar,将 CodePage 设置为CP_UTF8. 从 UTF-16,您可以使用WideCharToMultiByte转换为任何其他代码页。

于 2010-04-17T05:21:25.710 回答
0

要在 C++ 中访问注册表,您可能对CRegKey ATL 类感兴趣。

于 2010-04-16T18:55:38.840 回答