gpt4 book ai didi

C - RegQueryValueEx 有时在发布版本中

转载 作者:行者123 更新时间:2023-12-03 23:52:56 25 4
gpt4 key购买 nike

这快把我逼疯了。我正在 Visual Studio 2012 上编译我的项目。我想使用 RegOpenKeyExRegQueryValueEx 调用来读取 REG_BINARY 注册表项。在调试(多线程调试)模式下,一切正常。但是,在发布(多线程​​)模式下,RegQueryValueEx 经常会失败并返回错误代码 ERROR_MORE_DATA。这是我正在使用的代码:

HKEY keyHandle;
TCHAR lpData[1024];

DWORD lpcbData;

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_QUERY_VALUE | KEY_WOW64_64KEY, &keyHandle) != ERROR_SUCCESS){
MessageBox(NULL, L"fail", L"title", MB_OK);
return NULL;
} else if (RegQueryValueEx(keyHandle, L"DigitalProductId", NULL, NULL, (LPBYTE)lpData, &lpcbData) != ERROR_SUCCESS){
MessageBox(NULL, L"fail!", L"title", MB_OK);
return NULL;
}

MessageBox(NULL, L"success", L"title", MB_OK);

最佳答案

根据RegQueryValueEx 的定义,lpcbData 既是In 又是Out 参数。也就是说,RegQueryValueEx 既读取它又写入它。它提示是因为您在传递它时没有先使用缓冲区的大小对其进行初始化,在您的情况下是 1024(我还建议您根据 API 的要求将 TCHAR 更改为 BYTE;您可以稍后将其转换为 Unicode 字符串)。

在调用函数之前尝试将其设置为 1024。如果 然后 失败并显示 ERROR_MORE_DATA,那么您的缓冲区不够大 - 换句话说,注册表项字符串太长 - 您可以将其定义为包含更多字符,或者更好的是,调用该函数首先使用 NULL 参数而不是缓冲区,然后您将在 lpcbData 中返回所需的缓冲区大小。然后,您可以在堆上分配所需的缓冲区。希望这会有所帮助!

关于C - RegQueryValueEx 有时在发布版本中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24566892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com