1

怎么了?当我想获得 AUVersion 的值时它会崩溃。该键存在于注册表中,但我无法获取。

int main(int argc, char *argv[])
{
    HKEY key;
    if (RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\JavaSoft\\Auto Update\\"), &key) != ERROR_SUCCESS)
    {
        cout << "Unable to open registry key\n\n";
    }

    char path[1024];
    DWORD value_length = 1024;
//here is the crash
    RegQueryValueEx(key, "AUVersion", NULL, (LPDWORD)REG_SZ, (LPBYTE)&path, &value_length);
    cout << "the value read from the registry is: " << path << endl;


    system("pause");
    return 0;
}
4

2 回答 2

4

第四个参数是一个LPDWORD-- 一个指向 DWORD 的指针。您获取了一个常规整数并将其转换为一个指针,该指针(取消引用时)会崩溃。

该参数接收注册表值的类型。如果您对了解类型不感兴趣,请将其设置为 NULL。

于 2013-03-25T18:25:30.563 回答
4

调用有两个错误RegQueryValueEx()

  • 写入的类型参数必须是有效地址,这不是:

    (LPDWORD)REG_SZ
    

这就是坠机的可能原因。

  • &path应该path

改成:

DWORD type;
RegQueryValueEx(key, "AUVersion", NULL, &type, (LPBYTE) path, &value_length);

您必须检查结果RegQueryValueEx()以确保path已填充并且后续代码未处理未初始化的变量:

const DWORD result = RegQueryValueEx(key,
                                     "AUVersion",
                                     NULL,
                                     &type,
                                     (LPBYTE) path,
                                     &value_length);

// Check status of the query and ensure it was a string
// that was read.
if (ERROR_SUCCESS == result && REG_SZ == type)
{
    // Success.
}
于 2013-03-25T18:26:25.480 回答