C++ 将DWORD写入REG_DWORD后注册表中的DWORD值无效?

C++ 将DWORD写入REG_DWORD后注册表中的DWORD值无效?,c++,C++,我很确定我的regsetvalueexa工作正常,我正在写的数据是constbyte*&setValue。我的setvalue是一个DWORD,我已经用RegOpenKeyExA将它写入了注册表,它工作得很好。 我认为问题来自RegCreateKeyExA,因为我正在从它创建我的新密钥 此外,出于某种原因,我的注册表需要我用二进制文件编写 我试着查看其他线程,但每个线程的问题似乎与我的不同,因为它们使用的是RegOpenKeyExA 我将您的函数重构为WriteWord和ReadDWORD。 请

我很确定我的regsetvalueexa工作正常,我正在写的数据是constbyte*&setValue。我的setvalue是一个DWORD,我已经用RegOpenKeyExA将它写入了注册表,它工作得很好。 我认为问题来自RegCreateKeyExA,因为我正在从它创建我的新密钥

此外,出于某种原因,我的注册表需要我用二进制文件编写

我试着查看其他线程,但每个线程的问题似乎与我的不同,因为它们使用的是RegOpenKeyExA


我将您的函数重构为WriteWord和ReadDWORD。 请注意,该代码实际上与您的代码非常相似。那我为什么要麻烦呢?有一个细微的区别,我将DWORD作为输入/输出类型,而不是您使用的字节数组

LSTATUS WriteDWORD(LPCSTR lpPath, LPCSTR lpValueName, DWORD dwData)
{
    LSTATUS status = ERROR_SUCCESS;
    HKEY hKey = NULL;
    DWORD dwDisposition = 0;
    status = RegCreateKeyExA(HKEY_CURRENT_USER, lpPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);
    if (status != ERROR_SUCCESS)
    {
        return status;
    }

    status = RegSetValueExA(hKey, lpValueName, 0, REG_DWORD, (CONST BYTE*) &dwData, sizeof(DWORD));
    RegCloseKey(hKey);
    return status;
}

LSTATUS ReadDWORD(LPCSTR lpPath, LPCSTR lpValueName, DWORD* pdwData)
{
    LSTATUS status = ERROR_SUCCESS;
    HKEY hKey = NULL;
    DWORD dwDisposition = 0;
    status = RegCreateKeyExA(HKEY_CURRENT_USER, lpPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);
    if (status != ERROR_SUCCESS)
    {
        return status;
    }

    DWORD dwType = 0;
    DWORD cbData = sizeof(DWORD);
    status = RegQueryValueExA(hKey, lpValueName, NULL, &dwType, (LPBYTE)pdwData, &cbData);
    RegCloseKey(hKey);
    return status;
}
下面是一个示例用法:

int main()
{
    char szPath[64] = "Software\\Policies\\Microsoft\\Windows\\System";
    char szValueName[32] = "DisableCMD";
    WriteDWORD(szPath, szValueName, 1234);
    DWORD dwValue = 0;
    ReadDWORD(szPath, szValueName, &dwValue); // dwValue now contains 1234
    return 0;
}
请注意,我做了几件事:

我对编写器使用DWORD dwData,但对读取器使用DWORD*pdwData。 I预初始化DWORD cbData=SizeOfWord;i、 e.4 我希望这能让你深入了解问题的二元部分。DWORD是4个字节。当您将其写入注册表时,您告诉它存储一个32位数字或4字节的DWORD。当您从注册表中读回数据时,若要在应用程序中重建数据,您应该提供一个指向DWORD的指针。因为您给它一个字节数组,所以32位数字填充了您提供的数组的前4个字节。你可能不理解,但这是正确的行为


如果使用STD::CUT,您会发现,由于重载C++类型,它对相同的4字节的反应不同。如果你用了DWORD,你就会看到你的号码了。但是,由于您的字节数组中有它,因此它将是二进制乱码。

在此询问之前,您应该检查RegSetValueExA调用的结果。它会导致错误\u SUCCESS?,我将发布完整的代码保持,但不会导致错误\u SUCCESS。当我调试代码时,RegCreateKey的返回值为5,调用RegQueryValueExA时拒绝访问,lpcbData可能已被修改,但更重要的是,在调用RegSetValueEx时,您没有将lpcbData设置为sizeofsetvalue。此外,注册表函数直接返回错误代码,它们不会通过GetLastError报告错误代码,因此您需要修改ErrorExit以将错误代码作为输入参数,然后将失败注册表函数的返回值传递给该参数。将其改为setValue有效,谢谢。我应该完全理解这些参数。谢谢你,我终于可以睡觉了。它以前工作过,因为我已经将setValue数据复制到lpData中,所以我实际上是在计算setValue。
int main()
{
    char szPath[64] = "Software\\Policies\\Microsoft\\Windows\\System";
    char szValueName[32] = "DisableCMD";
    WriteDWORD(szPath, szValueName, 1234);
    DWORD dwValue = 0;
    ReadDWORD(szPath, szValueName, &dwValue); // dwValue now contains 1234
    return 0;
}