如何使用RegOpenKeyEx将值存储到字符串?

时间:2010-10-04 21:41:33

标签: c++ visual-studio-2008

我需要从注册表中获取路径。以下代码的工作原理除了我存储字符串路径的最后一部分。在Visual Studio 2008中运行调试器时,char数组具有路径,但每个其他字符都为零。这导致仅为字符串分配第一个字母。我已经尝试将char res[1024]更改为char *res = new char[1024],这只是使它存储char数组中的第一个字母而不是字符串。程序的其余部分需要路径作为字符串数据类型,因此它不能保留为char数组。我在这里缺少什么?

unsigned long type=REG_SZ, size=1024;
string path;
char res[1024];
HKEY key;

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Classes\\dsn\\shell\\open\\command"), NULL, KEY_READ, &key)==ERROR_SUCCESS){

    RegQueryValueEx(key,
    NULL,// YOUR value
    NULL,
    &type,
    (LPBYTE)res,
    &size);
    RegCloseKey(key);

    path = string(res);
}

3 个答案:

答案 0 :(得分:2)

您正在获取Unicode字符串,但将其分配给基于字符的字符串。

您可以将路径的类切换为'tstring'或'wstring',或使用RegQueryValueExA(A代码为ASCII)。

答案 1 :(得分:0)

您正在使用Unicode进行编译。转到项目设置>配置属性>常规并将“字符集”更改为“未设置”,然后重建项目。

RegOpenKey实际上是WINAPI标头中定义的宏。如果启用了Unicode,则会解析为RegOpenKeyW,否则会解析为RegOpenKeyA。如果你想继续在unicode下编译,那么你可以直接调用RetgOpenKeyA而不是使用宏。

否则,您需要处理Unicode字符串,如果需要,我们也可以帮助您。

答案 2 :(得分:0)

对于C ++,您可能更喜欢使用ATL帮助程序类CRegKey来访问注册表。存储字符串值的方法是QueryStringValue。还有其他(某种)类型安全的方法用于检索和设置不同的注册表值类型。

它不是最好的C ++接口(例如,没有std::string支持),但比原生Win32更平滑。