首先:您应该检查RegOpenKeyEx
. 请更仔细地阅读文档。如果错误发生在运行时,则确实有必要处理它们。
第二:请查看函数RegQueryMultipleValues的文档。只需注意val_list
参数和lpValueBuf
参数都是 out 参数。我看不到您在代码中以正确的方式处理它们。
第三:我在网上找不到任何使用RegQueryMultipleValues的示例。我玩了一点,并创建了一个工作示例。
这是我做的样本。
#include <Windows.h>
#include <string>
#include <stdlib.h>
#define MY_KEY TEXT("SYSTEM\\CurrentControlSet\\services\\BITS")
int _tmain(int argc, _TCHAR* argv[])
{
HKEY hKey;
LONG lResult;
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, MY_KEY, 0, KEY_READ, &hKey);
if(lResult == ERROR_SUCCESS)
{
VALENT val_list[4];
memset(val_list, 0, sizeof(val_list));
val_list[0].ve_valuename = TEXT("ImagePath");
val_list[1].ve_valuename = TEXT("Start");
val_list[2].ve_valuename = TEXT("DisplayName");
val_list[3].ve_valuename = TEXT("FailureActions");
DWORD totalsize = 0;
RegQueryMultipleValues(hKey, val_list, sizeof(val_list)/sizeof(VALENT), NULL, &totalsize);
LPWSTR lpBuffer = (LPWSTR)malloc(totalsize);
if (lpBuffer == NULL)
{
// TODO: Error handling
}
lResult = RegQueryMultipleValues(hKey, val_list, sizeof(val_list)/sizeof(VALENT), lpBuffer, &totalsize);
if (lResult == ERROR_SUCCESS)
{
for (int i = 0; i < sizeof(val_list)/sizeof(VALENT); i++)
{
DWORD len = val_list[i].ve_valuelen;
DWORD *ptr = (DWORD *)val_list[i].ve_valueptr;
if (val_list[i].ve_type == REG_SZ || val_list[i].ve_type == REG_EXPAND_SZ)
{
printf("len:%d content:\"%S\"\n", len, ptr);
}
else if (val_list[i].ve_type == REG_DWORD)
{
printf("len:%d content:\"%08x\"\n", len, *ptr);
}
else if (val_list[i].ve_type == REG_BINARY)
{
printf("len:%d\n", len);
for (unsigned k = 0; k < len; k++) printf("%02x ", ((BYTE *)ptr)[k]);
}
else
{
// TODO: implement more
}
}
}
free(lpBuffer);
RegCloseKey(hKey);
}
else
{
// TODO: Error handling
}
return 0;
}
老实说,这个功能似乎不是访问注册表中信息的最佳选择。最好使用RegQueryValueEx 之类的函数。