C++ 从注册表C++;撞车

C++ 从注册表C++;撞车,c++,winapi,C++,Winapi,怎么了?当我想要获得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 re

怎么了?当我想要获得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;
}
intmain(intargc,char*argv[])
{
香港海关关卡;
if(RegOpenKey(HKEY_LOCAL_MACHINE,TEXT(“SOFTWARE\\JavaSoft\\Auto Update\\”),&key)!=ERROR\u SUCCESS)
{

cout第四个参数是一个
LPDWORD
——一个指向DWORD的指针。您获取一个正则整数并将其转换为一个指针,该指针(在取消引用时)将崩溃


该参数接收注册表值的类型。如果您不想知道该类型,请将其设置为NULL。

第四个参数是一个
LPDWORD
——一个指向DWORD的指针。您获取一个正则整数并将其强制转换为一个指针,该指针(在取消引用时)将崩溃


该参数接收注册表值的类型。如果您不想知道该类型,请将其设置为NULL。

调用时出现两个错误:

  • 类型参数已写入,因此必须是有效地址,而不是:

    (LPDWORD)REG_SZ
    
这可能是坠机的原因

  • 路径
    应该是
    路径
改为:

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.
}

对的调用有两个错误:

  • 类型参数已写入,因此必须是有效地址,而不是:

    (LPDWORD)REG_SZ
    
这可能是坠机的原因

  • 路径
    应该是
    路径
改为:

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.
}

@nneonneo注意到了。我唯一省略的是它必须是
RegQueryValueEx()的ASCII版本
。我没有投反对票,但我只是在看MSDN文档,显然您应该检查是否有错误\u更多\u数据,因为您的缓冲区最初可能也会被删除small@0A0D,我的示例代码说明用户必须检查返回值。OP应该阅读文档并处理它。@nneonneo,注意到了。我唯一拥有的是omi它必须是
RegQueryValueEx()的ASCII版本
。我没有投反对票,但我只是在看MSDN文档,显然您应该检查是否有错误\u更多\u数据,因为您的缓冲区最初可能也会被删除small@0A0D,我的示例代码说明用户必须检查返回值。OP应该阅读文档并处理它。@user1857483如果这是答案,您应该接受它。单击此答案旁边的绿色复选框。@user1857483如果这是答案,您应该接受它。单击此答案旁边的绿色复选框。