2

我正在处理代码,我必须在特定的注册表路径下获取数据。为此,我使用函数打开键和子键 RegOpenKeyEx (HKEY_LOCAL_MACHINE, sk, NULL, KEY_READ, &hKey); ,在调试时为我提供了我需要访问的路径的未使用值句柄。这里出了什么问题?谁能告诉我?

void GetAlgorithmList()
{
    HKEY hKey=0;

    LPCTSTR sk = TEXT("SOFTWARE\\ALGORITHM");


    LONG openRes=RegOpenKeyEx (HKEY_LOCAL_MACHINE,sk,NULL,KEY_READ   ,&hKey);

    long lret;
    PVALENT val_list=0;

    unsigned long totalsize = 1000;
    lret = 0;

    LPWSTR szValueBuf=NULL;

    lret = RegQueryMultipleValues(hKey,val_list,totalsize,szValueBuf,&totalsize);
    if (lret == ERROR_SUCCESS)
    {
        printf("Success 1");
    }
     FILE* pFile = fopen("D:\\HinalH\\logFile.txt", "a+");
    fopen("D:\\logFile.txt", "a+");
    fprintf(pFile, "%d\n",szValueBuf);
    fclose(pFile);

    RegCloseKey(hKey);

}

提前致谢

4

1 回答 1

2

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

于 2012-11-12T06:46:11.100 回答