C++ lpData在RegQueryValueEx之后未获取值

C++ lpData在RegQueryValueEx之后未获取值,c++,registry,C++,Registry,我不确定问题出在哪里。 我有从注册表获取值的演示代码: using namespace std; typedef struct REGKEYS { HKEY hKey; LPCTSTR subKey; LPCTSTR value; LPCTSTR name; LPCTSTR file; LPCTSTR tag; } REGKEYS; REGKEYS regkeys = {HKEY_LOCAL_MACHINE,"Software\\Interne

我不确定问题出在哪里。 我有从注册表获取值的演示代码:

using namespace std;

typedef struct REGKEYS
{
    HKEY hKey;
    LPCTSTR subKey;
    LPCTSTR value;
    LPCTSTR name;
    LPCTSTR file;
    LPCTSTR tag;
} REGKEYS;

REGKEYS regkeys = {HKEY_LOCAL_MACHINE,"Software\\Internet Download Manager", "Serial", "IDM", NULL, NULL};
HKEY hKey;
LPBYTE szDataBuf;
DWORD dwSize;

int _tmain(int argc, _TCHAR* argv[])
{
    RegOpenKeyEx(regkeys.hKey, regkeys.subKey, 0, KEY_READ, &hKey);
    RegQueryValueEx(hKey, regkeys.value, NULL, NULL, szDataBuf, &dwSize);
    int lerr = GetLastError();

    system("pause");
    return 0;
}
调试时,我看到regkeys.hKey没有指向任何东西(它需要指向“hKey\u LOCAL\u MACHINE”,是吗?)。 而szDataBuf是空的。 (GetLastError()不帮助我-它返回0)

有人告诉我问题出在哪里以及如何解决吗

EDIT2:

我将代码编辑为:

int _tmain(int argc, _TCHAR* argv[])
{
    DWORD dwSize = 0;
    RegOpenKeyEx(regkeys.hKey, regkeys.subKey, 0, KEY_READ, &hKey);

    RegQueryValueEx(hKey, regkeys.value, NULL, NULL, NULL, &dwSize);
    char *szDataBuf = new char(dwSize);
    RegQueryValueEx(hKey, regkeys.value, NULL, NULL, (LPBYTE)szDataBuf, &dwSize);

    delete[] szDataBuf;
    system("pause");
    return 0;
}

我调试并看到szDataBuf得到正确的值,但我的程序中断并得到警告:警告C4244:“正在初始化”:从“DWORD”转换为“char”,可能会丢失数据。

首先,您的错误检查代码不正确。注册表函数都返回Win32错误代码。您需要注意它们并检查错误

需要说明的是,
GetLastError
没有用,因为这些函数不调用
SetLastError
。它们直接返回错误代码。你必须仔细阅读文档。Win32的不同部分处理错误的方式通常存在细微的差异

您更新的问题中的代码更好,但它仍然无法检查调用
RegOpenKeyEx
时的错误

现在,除此之外,您实际上没有正确调用
RegQueryValueEx
。您尚未初始化
dwSize
,也未分配
szDataBuf
。因为这些是全局变量,所以它们将被初始化为零。因此,如果值存在,那么对
RegQueryValueEx
的调用将确实成功。但是您不能期望任何值到达缓冲区,因为您没有分配缓冲区。您正在将
NULL
传递给
lpData
参数

因此,分配一个缓冲区。例如:

char szDataBuf[128];
初始化
dwSize

DWORD dwSize = sizeof(szDataBuf);
那么您对
RegQueryValueEx
的调用应该是

int lerr = RegQueryValueEx(hKey, regkeys.value, NULL, NULL, 
    (LPBYTE)szDataBuf, &dwSize);
尽管您可能希望动态分配缓冲区:

dwSize = 0;
int lerr = RegQueryValueEx(hKey, regkeys.value, NULL, NULL, NULL, &dwSize);
// check lerr here
vector<char> szDataBuf(dwSize);
int lerr = RegQueryValueEx(hKey, regkeys.value, NULL, NULL, 
    (LPBYTE)&szDataBuf[0], &dwSize);
// check lerr here
dwSize=0;
int-lerr=regqueryvaluex(hKey、regkeys.value、NULL、NULL、NULL和dwSize);
//在这里查一下lerr
矢量szDataBuf(dwSize);
int-lerr=regqueryvaluex(hKey,regkeys.value,NULL,NULL,
(LPBYTE)&szDataBuf[0]、&dwSize);
//在这里查一下lerr

您也可以考虑避免使用全局变量。作为局部变量,您使用的所有变量都更有意义。

首先,您的错误检查代码不正确。注册表函数都返回Win32错误代码。您需要注意它们并检查错误

需要说明的是,
GetLastError
没有用,因为这些函数不调用
SetLastError
。它们直接返回错误代码。你必须仔细阅读文档。Win32的不同部分处理错误的方式通常存在细微的差异

您更新的问题中的代码更好,但它仍然无法检查调用
RegOpenKeyEx
时的错误

现在,除此之外,您实际上没有正确调用
RegQueryValueEx
。您尚未初始化
dwSize
,也未分配
szDataBuf
。因为这些是全局变量,所以它们将被初始化为零。因此,如果值存在,那么对
RegQueryValueEx
的调用将确实成功。但是您不能期望任何值到达缓冲区,因为您没有分配缓冲区。您正在将
NULL
传递给
lpData
参数

因此,分配一个缓冲区。例如:

char szDataBuf[128];
初始化
dwSize

DWORD dwSize = sizeof(szDataBuf);
那么您对
RegQueryValueEx
的调用应该是

int lerr = RegQueryValueEx(hKey, regkeys.value, NULL, NULL, 
    (LPBYTE)szDataBuf, &dwSize);
尽管您可能希望动态分配缓冲区:

dwSize = 0;
int lerr = RegQueryValueEx(hKey, regkeys.value, NULL, NULL, NULL, &dwSize);
// check lerr here
vector<char> szDataBuf(dwSize);
int lerr = RegQueryValueEx(hKey, regkeys.value, NULL, NULL, 
    (LPBYTE)&szDataBuf[0], &dwSize);
// check lerr here
dwSize=0;
int-lerr=regqueryvaluex(hKey、regkeys.value、NULL、NULL、NULL和dwSize);
//在这里查一下lerr
矢量szDataBuf(dwSize);
int-lerr=regqueryvaluex(hKey,regkeys.value,NULL,NULL,
(LPBYTE)&szDataBuf[0]、&dwSize);
//在这里查一下lerr

您也可以考虑避免使用全局变量。作为局部变量,您使用的所有变量都更有意义。

首先,您的错误检查代码不正确。注册表函数都返回Win32错误代码。您需要注意它们并检查错误

需要说明的是,
GetLastError
没有用,因为这些函数不调用
SetLastError
。它们直接返回错误代码。你必须仔细阅读文档。Win32的不同部分处理错误的方式通常存在细微的差异

您更新的问题中的代码更好,但它仍然无法检查调用
RegOpenKeyEx
时的错误

现在,除此之外,您实际上没有正确调用
RegQueryValueEx
。您尚未初始化
dwSize
,也未分配
szDataBuf
。因为这些是全局变量,所以它们将被初始化为零。因此,如果值存在,那么对
RegQueryValueEx
的调用将确实成功。但是您不能期望任何值到达缓冲区,因为您没有分配缓冲区。您正在将
NULL
传递给
lpData
参数

因此,分配一个缓冲区。例如:

char szDataBuf[128];
初始化
dwSize

DWORD dwSize = sizeof(szDataBuf);
那么您对
RegQueryValueEx
的调用应该是

int lerr = RegQueryValueEx(hKey, regkeys.value, NULL, NULL, 
    (LPBYTE)szDataBuf, &dwSize);
尽管您可能希望动态分配缓冲区:

dwSize = 0;
int lerr = RegQueryValueEx(hKey, regkeys.value, NULL, NULL, NULL, &dwSize);
// check lerr here
vector<char> szDataBuf(dwSize);
int lerr = RegQueryValueEx(hKey, regkeys.value, NULL, NULL, 
    (LPBYTE)&szDataBuf[0], &dwSize);
// check lerr here
dwSize=0;
int-lerr=regqueryvaluex(hKey、regkeys.value、NULL、NULL、NULL和dwSize);
//在这里查一下lerr
矢量szDataBuf(dwSize);
int-lerr=regqueryvaluex(hKey,regkeys.value,NULL,NULL,
(LPBYTE)&szDataBuf[0]、&dwSize);
//在这里查一下lerr

您也可以考虑避免使用全局变量。作为局部变量,您使用的所有变量都更有意义。

首先,您的错误检查代码不正确。注册表函数都返回Win32错误代码。您需要注意它们并检查错误

需要说明的是,
GetLastError
没有用,因为这些函数不调用