将RegQueryValueEx值写入WriteFile失败的文件

时间:2016-05-27 16:14:32

标签: c++ windows visual-studio-2015 writefile

我正在编辑一个小程序,从注册表中获取一些信息,将其打印到控制台,然后将其写入文件。

我可以正确地使用_tprintf打印到控制台。

我创建了一个句柄“myfile”到一个新文件,写入“缓冲​​区”到文件不成功“部分数据写入”我不知道为什么,我认为它与“BYTE * buffer = new”有关BYTE [cbMaxValueData];“,但我不知道如何解决它。

void QueryKey(HKEY hkey)
{
TCHAR    achKey[MAX_KEY_LENGTH];   // buffer for subkey name
DWORD    cbName;                   // size of name string 
TCHAR    achClass[MAX_PATH] = TEXT("");  // buffer for class name 
DWORD    cchClassName = MAX_PATH;  // size of class string 
DWORD    cSubKeys = 0;               // number of subkeys 
DWORD    cbMaxSubKey;              // longest subkey size 
DWORD    cchMaxClass;              // longest class string 
DWORD    cValues;              // number of values for key 
DWORD    cchMaxValue;          // longest value name 
DWORD    cbMaxValueData;       // longest value data 
DWORD    cbSecurityDescriptor; // size of security descriptor 
FILETIME ftLastWriteTime;      // last write time 

DWORD i, retCode;

TCHAR  achValue[MAX_VALUE_NAME];

// Get the class name and the value count. 
retCode = RegQueryInfoKey(
    hkey,                    // key handle 
    achClass,                // buffer for class name 
    &cchClassName,           // size of class string 
    NULL,                    // reserved 
    &cSubKeys,               // number of subkeys 
    &cbMaxSubKey,            // longest subkey size 
    &cchMaxClass,            // longest class string 
    &cValues,                // number of values for this key 
    &cchMaxValue,            // longest value name 
    &cbMaxValueData,         // longest value data 
    &cbSecurityDescriptor,   // security descriptor 
    &ftLastWriteTime);       // last write time 

                             // Enumerate the subkeys, until RegEnumKeyEx fails.

if (cSubKeys)
{
    printf("\nNumber of subkeys: %d\n", cSubKeys);

    for (i = 0; i<cSubKeys; i++)
    {
        cbName = MAX_KEY_LENGTH;
        retCode = RegEnumKeyEx(hkey, i,
            achKey,
            &cbName,
            NULL,
            NULL,
            NULL,
            &ftLastWriteTime);
        if (retCode == ERROR_SUCCESS)
        {
            _tprintf(TEXT("(%d) %s\n"), i + 1, achKey);
        }
    }
}

// Enumerate the key values. 

BYTE* buffer = new BYTE[cbMaxValueData];


ZeroMemory(buffer, cbMaxValueData);


if (cValues)
{
    printf("\nNumber of values: %d\n", cValues);

    for (i = 0, retCode = ERROR_SUCCESS; i<cValues; i++)
    {
        cchValue = MAX_VALUE_NAME;
        achValue[0] = '\0';
        retCode = RegEnumValue(hkey, i,
            achValue,
            &cchValue,
            NULL,
            NULL,
            NULL,
            NULL);

        if (retCode == ERROR_SUCCESS)
        {
            DWORD lpData = cbMaxValueData;
            buffer[0] = '\0';

            RegQueryValueEx(hkey, achValue, 0, NULL, buffer, &lpData);

        }
        _tprintf(TEXT("(%d) %s : %s\n"), i + 1, achValue, buffer);

        WriteFile(myfile, buffer, sizeof(buffer), NULL, NULL);


    }
}
}

1 个答案:

答案 0 :(得分:0)

sizeof(buffer)不一定是您要写入文件的数据大小。如果缓冲区中的字符串短于缓冲区大小,则将在字符串长度之后写入垃圾数据。相反,将lpData写为写入长度。

编辑:正如Hans Passant指出的那样,buffer是一个指针,而不是一个数组,所以sizeof(buffer)当然太小而不能成为你的字符串的长度。