首先:您应该检查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 之类的函数。