Min*_*s97 3 c registry debugging winapi release
这真让我抓狂。我正在 Visual Studio 2012 上编译我的项目。我想REG_BINARY使用RegOpenKeyEx和RegQueryValueEx调用读取注册表项。在调试(多线程调试)模式下,一切正常。但是,在发布(多线程)模式下,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);
Run Code Online (Sandbox Code Playgroud)
小智 5
根据 RegQueryValueEx 的定义,lpcbData 既是In参数,也是Out参数。也就是说,RegQueryValueEx 读取它并写入它。它抱怨是因为您在传递它时没有先使用缓冲区的大小初始化它,在您的情况下是 1024(我还建议您根据 API 的要求将 TCHAR 更改为 BYTE;稍后您可以将其转换为 Unicode 字符串)。
在调用该函数之前尝试将其设置为 1024。如果再失败与ERROR_MORE_DATA,那么你的缓冲区不够大-换句话说,该注册表项字符串太长-你可以用NULL参数首先定义它包含多个字符,或者更好的是,调用函数而不是缓冲区,您将在 lpcbData 中返回所需的缓冲区大小。然后,您可以在堆上分配所需的缓冲区。希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
430 次 |
| 最近记录: |