2

我正在尝试在 C++ 中以编程方式将 DWORD 值写入注册表。

我做了一些搜索,发现以前有人问过这个问题。我试图遵循他们的解决方案,但提出了一个非常令人沮丧的问题,据我所知,他们的解决方案尚未解决。

这是我的代码:

HKEY hKey;
LPCWSTR sKeyPath;
int iResult;

sKeyPath = L"Software\\ABI\\";
iResult = RegOpenKeyEx(HKEY_CURRENT_USER, sKeyPath, NULL, KEY_ALL_ACCESS, &hKey);
DWORD value = 0x00000003;
iResult = RegSetValueEx(hKey, L"Test", NULL, REG_DWORD, (const BYTE*)value, sizeof(value));
RegCloseKey(hKey);

我做了一些基本的调试,发现iResult调用后的值为998 RegSetValueEx。我确信这个键存在于 Windows 注册表中,因为我使用 regedit.exe 手动创建了它以进行测试。DWORD "Test" 的值最初是 0x00000009,并且在我运行我的程序后没有改变。

我不确定我错在哪里。

任何帮助,将不胜感激。

PS 对于错误 998,我没有设法在网上找到任何有用的站点。我发现的唯一参考资料提到这是处理注册表时可能遇到的最严重错误。

PPS 顺便说一句,我在 Windows 8 上运行这个程序。我不认为这会改变任何东西,但我之前在 Windows 8 上遇到过一些奇怪的安全问题。

4

1 回答 1

12

您需要传递的地址value

iResult = RegSetValueEx(hKey,
                        L"Test",
                        NULL,
                        REG_DWORD,
                        (const BYTE*)&value, // Change made here.
                        sizeof(value));

错误代码的998意思是:

对内存位置的无效访问。

value未传递的地址时,其实际值 ( 3) 被用作内存地址,从而导致失败。

于 2012-11-06T09:16:31.020 回答